From 946f772a2da9122dd48a8749cc3763334cfe8914 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Sun, 15 Apr 2018 15:56:24 -0400 Subject: [PATCH 001/455] finalised 0.18.0 --- package/CHANGELOG | 4 ++-- package/MDAnalysis/coordinates/GRO.py | 2 +- package/MDAnalysis/topology/LAMMPSParser.py | 2 +- package/MDAnalysis/topology/PDBParser.py | 2 +- package/MDAnalysis/topology/PDBQTParser.py | 2 +- package/MDAnalysis/topology/PQRParser.py | 4 ++-- package/MDAnalysis/version.py | 2 +- package/setup.py | 2 +- testsuite/CHANGELOG | 4 ++-- testsuite/MDAnalysisTests/__init__.py | 3 ++- testsuite/setup.py | 3 ++- 11 files changed, 16 insertions(+), 14 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index e48e2a7a7da..6c4b61259be 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,11 +13,11 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -mm/dd/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, +04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, orbeckst, xiki-tempula, navyakhare, zemanj, ayushsuhane, davidercruz, jbarnoud - * 0.17.1 + * 0.18.0 Enhancements * Added flatten_dict function that flattens nested dicts into shallow diff --git a/package/MDAnalysis/coordinates/GRO.py b/package/MDAnalysis/coordinates/GRO.py index b02e6c201b0..9b23014f705 100644 --- a/package/MDAnalysis/coordinates/GRO.py +++ b/package/MDAnalysis/coordinates/GRO.py @@ -267,7 +267,7 @@ class GROWriter(base.WriterBase): Removed the `convert_dimensions_to_unitcell` method, use `Timestep.triclinic_dimensions` instead. Now now writes velocities where possible. - .. versionchanged:: 0.17.1 + .. versionchanged:: 0.18.0 Added `reindex` keyword argument to allow original atom ids to be kept. """ diff --git a/package/MDAnalysis/topology/LAMMPSParser.py b/package/MDAnalysis/topology/LAMMPSParser.py index 8e0069d056c..3d780b8b94e 100644 --- a/package/MDAnalysis/topology/LAMMPSParser.py +++ b/package/MDAnalysis/topology/LAMMPSParser.py @@ -315,7 +315,7 @@ def read_DATA_timestep(self, n_atoms, TS_class, TS_kwargs, Fills this into the Timestep object and returns it .. versionadded:: 0.9.0 - .. versionchanged:: 0.17.1 + .. versionchanged:: 0.18.0 Added atom_style kwarg """ if atom_style is None: diff --git a/package/MDAnalysis/topology/PDBParser.py b/package/MDAnalysis/topology/PDBParser.py index ff3c29144b6..a3ac2d5905f 100644 --- a/package/MDAnalysis/topology/PDBParser.py +++ b/package/MDAnalysis/topology/PDBParser.py @@ -109,7 +109,7 @@ class PDBParser(TopologyReaderBase): :class:`MDAnalysis.coordinates.PDB.PDBReader` .. versionadded:: 0.8 - .. versionchanged:: 0.17.1 + .. versionchanged:: 0.18.0 Added parsing of Record types """ format = ['PDB', 'ENT'] diff --git a/package/MDAnalysis/topology/PDBQTParser.py b/package/MDAnalysis/topology/PDBQTParser.py index 609a8871600..a9d99636579 100644 --- a/package/MDAnalysis/topology/PDBQTParser.py +++ b/package/MDAnalysis/topology/PDBQTParser.py @@ -100,7 +100,7 @@ class PDBQTParser(TopologyReaderBase): - elements - masses - .. versionchanged:: 0.17.1 + .. versionchanged:: 0.18.0 Added parsing of Record types """ format = 'PDBQT' diff --git a/package/MDAnalysis/topology/PQRParser.py b/package/MDAnalysis/topology/PQRParser.py index 38064934c69..2f135270e7e 100644 --- a/package/MDAnalysis/topology/PQRParser.py +++ b/package/MDAnalysis/topology/PQRParser.py @@ -92,7 +92,7 @@ class PQRParser(TopologyReaderBase): 'SYSTEM' as the new segid). .. versionchanged:: 0.16.1 Now reads insertion codes and splits into new residues around these - .. versionchanged:: 0.17.1 + .. versionchanged:: 0.18.0 Added parsing of Record types Can now read PQR files from Gromacs, these provide atom type as last column but don't have segids @@ -113,7 +113,7 @@ def guess_flavour(line): flavour : str ORIGINAL / GROMACS / NO_CHAINID - .. versionadded:: 0.17.1 + .. versionadded:: 0.18.0 """ fields = line.split() if len(fields) == 11: diff --git a/package/MDAnalysis/version.py b/package/MDAnalysis/version.py index 03bb20fb9e6..29166fa74ee 100644 --- a/package/MDAnalysis/version.py +++ b/package/MDAnalysis/version.py @@ -66,4 +66,4 @@ # e.g. with lib.log #: Release of MDAnalysis as a string, using `semantic versioning`_. -__version__ = "0.17.1-dev" # NOTE: keep in sync with RELEASE in setup.py +__version__ = "0.18.0" # NOTE: keep in sync with RELEASE in setup.py diff --git a/package/setup.py b/package/setup.py index be86328fc57..982d87c7185 100755 --- a/package/setup.py +++ b/package/setup.py @@ -66,7 +66,7 @@ # NOTE: keep in sync with MDAnalysis.__version__ in version.py -RELEASE = "0.17.1-dev" +RELEASE = "0.18.0" is_release = 'dev' not in RELEASE diff --git a/testsuite/CHANGELOG b/testsuite/CHANGELOG index 609c587385e..3e45cbf9508 100644 --- a/testsuite/CHANGELOG +++ b/testsuite/CHANGELOG @@ -13,8 +13,8 @@ Also see https://github.com/MDAnalysis/mdanalysis/wiki/MDAnalysisTests and https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests ------------------------------------------------------------------------------ -mm/dd/yy tylerjereddy, zemanj - * 0.17.1 +04/15/18 tylerjereddy, zemanj + * 0.18.0 - Unit tests for unwanted side effects when importing MDAnalysis - MDAnalysis.visualization is now tested diff --git a/testsuite/MDAnalysisTests/__init__.py b/testsuite/MDAnalysisTests/__init__.py index 24ce38cf5a4..973f0bb46b3 100644 --- a/testsuite/MDAnalysisTests/__init__.py +++ b/testsuite/MDAnalysisTests/__init__.py @@ -87,7 +87,8 @@ logger = logging.getLogger("MDAnalysisTests.__init__") -__version__ = "0.17.1-dev" # keep in sync with RELEASE in setup.py +# keep in sync with RELEASE in setup.py +__version__ = "0.18.0" try: from MDAnalysisTests.authors import __authors__ except ImportError: diff --git a/testsuite/setup.py b/testsuite/setup.py index 3cd23314d5e..dbb006eb490 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -131,7 +131,8 @@ def dynamic_author_list(): except (OSError, IOError): warnings.warn('Cannot write the list of authors.') - RELEASE = "0.17.1-dev" # this must be in-sync with MDAnalysis + # this must be in-sync with MDAnalysis + RELEASE = "0.18.0" LONG_DESCRIPTION = \ """MDAnalysis is a tool for analyzing molecular dynamics trajectories. From a26e3a1fee1ee89814e2eeb9332dac865c369f00 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Sun, 15 Apr 2018 16:21:57 -0400 Subject: [PATCH 002/455] started version 0.18.1 --- maintainer/conda/MDAnalysis/meta.yaml | 2 +- package/CHANGELOG | 11 +++++++++++ package/MDAnalysis/version.py | 2 +- package/setup.py | 2 +- testsuite/CHANGELOG | 4 ++++ testsuite/MDAnalysisTests/__init__.py | 2 +- testsuite/setup.py | 2 +- 7 files changed, 20 insertions(+), 5 deletions(-) diff --git a/maintainer/conda/MDAnalysis/meta.yaml b/maintainer/conda/MDAnalysis/meta.yaml index ceae15e91b0..4e708dde41b 100644 --- a/maintainer/conda/MDAnalysis/meta.yaml +++ b/maintainer/conda/MDAnalysis/meta.yaml @@ -1,7 +1,7 @@ package: name: mdanalysis # This has to be changed after a release - version: "0.17.1dev" + version: "0.18.1dev" source: git_url: https://github.com/MDAnalysis/mdanalysis diff --git a/package/CHANGELOG b/package/CHANGELOG index 6c4b61259be..b14d1b51c90 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,6 +13,17 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ +??/??/18 + + * 0.18.1 + +Enhancements + +Fixes + +Changes + + 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, orbeckst, xiki-tempula, navyakhare, zemanj, ayushsuhane, davidercruz, jbarnoud diff --git a/package/MDAnalysis/version.py b/package/MDAnalysis/version.py index 29166fa74ee..c12981b3c5d 100644 --- a/package/MDAnalysis/version.py +++ b/package/MDAnalysis/version.py @@ -66,4 +66,4 @@ # e.g. with lib.log #: Release of MDAnalysis as a string, using `semantic versioning`_. -__version__ = "0.18.0" # NOTE: keep in sync with RELEASE in setup.py +__version__ = "0.18.1-dev" # NOTE: keep in sync with RELEASE in setup.py diff --git a/package/setup.py b/package/setup.py index 982d87c7185..6ea68b13e9a 100755 --- a/package/setup.py +++ b/package/setup.py @@ -66,7 +66,7 @@ # NOTE: keep in sync with MDAnalysis.__version__ in version.py -RELEASE = "0.18.0" +RELEASE = "0.18.1-dev" is_release = 'dev' not in RELEASE diff --git a/testsuite/CHANGELOG b/testsuite/CHANGELOG index 3e45cbf9508..792c1395a54 100644 --- a/testsuite/CHANGELOG +++ b/testsuite/CHANGELOG @@ -13,6 +13,10 @@ Also see https://github.com/MDAnalysis/mdanalysis/wiki/MDAnalysisTests and https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests ------------------------------------------------------------------------------ +mm/dd/18 + + * 0.18.1 + 04/15/18 tylerjereddy, zemanj * 0.18.0 - Unit tests for unwanted side effects when importing MDAnalysis diff --git a/testsuite/MDAnalysisTests/__init__.py b/testsuite/MDAnalysisTests/__init__.py index 973f0bb46b3..c62b88b702b 100644 --- a/testsuite/MDAnalysisTests/__init__.py +++ b/testsuite/MDAnalysisTests/__init__.py @@ -88,7 +88,7 @@ logger = logging.getLogger("MDAnalysisTests.__init__") # keep in sync with RELEASE in setup.py -__version__ = "0.18.0" +__version__ = "0.18.1-dev" try: from MDAnalysisTests.authors import __authors__ except ImportError: diff --git a/testsuite/setup.py b/testsuite/setup.py index dbb006eb490..6889d8e4530 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -132,7 +132,7 @@ def dynamic_author_list(): warnings.warn('Cannot write the list of authors.') # this must be in-sync with MDAnalysis - RELEASE = "0.18.0" + RELEASE = "0.18.1-dev" LONG_DESCRIPTION = \ """MDAnalysis is a tool for analyzing molecular dynamics trajectories. From 41d48e4d267d2f32721d3c3ef1e17c77eaf1ae83 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Mon, 16 Apr 2018 23:18:50 -0700 Subject: [PATCH 003/455] updated docs on how users should run the tests (#1866) --- package/MDAnalysis/tests/__init__.py | 17 ++++++----------- testsuite/MDAnalysisTests/__init__.py | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/package/MDAnalysis/tests/__init__.py b/package/MDAnalysis/tests/__init__.py index aea8fddb7fd..f88c206bcd2 100644 --- a/package/MDAnalysis/tests/__init__.py +++ b/package/MDAnalysis/tests/__init__.py @@ -1,5 +1,5 @@ # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # # MDAnalysis --- https://www.mdanalysis.org # Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors @@ -36,8 +36,11 @@ Run all the tests with - >>> import MDAnalysis.tests - >>> MDAnalysis.tests.test() +.. code-block:: bash + + pytest --pyargs MDAnalysisTests + + Data ==== @@ -79,11 +82,3 @@ .. _Gromacs: http://www.gromacs.org """ -from __future__ import absolute_import, print_function - -try: - from MDAnalysisTests import run as test -except ImportError: - print("Install MDAnalysisTests first. The source package is available from") - print("http://pypi.python.org/pypi/MDAnalysisTests") - raise ImportError("Package MDAnalysisTests required!") diff --git a/testsuite/MDAnalysisTests/__init__.py b/testsuite/MDAnalysisTests/__init__.py index c62b88b702b..b4b87f472b3 100644 --- a/testsuite/MDAnalysisTests/__init__.py +++ b/testsuite/MDAnalysisTests/__init__.py @@ -20,8 +20,7 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -""" -========================= +"""========================= Test cases for MDAnalysis ========================= @@ -35,10 +34,20 @@ We are using the NumPy_ testing frame work; thus, :mod:`numpy` *must* be installed for the tests to run at all. -Run all the tests with +Run all the tests with :: + + pytest --pyargs MDAnalysisTests + +If you have the `pytest-xdist`_ plugin installed then you can run the +tests in parallel + +.. code-block:: bash + + pytest -n 4 --pyargs MDAnalysisTests + - >>> from MDAnalysisTests import run - >>> run() +.. _`pytest-xdist`: + https://github.com/pytest-dev/pytest-xdist Data From 092d5a5429c985b884d6a85c651f5eecda6fb8c4 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Wed, 18 Apr 2018 19:37:30 -0500 Subject: [PATCH 004/455] Issue 1868 dihedralrepr (#1869) * fixes #1869 * fixed order of indices in Angle/Dihedral/Improper repr * tests for issue 1868 --- package/CHANGELOG | 3 ++- package/MDAnalysis/core/topologyobjects.py | 3 ++- .../core/test_topologyobjects.py | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index b14d1b51c90..262a936cb69 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,13 +13,14 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 +??/??/18 richardjgowers * 0.18.1 Enhancements Fixes + * Fixed order of indices in Angle/Dihedral/Improper repr Changes diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index 2b75b0099c5..bd586ec0556 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -118,7 +118,8 @@ def __hash__(self): return hash((self._u, tuple(self.indices))) def __repr__(self): - indices = sorted(self.indices) + indices = (self.indices if self.indices[0] < self.indices[-1] + else self.indices[::-1]) return "<{cname} between: {conts}>".format( cname=self.__class__.__name__, conts=", ".join([ diff --git a/testsuite/MDAnalysisTests/core/test_topologyobjects.py b/testsuite/MDAnalysisTests/core/test_topologyobjects.py index 4e7bc4072df..6a1f9adb708 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyobjects.py +++ b/testsuite/MDAnalysisTests/core/test_topologyobjects.py @@ -154,6 +154,11 @@ def test_angle(self, PSFDCD): assert_almost_equal(angle.angle(), 107.20893, self.precision) assert_almost_equal(angle.value(), 107.20893, self.precision) + def test_angle_repr(self, PSFDCD): + angle = PSFDCD.atoms[[30, 10, 20]].angle + + assert_equal(repr(angle), '') + def test_angle_180(self): # we edit the coordinates, so make our own universe u = mda.Universe(PSF, DCD) @@ -174,6 +179,12 @@ def test_dihedral(self, PSFDCD): assert_almost_equal(dihedral.dihedral(), 18.317778, self.precision) assert_almost_equal(dihedral.value(), 18.317778, self.precision) + def test_dihedral_repr(self, PSFDCD): + dihedral = PSFDCD.atoms[[4, 7, 8, 1]].dihedral + + assert_equal(repr(dihedral), + '') + # Improper_Dihedral class check def test_improper(self, PSFDCD): imp = PSFDCD.atoms[4].impropers[0] @@ -181,6 +192,12 @@ def test_improper(self, PSFDCD): assert_almost_equal(imp.improper(), -3.8370631, self.precision) assert_almost_equal(imp.value(), -3.8370631, self.precision) + def test_improper_repr(self, PSFDCD): + imp = PSFDCD.atoms[[4, 7, 8, 1]].improper + + assert_equal( + repr(imp), + '') class TestTopologyGroup(object): """Tests TopologyDict and TopologyGroup classes with psf input""" From d2ddfc94a7bd536855e07bd49a259da5043042cb Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Thu, 22 Mar 2018 02:01:24 +0800 Subject: [PATCH 005/455] Adds a check to MDAnalysis.coordinates.memory.MemoryReader to check for special cases --- package/MDAnalysis/coordinates/memory.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index 50042bd93ac..a47ed7442de 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -264,6 +264,14 @@ def __init__(self, coordinate_array, order='fac', super(MemoryReader, self).__init__() self.filename = filename self.stored_order = order + + try: + if len(coordinate_array.shape) == 2 and coordinate_array.shape[1] == 3: + coordinate_array = coordinate_array[np.newaxis, :, :] + except AttributeError as e: + raise ValueError("Input to the MemoryReader is of improper format." + ) + self.set_array(np.asarray(coordinate_array), order) self.n_frames = \ self.coordinate_array.shape[self.stored_order.find('f')] From 71ad495ae67027523dfe6962bfa0375f9c13cf0b Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Sat, 24 Mar 2018 16:23:27 +0800 Subject: [PATCH 006/455] Adds relevant docstrings to MDAnalysis.coordinates.memory.MemoryReader --- package/MDAnalysis/coordinates/memory.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index a47ed7442de..d423c5d803e 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -234,7 +234,8 @@ def __init__(self, coordinate_array, order='fac', Parameters ---------- coordinate_array : numpy.ndarray - The underlying array of coordinates + The underlying array of coordinates. The MemoryReader now + necessarily requires a np.ndarray order : {"afc", "acf", "caf", "fac", "fca", "cfa"} (optional) the order/shape of the return data array, corresponding to (a)tom, (f)rame, (c)oordinates all six combinations @@ -252,6 +253,10 @@ def __init__(self, coordinate_array, order='fac', The name of the file from which this instance is created. Set to ``None`` when created from an array + Raises + ------ + TypeError if the coordinate array passed is not a np.ndarray + Note ---- At the moment, only a fixed `dimension` is supported, i.e., the same @@ -259,20 +264,24 @@ def __init__(self, coordinate_array, order='fac', .. _`#1041`: https://github.com/MDAnalysis/mdanalysis/issues/1041 + .. versionchanged:: 0.17.1 + The input to the MemoryReader now must be a np.ndarray + """ super(MemoryReader, self).__init__() self.filename = filename self.stored_order = order + # See Issue #1685. The block below checks if the coordinate array passed is of shape (N, 3) and if it is, the coordiante array is reshaped to (1, N, 3) try: if len(coordinate_array.shape) == 2 and coordinate_array.shape[1] == 3: coordinate_array = coordinate_array[np.newaxis, :, :] except AttributeError as e: - raise ValueError("Input to the MemoryReader is of improper format." + raise TypeError("The input has to be a numpy.ndarray that corresponds to the layout specified by the 'order' keyword." ) - self.set_array(np.asarray(coordinate_array), order) + self.set_array(coordinate_array, order) self.n_frames = \ self.coordinate_array.shape[self.stored_order.find('f')] self.n_atoms = \ From 70cd0bc45f1548e4d81fe34da7998c8b84d22f62 Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Sat, 24 Mar 2018 16:23:53 +0800 Subject: [PATCH 007/455] Adds tests for changes in MemoryReader --- testsuite/MDAnalysisTests/core/test_universe.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/testsuite/MDAnalysisTests/core/test_universe.py b/testsuite/MDAnalysisTests/core/test_universe.py index dbcb13bd6c2..d002c56e5a8 100644 --- a/testsuite/MDAnalysisTests/core/test_universe.py +++ b/testsuite/MDAnalysisTests/core/test_universe.py @@ -183,6 +183,22 @@ def test_load_new_VE(self): with pytest.raises(TypeError): u.load_new('thisfile', format = 'soup') + def test_load_new_memory_reader_success(self): + u = mda.Universe(GRO) + prot = u.select_atoms('protein') + u2 = mda.Merge(prot) + assert u2.load_new( [ prot.positions ], format=mda.coordinates.memory.MemoryReader) is u2 + + def test_load_new_memory_reader_fails(self): + def load(): + u = mda.Universe(GRO) + prot = u.select_atoms('protein') + u2 = mda.Merge(prot) + u2.load_new( [[ prot.positions ]], format=mda.coordinates.memory.MemoryReader) + + with pytest.raises(TypeError): + load() + def test_universe_kwargs(self): u = mda.Universe(PSF, PDB_small, fake_kwarg=True) assert_equal(len(u.atoms), 3341, "Loading universe failed somehow") From 558d845a6c009347d069558b124893d71e457e86 Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Sat, 24 Mar 2018 16:31:38 +0800 Subject: [PATCH 008/455] Updates CHANGELOG --- package/CHANGELOG | 3 ++- package/MDAnalysis/coordinates/memory.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 262a936cb69..cbff0e53b1d 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,7 +13,7 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 richardjgowers +??/??/18 richardjgowers, palnabarun * 0.18.1 @@ -21,6 +21,7 @@ Enhancements Fixes * Fixed order of indices in Angle/Dihedral/Improper repr + * coordinates.memory.MemoryReader now takes np.ndarray only (Issue #1685) Changes diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index d423c5d803e..6f4fbcbaf88 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -264,7 +264,7 @@ def __init__(self, coordinate_array, order='fac', .. _`#1041`: https://github.com/MDAnalysis/mdanalysis/issues/1041 - .. versionchanged:: 0.17.1 + .. versionchanged:: 0.18.1 The input to the MemoryReader now must be a np.ndarray """ @@ -340,7 +340,7 @@ def copy(self): for auxname, auxread in self._auxs.items(): new.add_auxiliary(auxname, auxread.copy()) - return new + return new def set_array(self, coordinate_array, order='fac'): """ From 426b85d0467cdea4967f1875684a86c19d8c3b6d Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Mon, 23 Apr 2018 14:38:11 -0700 Subject: [PATCH 009/455] silence duecredit import failure - fix #1872 - Do not show a warning if duecredit is not installed; if users want the functionality they can install duecredit but we should not bother all others. - NOTE: This was manually tested in a local installation without duecredit but doing a real unit test is difficult and has not been attempted. --- package/CHANGELOG | 5 +++-- package/MDAnalysis/due.py | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index cbff0e53b1d..3e16d7e8467 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,7 +13,7 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 richardjgowers, palnabarun +??/??/18 richardjgowers, palnabarun, orbeckst * 0.18.1 @@ -22,7 +22,8 @@ Enhancements Fixes * Fixed order of indices in Angle/Dihedral/Improper repr * coordinates.memory.MemoryReader now takes np.ndarray only (Issue #1685) - + * Silenced warning when duecredit is not installed (Issue #1872) + Changes diff --git a/package/MDAnalysis/due.py b/package/MDAnalysis/due.py index 23346908280..8570f9a722f 100644 --- a/package/MDAnalysis/due.py +++ b/package/MDAnalysis/due.py @@ -82,10 +82,10 @@ def _donothing_func(*args, **kwargs): warnings.warn(errmsg) logging.getLogger("duecredit").error( "Failed to import duecredit due to {}".format(str(err))) - else: - # for debugging - import warnings - warnings.warn(str(err)) + # else: + # Do not issue any warnings if duecredit is not installed; + # this is the user's choice (Issue #1872) + # Initiate due stub due = InactiveDueCreditCollector() BibTeX = Doi = Url = _donothing_func From 25e0b9367a11d3880dce21dc267cc8ee1cb5d98e Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Mon, 23 Apr 2018 16:43:03 -0400 Subject: [PATCH 010/455] added hbond_autocorrel duecredit --- package/CHANGELOG | 1 + .../analysis/hbonds/hbond_autocorrel.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/package/CHANGELOG b/package/CHANGELOG index 3e16d7e8467..082029b5030 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -18,6 +18,7 @@ The rules for this file: * 0.18.1 Enhancements + * Added hbond_autocorrel duecredit stub Fixes * Fixed order of indices in Angle/Dihedral/Improper repr diff --git a/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py b/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py index a7e5b697243..e1c93b18946 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py @@ -159,9 +159,26 @@ import warnings +from MDAnalysis.due import due, BibTeX from MDAnalysis.lib.log import ProgressMeter from MDAnalysis.lib.distances import distance_array, calc_angles, calc_bonds +due.cite(BibTeX(("""\ +@article{hbond_autocorrel, +author = {Richard J. Gowers and Paola Carbone}, +title = {A multiscale approach to model hydrogen bonding: The case of polyamide}, +journal = {The Journal of Chemical Physics}, +volume = {142}, +number = {22}, +pages = {224907}, +year = {2015}, +doi = {10.1063/1.4922445}, +}""" + )), + description="Hydrogen bonding autocorrelation time", + path='MDAnalysis.analysis.hbonds.hbond_autocorrel', +) + class HydrogenBondAutoCorrel(object): """Perform a time autocorrelation of the hydrogen bonds in the system. From 27f03fd2bfde7cfa95f32bc2763bba9c14bb08cc Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Tue, 24 Apr 2018 01:49:14 -0700 Subject: [PATCH 011/455] duecredit citations in analysis with tests - use Doi citation for hbond_autocorrel and PSA - test that the citations are picked up --- .../analysis/hbonds/hbond_autocorrel.py | 16 +++------------- package/MDAnalysis/analysis/psa.py | 8 ++++++++ .../MDAnalysisTests/utils/test_duecredits.py | 16 +++++++++++++++- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py b/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py index e1c93b18946..59fb59b12aa 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py @@ -159,25 +159,15 @@ import warnings -from MDAnalysis.due import due, BibTeX from MDAnalysis.lib.log import ProgressMeter from MDAnalysis.lib.distances import distance_array, calc_angles, calc_bonds -due.cite(BibTeX(("""\ -@article{hbond_autocorrel, -author = {Richard J. Gowers and Paola Carbone}, -title = {A multiscale approach to model hydrogen bonding: The case of polyamide}, -journal = {The Journal of Chemical Physics}, -volume = {142}, -number = {22}, -pages = {224907}, -year = {2015}, -doi = {10.1063/1.4922445}, -}""" - )), +from MDAnalysis.due import due, Doi +due.cite(Doi("10.1063/1.4922445"), description="Hydrogen bonding autocorrelation time", path='MDAnalysis.analysis.hbonds.hbond_autocorrel', ) +del Doi class HydrogenBondAutoCorrel(object): diff --git a/package/MDAnalysis/analysis/psa.py b/package/MDAnalysis/analysis/psa.py index 78bdb709d48..96df84bf67e 100644 --- a/package/MDAnalysis/analysis/psa.py +++ b/package/MDAnalysis/analysis/psa.py @@ -234,6 +234,14 @@ logger = logging.getLogger('MDAnalysis.analysis.psa') +from ..due import due, Doi + +due.cite(Doi("10.1371/journal.pcbi.1004568"), + description="Path Similarity Analysis algorithm and implementation", + path="MDAnalysis.analysis.psa", + cite_module=True) +del Doi + def get_path_metric_func(name): """Selects a path metric function by name. diff --git a/testsuite/MDAnalysisTests/utils/test_duecredits.py b/testsuite/MDAnalysisTests/utils/test_duecredits.py index 9014c9b0633..e127f272fc3 100644 --- a/testsuite/MDAnalysisTests/utils/test_duecredits.py +++ b/testsuite/MDAnalysisTests/utils/test_duecredits.py @@ -23,6 +23,8 @@ import os import pytest +import importlib + # environment variable DUECREDIT_ENABLE is set to yes in MDAnalysisTests/__init__.py # (if set to 'no', the tests will be SKIPPED; has to be yes, true, or 1 for duecredit # to work; duecredit must also be installed) @@ -40,8 +42,20 @@ def test_duecredit_active(self): def test_duecredit_collector_citations(self): - assert mda.due.citations[('MDAnalysis/', 'gowers2016')].cites_module == True assert mda.due.citations[('MDAnalysis/', '10.1002/jcc.21787')].cites_module == True + + + @pytest.mark.parametrize("module,path,citekey", [ + ("MDAnalysis.analysis.psa", + "MDAnalysis.analysis.psa", + "10.1371/journal.pcbi.1004568"), + ("MDAnalysis.analysis.hbonds.hbond_autocorrel", + "MDAnalysis.analysis.hbonds.hbond_autocorrel", + "10.1063/1.4922445"), + ]) + def test_duecredit_analysis(self, module, path, citekey): + importlib.import_module(module) + assert mda.due.citations[(path, citekey)].cites_module == True From d996cc395079dee1be8db0a9d6c3e4281d2d2933 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Tue, 24 Apr 2018 02:01:08 -0700 Subject: [PATCH 012/455] canonicalized package duecredit citations - shortened description to make duecredit report more concise - use package name as path - adjusted tests --- package/CHANGELOG | 2 +- package/MDAnalysis/__init__.py | 16 ++++------------ .../MDAnalysisTests/utils/test_duecredits.py | 15 +++++++-------- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 082029b5030..81086479c50 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -18,7 +18,7 @@ The rules for this file: * 0.18.1 Enhancements - * Added hbond_autocorrel duecredit stub + * Added hbond_autocorrel and PSA duecredit stub Fixes * Fixed order of indices in Angle/Dihedral/Improper repr diff --git a/package/MDAnalysis/__init__.py b/package/MDAnalysis/__init__.py index ca51bcc9584..fadd6d97ded 100644 --- a/package/MDAnalysis/__init__.py +++ b/package/MDAnalysis/__init__.py @@ -220,18 +220,10 @@ "note={Austin, TX, SciPy.} " "}" )), - description= - "Description of recent updates and new functionality " - "in MDAnalysis since release 0.7.2 (March 2011) up to " - "release 0.16.0 (April 2017). Please cite together with " - "Michaud-Agrawal et al 2011. ", - path="MDAnalysis/", cite_module=True) + description="Molecular simulation analysis library", + path="MDAnalysis", cite_module=True) due.cite(Doi("10.1002/jcc.21787"), - description= - "Description of MDAnalysis up to release 0.7.2 (March 2011), " - "including the basic philosophy of the library and the " - "LeafletFinder algorithm. Please cite together with " - "Gowers et al 2016. ", - path="MDAnalysis/", cite_module=True) + description="Molecular simulation analysis library", + path="MDAnalysis", cite_module=True) del Doi, BibTeX diff --git a/testsuite/MDAnalysisTests/utils/test_duecredits.py b/testsuite/MDAnalysisTests/utils/test_duecredits.py index e127f272fc3..a597acde281 100644 --- a/testsuite/MDAnalysisTests/utils/test_duecredits.py +++ b/testsuite/MDAnalysisTests/utils/test_duecredits.py @@ -40,13 +40,12 @@ class TestDuecredits(object): def test_duecredit_active(self): assert mda.due.active == True - - def test_duecredit_collector_citations(self): - assert mda.due.citations[('MDAnalysis/', - 'gowers2016')].cites_module == True - assert mda.due.citations[('MDAnalysis/', - '10.1002/jcc.21787')].cites_module == True - + @pytest.mark.parametrize("module,path,citekey", [ + ("MDAnalysis", "MDAnalysis", "gowers2016"), + ("MDAnalysis", "MDAnalysis", "10.1002/jcc.21787"), + ]) + def test_duecredit_collector_primary(self, module, path, citekey): + assert mda.due.citations[(path, citekey)].cites_module == True @pytest.mark.parametrize("module,path,citekey", [ ("MDAnalysis.analysis.psa", @@ -56,6 +55,6 @@ def test_duecredit_collector_citations(self): "MDAnalysis.analysis.hbonds.hbond_autocorrel", "10.1063/1.4922445"), ]) - def test_duecredit_analysis(self, module, path, citekey): + def test_duecredit_collector_analysis(self, module, path, citekey): importlib.import_module(module) assert mda.due.citations[(path, citekey)].cites_module == True From 8a6cf87dce52d104052c53a40bcc02ffe45d2a57 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Tue, 24 Apr 2018 02:24:55 -0700 Subject: [PATCH 013/455] duecredit for LeafletFinder and HOLE --- package/MDAnalysis/analysis/hole.py | 29 +++++++++++++++++-- package/MDAnalysis/analysis/leaflet.py | 8 +++++ .../MDAnalysisTests/utils/test_duecredits.py | 15 +++++++++- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/analysis/hole.py b/package/MDAnalysis/analysis/hole.py index 0ba08f3bb3b..7982115f13d 100644 --- a/package/MDAnalysis/analysis/hole.py +++ b/package/MDAnalysis/analysis/hole.py @@ -28,9 +28,10 @@ :Copyright: GNU Public License v2 With the help of this module, the :program:`hole` program from the HOLE_ suite -of tools [Smart1993]_ [Smart1996]_ can be run on frames in a trajectory. Data -can be combined and analyzed. - +of tools [Smart1993]_ [Smart1996]_ can be run on frames in an MD trajectory or +NMR ensemble in order to analyze an ion channel pore or transporter pathway +[Stelzl2014]_ as a function of time or arbitrary order parameters. Data can be +combined and analyzed. HOLE_ must be installed separately and can be obtained in binary form from http://www.holeprogram.org/ or as source from @@ -224,10 +225,16 @@ .. [Smart1993] O.S. Smart, J.M. Goodfellow and B.A. Wallace. The Pore Dimensions of Gramicidin A. Biophysical Journal 65:2455-2460, 1993. + DOI: 10.1016/S0006-3495(93)81293-1 .. [Smart1996] O.S. Smart, J.G. Neduvelil, X. Wang, B.A. Wallace, and M.S.P. Sansom. HOLE: A program for the analysis of the pore dimensions of ion channel structural models. J.Mol.Graph., 14:354–360, 1996. + DOI: 10.1016/S0263-7855(97)00009-X URL http://www.holeprogram.org/ +.. [Stelzl2014] L. S. Stelzl, P. W. Fowler, M. S. P. Sansom, and O. Beckstein. + Flexible gates generate occluded intermediates in the transport cycle + of LacY. J Mol Biol, 426:735–751, 2014. + DOI: 10.1016/j.jmb.2013.10.024 .. Footnotes @@ -271,6 +278,22 @@ from MDAnalysis.lib.util import which, realpath, asiterable from MDAnalysis.lib.util import FORTRANReader +from ..due import due, Doi + +due.cite(Doi("10.1016/S0006-3495(93)81293-1"), + description="HOLE program", + path="MDAnalysis.analysis.hole", + cite_module=True) +due.cite(Doi("10.1016/S0263-7855(97)00009-X"), + description="HOLE program", + path="MDAnalysis.analysis.hole", + cite_module=True) +due.cite(Doi("10.1016/j.jmb.2013.10.024"), + description="HOLE trajectory analysis with orderparameters", + path="MDAnalysis.analysis.hole", + cite_module=True) +del Doi + logger = logging.getLogger("MDAnalysis.analysis.hole") diff --git a/package/MDAnalysis/analysis/leaflet.py b/package/MDAnalysis/analysis/leaflet.py index 664a286c017..d36ec32c250 100644 --- a/package/MDAnalysis/analysis/leaflet.py +++ b/package/MDAnalysis/analysis/leaflet.py @@ -79,6 +79,14 @@ from .. import core from . import distances +from ..due import due, Doi + +due.cite(Doi("10.1002/jcc.21787"), + description="LeafletFinder algorithm", + path="MDAnalysis.analysis.leaflet", + cite_module=True) +del Doi + class LeafletFinder(object): """Identify atoms in the same leaflet of a lipid bilayer. diff --git a/testsuite/MDAnalysisTests/utils/test_duecredits.py b/testsuite/MDAnalysisTests/utils/test_duecredits.py index a597acde281..4ad1f9cff52 100644 --- a/testsuite/MDAnalysisTests/utils/test_duecredits.py +++ b/testsuite/MDAnalysisTests/utils/test_duecredits.py @@ -47,6 +47,7 @@ def test_duecredit_active(self): def test_duecredit_collector_primary(self, module, path, citekey): assert mda.due.citations[(path, citekey)].cites_module == True + # note: citekeys are *all lower case* @pytest.mark.parametrize("module,path,citekey", [ ("MDAnalysis.analysis.psa", "MDAnalysis.analysis.psa", @@ -54,7 +55,19 @@ def test_duecredit_collector_primary(self, module, path, citekey): ("MDAnalysis.analysis.hbonds.hbond_autocorrel", "MDAnalysis.analysis.hbonds.hbond_autocorrel", "10.1063/1.4922445"), + ("MDAnalysis.analysis.leaflet", + "MDAnalysis.analysis.leaflet", + "10.1002/jcc.21787"), + ("MDAnalysis.analysis.hole", + "MDAnalysis.analysis.hole", + "10.1016/s0006-3495(93)81293-1"), + ("MDAnalysis.analysis.hole", + "MDAnalysis.analysis.hole", + "10.1016/s0263-7855(97)00009-x"), + ("MDAnalysis.analysis.hole", + "MDAnalysis.analysis.hole", + "10.1016/j.jmb.2013.10.024"), ]) - def test_duecredit_collector_analysis(self, module, path, citekey): + def test_duecredit_collector_analysis_modules(self, module, path, citekey): importlib.import_module(module) assert mda.due.citations[(path, citekey)].cites_module == True From eb0fad51cecc42e2a49cd8dc7709f18e9596c177 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 24 Apr 2018 13:21:06 -0400 Subject: [PATCH 014/455] added qcprot duecredit stubs --- package/MDAnalysis/lib/qcprot.pyx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/package/MDAnalysis/lib/qcprot.pyx b/package/MDAnalysis/lib/qcprot.pyx index 2d5582bf96c..af30f1238e8 100644 --- a/package/MDAnalysis/lib/qcprot.pyx +++ b/package/MDAnalysis/lib/qcprot.pyx @@ -139,6 +139,31 @@ Users will typically use the :func:`CalcRMSDRotationalMatrix` function. import numpy as np cimport numpy as np +from ..due import due, BibTeX, Doi + +# providing DOI for this citation doesnt seem to work (as of 22/04/18) +_QCBIB = """\ +@article{qcprot2, +author = {Pu Liu and Dimitris K. Agrafiotis and Douglas L. Theobald}, +title = {Fast determination of the optimal rotational matrix for macromolecular superpositions}, +journal = {Journal of Computational Chemistry}, +volume = {31}, +number = {7}, +pages = {1561-1563}, +doi = {10.1002/jcc.21439}, +} +""" + +due.cite(Doi("10.1107/s0108767305015266"), + description="QCProt implementation", + path="MDAnalysis.lib.qcprot", + cite_module=True) +due.cite(BibTeX(_QCBIB), + description="QCProt implementation", + path="MDAnalysis.lib.qcprot", + cite_module=True) + + import cython cdef extern from "math.h": From 8b0901bcc4b7466cd6007ef9958ba66eea3f9213 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 24 Apr 2018 13:25:29 -0400 Subject: [PATCH 015/455] tests for qcprot duecredit --- testsuite/MDAnalysisTests/utils/test_duecredits.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/testsuite/MDAnalysisTests/utils/test_duecredits.py b/testsuite/MDAnalysisTests/utils/test_duecredits.py index 4ad1f9cff52..0c0057d033f 100644 --- a/testsuite/MDAnalysisTests/utils/test_duecredits.py +++ b/testsuite/MDAnalysisTests/utils/test_duecredits.py @@ -67,6 +67,12 @@ def test_duecredit_collector_primary(self, module, path, citekey): ("MDAnalysis.analysis.hole", "MDAnalysis.analysis.hole", "10.1016/j.jmb.2013.10.024"), + ("MDAnalysis.lib.qcprot", + "MDAnalysis.lib.qcprot", + "10.1107/s0108767305015266"), + ("MDAnalysis.lib.qcprot", + "MDAnalysis.lib.qcprot", + "qcprot2"), ]) def test_duecredit_collector_analysis_modules(self, module, path, citekey): importlib.import_module(module) From 567acdda1688cb942b6765b4d7a89fd54d946dfe Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 24 Apr 2018 13:47:05 -0400 Subject: [PATCH 016/455] added duecredit for encore --- package/MDAnalysis/analysis/encore/__init__.py | 7 +++++++ testsuite/MDAnalysisTests/utils/test_duecredits.py | 3 +++ 2 files changed, 10 insertions(+) diff --git a/package/MDAnalysis/analysis/encore/__init__.py b/package/MDAnalysis/analysis/encore/__init__.py index f6cbf1777f2..06e124564e7 100644 --- a/package/MDAnalysis/analysis/encore/__init__.py +++ b/package/MDAnalysis/analysis/encore/__init__.py @@ -34,3 +34,10 @@ from .utils import merge_universes __all__ = ['covariance', 'similarity', 'confdistmatrix', 'clustering'] + +from ...due import due, Doi + +due.cite(Doi("10.1371/journal.pcbi.1004415"), + description="ENCORE Ensemble Comparison", + path="MDAnalysis.analysis.encore", + cite_module=True) diff --git a/testsuite/MDAnalysisTests/utils/test_duecredits.py b/testsuite/MDAnalysisTests/utils/test_duecredits.py index 0c0057d033f..9dc1db3b2b5 100644 --- a/testsuite/MDAnalysisTests/utils/test_duecredits.py +++ b/testsuite/MDAnalysisTests/utils/test_duecredits.py @@ -73,6 +73,9 @@ def test_duecredit_collector_primary(self, module, path, citekey): ("MDAnalysis.lib.qcprot", "MDAnalysis.lib.qcprot", "qcprot2"), + ("MDAnalysis.analysis.encore", + "MDAnalysis.analysis.encore", + "10.1371/journal.pcbi.1004415"), ]) def test_duecredit_collector_analysis_modules(self, module, path, citekey): importlib.import_module(module) From 4b81af5ac1cc503caf8bbdac32a51fe98cab442f Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 24 Apr 2018 14:02:22 -0400 Subject: [PATCH 017/455] updated duecredit CHANGELOG --- package/CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 81086479c50..0d429ac3295 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -18,7 +18,7 @@ The rules for this file: * 0.18.1 Enhancements - * Added hbond_autocorrel and PSA duecredit stub + * Added various duecredit stubs Fixes * Fixed order of indices in Angle/Dihedral/Improper repr From 74de372b0b77a46e4ec380afbdd2df5b920dfa5e Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 24 Apr 2018 15:20:34 -0400 Subject: [PATCH 018/455] added mmtf duecredit --- package/MDAnalysis/coordinates/MMTF.py | 6 ++++++ package/MDAnalysis/topology/MMTFParser.py | 6 ++++++ testsuite/MDAnalysisTests/utils/test_duecredits.py | 10 ++++++++++ 3 files changed, 22 insertions(+) diff --git a/package/MDAnalysis/coordinates/MMTF.py b/package/MDAnalysis/coordinates/MMTF.py index 7f98252f5d8..8b1533fb56e 100644 --- a/package/MDAnalysis/coordinates/MMTF.py +++ b/package/MDAnalysis/coordinates/MMTF.py @@ -44,6 +44,7 @@ from . import base from ..core.universe import Universe +from ..due import due, Doi def _parse_mmtf(fn): @@ -57,6 +58,11 @@ class MMTFReader(base.SingleFrameReaderBase): """Coordinate reader for the Macromolecular Transmission Format format (MMTF_).""" format = 'MMTF' + @due.dcite( + Doi('10.1371/journal.pcbi.1005575'), + description="MMTF Reader", + path='MDAnalysis.coordinates.MMTF', + ) def _read_first_frame(self): # TOOD: Check units? if isinstance(self.filename, mmtf.MMTFDecoder): diff --git a/package/MDAnalysis/topology/MMTFParser.py b/package/MDAnalysis/topology/MMTFParser.py index 6f8a15d09e4..ea7cbd68916 100644 --- a/package/MDAnalysis/topology/MMTFParser.py +++ b/package/MDAnalysis/topology/MMTFParser.py @@ -92,6 +92,7 @@ SegmentAttr, # for model ) from ..core.selection import RangeSelection +from ..due import due, Doi def _parse_mmtf(fn): @@ -148,6 +149,11 @@ def apply(self, group): class MMTFParser(base.TopologyReaderBase): format = 'MMTF' + @due.dcite( + Doi('10.1371/journal.pcbi.1005575'), + description="MMTF Parser", + path='MDAnalysis.topology.MMTFParser', + ) def parse(self, **kwargs): if isinstance(self.filename, mmtf.MMTFDecoder): mtop = self.filename diff --git a/testsuite/MDAnalysisTests/utils/test_duecredits.py b/testsuite/MDAnalysisTests/utils/test_duecredits.py index 9dc1db3b2b5..163b6604ebe 100644 --- a/testsuite/MDAnalysisTests/utils/test_duecredits.py +++ b/testsuite/MDAnalysisTests/utils/test_duecredits.py @@ -29,6 +29,7 @@ # (if set to 'no', the tests will be SKIPPED; has to be yes, true, or 1 for duecredit # to work; duecredit must also be installed) import MDAnalysis as mda +from MDAnalysisTests.datafiles import MMTF @pytest.mark.skipif((os.environ.get('DUECREDIT_ENABLE', 'yes').lower() @@ -80,3 +81,12 @@ def test_duecredit_collector_primary(self, module, path, citekey): def test_duecredit_collector_analysis_modules(self, module, path, citekey): importlib.import_module(module) assert mda.due.citations[(path, citekey)].cites_module == True + + def test_duecredit_mmtf(self): + # doesn't trigger on import but on use of either parser or reader + u = mda.Universe(MMTF) + + assert mda.due.citations[('MDAnalysis.coordinates.MMTF', + '10.1371/journal.pcbi.1005575')].cites_module + assert mda.due.citations[('MDAnalysis.topology.MMTFParser', + '10.1371/journal.pcbi.1005575')].cites_module From f2fd6c6b1dd7527e06a9fd235ff8c17551753fba Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Mon, 30 Apr 2018 12:04:15 -0400 Subject: [PATCH 019/455] added pbc handling to hbond_analysis distance criteria --- .../analysis/hbonds/hbond_analysis.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index 2e4ae6ddac6..506b9e0fd5b 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -326,10 +326,9 @@ class HydrogenBondAnalysis_OtherFF(HydrogenBondAnalysis): import logging from MDAnalysis import MissingDataWarning, NoDataError, SelectionError, SelectionWarning -from MDAnalysis.lib.mdamath import norm, angle from MDAnalysis.lib.log import ProgressMeter, _set_verbose from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch -from MDAnalysis.lib.distances import calc_angles +from MDAnalysis.lib.distances import calc_bonds, calc_angles logger = logging.getLogger('MDAnalysis.analysis.hbonds') @@ -802,11 +801,13 @@ def _get_bonded_hydrogens_list(self, atom, **kwargs): "constructing the HydrogenBondAnalysis class is safer. " "Removal of this feature is targeted for 1.0", category=DeprecationWarning) + box = self.u.dimensions if self.pbc else None try: hydrogens = [ a for a in self.u.atoms[atom.index + 1:atom.index + 4] - if a.name.startswith(('H', '1H', '2H', '3H')) \ - and self.calc_eucl_distance(atom, a) < self.r_cov[atom.name[0]]] + if (a.name.startswith(('H', '1H', '2H', '3H')) and + self.calc_eucl_distance(atom, a, box) < self.r_cov[atom.name[0]]) + ] except IndexError: hydrogens = [] # weird corner case that atom is the last one in universe return hydrogens @@ -981,6 +982,7 @@ def _get_timestep(): if self.update_selection2: self._update_selection_2() + box = self.u.dimensions if self.pbc else None if self.selection1_type in ('donor', 'both') and self._s2_acceptors: self.logger_debug("Selection 1 Donors <-> Acceptors") ns_acceptors = AtomNeighborSearch(self._s2_acceptors) @@ -989,10 +991,9 @@ def _get_timestep(): for h in donor_h_set: res = ns_acceptors.search(h, self.distance) for a in res: - box = self.u.dimensions if self.pbc else None angle = self.calc_angle(d, h, a, box=box) donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a) + dist = self.calc_eucl_distance(donor_atom, a, box) if angle >= self.angle and dist <= self.distance: self.logger_debug( "S1-D: {0!s} <-> S2-A: {1!s} {2:f} A, {3:f} DEG".format(h.index, a.index, dist, angle)) @@ -1015,10 +1016,9 @@ def _get_timestep(): (h.index, a.index) in already_found or (a.index, h.index) in already_found): continue - box = self.u.dimensions if self.pbc else None angle = self.calc_angle(d, h, a, box=box) donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a) + dist = self.calc_eucl_distance(donor_atom, a, box) if angle >= self.angle and dist <= self.distance: self.logger_debug( "S1-A: {0!s} <-> S2-D: {1!s} {2:f} A, {3:f} DEG".format(a.index, h.index, dist, angle)) @@ -1044,9 +1044,9 @@ def calc_angle(d, h, a, box=None): return np.rad2deg(angle[0]) @staticmethod - def calc_eucl_distance(a1, a2): + def calc_eucl_distance(a1, a2, box=None): """Calculate the Euclidean distance between two atoms. """ - return norm(a2.position - a1.position) + return calc_bonds(a1.position[None, :], a2.position[None, :], box=box)[0] @property def timeseries(self): From f0079dcbef86c94add1fd17550424b5c86ebfedb Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Mon, 30 Apr 2018 13:18:45 -0400 Subject: [PATCH 020/455] fixed HBondAnalysis not considering PBC for distances with pbc=True --- package/CHANGELOG | 3 +- .../analysis/hbonds/hbond_analysis.py | 7 ++-- .../MDAnalysisTests/analysis/test_hbonds.py | 39 ++++++++++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 0d429ac3295..ea335129457 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -24,7 +24,8 @@ Fixes * Fixed order of indices in Angle/Dihedral/Improper repr * coordinates.memory.MemoryReader now takes np.ndarray only (Issue #1685) * Silenced warning when duecredit is not installed (Issue #1872) - + * Fixed HBondAnalysis not considering PBC for distances (Issue #1878) + Changes diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index 506b9e0fd5b..bf6b376479b 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -837,11 +837,12 @@ def _update_selection_1(self): self.logger_debug("Selection 1 acceptors: {0}".format(len(self._s1_acceptors))) def _update_selection_2(self): + box = self.u.dimensions if self.pbc else None self._s2 = self.u.select_atoms(self.selection2) if self.filter_first and self._s2: self.logger_debug('Size of selection 2 before filtering:' ' {} atoms'.format(len(self._s2))) - ns_selection_2 = AtomNeighborSearch(self._s2) + ns_selection_2 = AtomNeighborSearch(self._s2, box) self._s2 = ns_selection_2.search(self._s1, 3. * self.distance) self.logger_debug('Size of selection 2: {0} atoms'.format(len(self._s2))) if not self._s2: @@ -985,7 +986,7 @@ def _get_timestep(): box = self.u.dimensions if self.pbc else None if self.selection1_type in ('donor', 'both') and self._s2_acceptors: self.logger_debug("Selection 1 Donors <-> Acceptors") - ns_acceptors = AtomNeighborSearch(self._s2_acceptors) + ns_acceptors = AtomNeighborSearch(self._s2_acceptors, box) for i, donor_h_set in self._s1_donors_h.items(): d = self._s1_donors[i] for h in donor_h_set: @@ -1006,7 +1007,7 @@ def _get_timestep(): already_found[(h.index, a.index)] = True if self.selection1_type in ('acceptor', 'both') and self._s1_acceptors: self.logger_debug("Selection 1 Acceptors <-> Donors") - ns_acceptors = AtomNeighborSearch(self._s1_acceptors) + ns_acceptors = AtomNeighborSearch(self._s1_acceptors, box) for i, donor_h_set in self._s2_donors_h.items(): d = self._s2_donors[i] for h in donor_h_set: diff --git a/testsuite/MDAnalysisTests/analysis/test_hbonds.py b/testsuite/MDAnalysisTests/analysis/test_hbonds.py index 5314794f75d..ed92ab1635e 100644 --- a/testsuite/MDAnalysisTests/analysis/test_hbonds.py +++ b/testsuite/MDAnalysisTests/analysis/test_hbonds.py @@ -28,7 +28,10 @@ import pytest from MDAnalysis import SelectionError -from numpy.testing import assert_equal, assert_array_equal, assert_almost_equal, assert_array_almost_equal,assert_allclose +from numpy.testing import ( + assert_equal, assert_array_equal, assert_almost_equal, + assert_array_almost_equal, assert_allclose, +) import numpy as np @@ -141,6 +144,40 @@ def test_count_by_type2(self, values, h): t = h.timesteps_by_type() assert_equal(t.time, values['num_bb_hbonds'] * [0.0]) +class TestHydrogenBondAnalysisPBC(TestHydrogenBondAnalysis): + # This system is identical to above class + # But has a box introduced, and atoms moved into neighbouring images + # The results however should remain identical if PBC is used + # If pbc:True in kwargs is changed, these tests should fail + @staticmethod + @pytest.fixture(scope='class') + def universe(): + u = MDAnalysis.Universe(PDB_helix) + # transfer to memory to changes to coordinates are reset + u.transfer_to_memory() + # place in huge oversized box + # real system is about 30A wide at most + boxsize = 150. + box = np.array([boxsize, boxsize, boxsize, 90., 90., 90.]) + u.dimensions = box + + # then scatter the atoms throughout various images of this box + u.atoms[::4].translate([boxsize * 2, 0, 0]) + u.atoms[1::4].translate([0, boxsize *4, 0]) + u.atoms[2::4].translate([-boxsize * 5, 0, -boxsize * 2]) + + return u + + kwargs = { + 'selection1': 'protein', + 'selection2': 'protein', + 'detect_hydrogens': "distance", + 'distance': 3.0, + 'angle': 150.0, + 'pbc': True, + } + + class TestHydrogenBondAnalysisHeuristic(TestHydrogenBondAnalysis): kwargs = { From 3a27a7cee97f0576f6fecfa748781228d36740d2 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Wed, 2 May 2018 14:44:41 +0200 Subject: [PATCH 021/455] remove toplevel import of MDAnalysis in groups.py On a core i7-4600 with an SSD, this reduced the import times of MDAnalysis to under a second. Tested with time python -c 'import MDAnalysis'. *0.18.0*: ~1.4s *HEAD*: ~0.6s --- package/CHANGELOG | 3 ++- package/MDAnalysis/core/groups.py | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index ea335129457..87d15c90fbb 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,12 +13,13 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 richardjgowers, palnabarun, orbeckst +??/??/18 richardjgowers, palnabarun, orbeckst, kain88-de * 0.18.1 Enhancements * Added various duecredit stubs + * Import time reduced by a factor two (PR #1881) Fixes * Fixed order of indices in Angle/Dihedral/Improper repr diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 34fbcdc5084..e5429c72d1e 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -103,7 +103,6 @@ from numpy.lib.utils import deprecate -import MDAnalysis from .. import _ANCHOR_UNIVERSES from ..lib import util from ..lib import distances @@ -114,6 +113,7 @@ from ..exceptions import NoDataError from . import topologyobjects from ._get_readers import get_writer_for +from . import flags def _unpickle(uhash, ix): @@ -304,11 +304,12 @@ def __new__(cls, *args, **kwargs): # older AtomGroup init method.. u = args[0][0].universe except (TypeError, IndexError, AttributeError): + from .universe import Universe # Let's be generic and get the first argument that's either a # Universe, a Group, or a Component, and go from there. # This is where the UpdatingAtomGroup args get matched. for arg in args+tuple(kwargs.values()): - if isinstance(arg, (MDAnalysis.Universe, GroupBase, + if isinstance(arg, (Universe, GroupBase, ComponentBase)): u = arg.universe break @@ -698,7 +699,7 @@ def bbox(self, **kwargs): .. versionchanged:: 0.8 Added *pbc* keyword """ atomgroup = self.atoms - pbc = kwargs.pop('pbc', MDAnalysis.core.flags['use_pbc']) + pbc = kwargs.pop('pbc', flags['use_pbc']) if pbc: x = atomgroup.pack_into_box(inplace=False) @@ -735,7 +736,7 @@ def bsphere(self, **kwargs): .. versionchanged:: 0.8 Added *pbc* keyword """ atomgroup = self.atoms - pbc = kwargs.pop('pbc', MDAnalysis.core.flags['use_pbc']) + pbc = kwargs.pop('pbc', flags['use_pbc']) if pbc: x = atomgroup.pack_into_box(inplace=False) From 8572d796a95e92bbdaa827325a1ae82e1664dcba Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Wed, 2 May 2018 15:32:20 -0600 Subject: [PATCH 022/455] BLD / MAINT: Improvements related to Windows compatibility * adjustments to the build process, code base, and test suite that improve Windows compatibility; many of these are code modernizations (i.e., broader adoption of pytest) that serve the dual purpose of improving compatibility --- package/CHANGELOG | 2 +- .../analysis/encore/clustering/include/ap.h | 6 ++-- .../analysis/encore/clustering/src/ap.c | 2 ++ .../encore/dimensionality_reduction/src/spe.c | 9 ++++- package/MDAnalysis/coordinates/PDB.py | 15 ++++++-- package/MDAnalysis/core/universe.py | 5 ++- package/MDAnalysis/lib/c_distances.pyx | 14 ++++---- .../MDAnalysis/lib/formats/include/fastio.h | 2 +- package/MDAnalysis/lib/formats/libdcd.pyx | 2 +- package/MDAnalysis/lib/formats/src/xdrfile.c | 21 +++++++++++- .../MDAnalysis/lib/include/calc_distances.h | 2 +- package/setup.py | 18 ++++++---- .../analysis/test_hydrogenbondautocorrel.py | 15 ++++---- .../MDAnalysisTests/coordinates/test_pdb.py | 30 ++++++++-------- .../MDAnalysisTests/coordinates/test_trz.py | 34 ++++++------------- .../core/test_atomselections.py | 5 ++- testsuite/MDAnalysisTests/lib/test_util.py | 6 +++- .../MDAnalysisTests/utils/test_streamio.py | 2 +- testsuite/setup.py | 2 +- 19 files changed, 118 insertions(+), 74 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 87d15c90fbb..42f33e8c79d 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,7 +13,7 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 richardjgowers, palnabarun, orbeckst, kain88-de +??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de * 0.18.1 diff --git a/package/MDAnalysis/analysis/encore/clustering/include/ap.h b/package/MDAnalysis/analysis/encore/clustering/include/ap.h index ef7e223feaf..a3b1e538cf9 100644 --- a/package/MDAnalysis/analysis/encore/clustering/include/ap.h +++ b/package/MDAnalysis/analysis/encore/clustering/include/ap.h @@ -23,8 +23,10 @@ int trmIndex(int, int); int sqmIndex(int, int, int); -float min(float*, int); +#ifndef _WIN32 + float min(float*, int); + float max(float*, int); +#endif -float max(float*, int); int CAffinityPropagation(float*, int, float, int, int, int, long*); diff --git a/package/MDAnalysis/analysis/encore/clustering/src/ap.c b/package/MDAnalysis/analysis/encore/clustering/src/ap.c index 4dd2dd704c8..6f42037dce7 100644 --- a/package/MDAnalysis/analysis/encore/clustering/src/ap.c +++ b/package/MDAnalysis/analysis/encore/clustering/src/ap.c @@ -33,6 +33,7 @@ inline int sqmIndex(int colsn, int row, int col) { // array index for square mat return row*colsn + col; } +#ifndef _WIN32 float min(float * values, int length) { //array min float min = values[0]; for (int i=1;i #include #include -#include + +#ifdef __unix__ + #include +#endif + +#ifdef _WIN32 + #include +#endif #define EPSILON 1e-8 diff --git a/package/MDAnalysis/coordinates/PDB.py b/package/MDAnalysis/coordinates/PDB.py index b5d207118ab..83875418fa7 100644 --- a/package/MDAnalysis/coordinates/PDB.py +++ b/package/MDAnalysis/coordinates/PDB.py @@ -275,16 +275,27 @@ def __init__(self, filename, **kwargs): pdbfile = self._pdbfile = util.anyopen(filename) line = "magical" + # we handle windows file striding uniquely + # because file.tell() is not reliable on Windows + # for a text file and binary mode is not compatible + # with i.e., our use of anyopen for zip files + windows_overbyte = 0 while line: # need to use readline so tell gives end of line # (rather than end of current chunk) line = pdbfile.readline() + # the tell() text opaque number striding is not portable + # to windows so compensate accordingly + if os.name == 'nt': + # for a text file mode these aren't necessarily + # bytes; var name for simplicity only + windows_overbyte += 1 if line.startswith('MODEL'): - models.append(pdbfile.tell()) + models.append(pdbfile.tell() - windows_overbyte) elif line.startswith('CRYST1'): # remove size of line to get **start** of CRYST line - crysts.append(pdbfile.tell() - len(line)) + crysts.append(pdbfile.tell() - len(line) - windows_overbyte) elif line.startswith('HEADER'): # classification = line[10:50] # date = line[50:59] diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index 85c417edd3b..a71ffae184f 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -101,7 +101,10 @@ # A clean solution is therefore simply to disable os.fork() prior to importing # the uuid module and to re-enable it afterwards. import os -if sys.version_info >= (3, 7): + +# Windows doesn't have os.fork so can ignore +# the issue for that platform +if sys.version_info >= (3, 7) or os.name == 'nt': import uuid else: _os_dot_fork, os.fork = os.fork, None diff --git a/package/MDAnalysis/lib/c_distances.pyx b/package/MDAnalysis/lib/c_distances.pyx index 17cd22d5260..b5c8dcd6ad1 100644 --- a/package/MDAnalysis/lib/c_distances.pyx +++ b/package/MDAnalysis/lib/c_distances.pyx @@ -44,7 +44,7 @@ cdef extern from "calc_distances.h": void _calc_self_distance_array(coordinate* ref, int numref, double* distances, int distnum) void _calc_self_distance_array_ortho(coordinate* ref, int numref, float* box, double* distances, int distnum) void _calc_self_distance_array_triclinic(coordinate* ref, int numref, coordinate* box, double* distances, int distnum) - void _coord_transform(coordinate* coords, int numCoords, coordinate* box) + void _coord_transform(float* coords, int numCoords, float* box) void _calc_bond_distance(coordinate* atom1, coordinate* atom2, int numatom, double* distances) void _calc_bond_distance_ortho(coordinate* atom1, coordinate* atom2, int numatom, float*box, double* distances) void _calc_bond_distance_triclinic(coordinate* atom1, coordinate* atom2, int numatom, coordinate* box, double* distances) @@ -125,13 +125,15 @@ def calc_self_distance_array_triclinic(numpy.ndarray ref, box.data, result.data, distnum) -def coord_transform(numpy.ndarray coords, - numpy.ndarray box): - cdef int numcoords +def coord_transform(float[:,:] coords, + float[:,:] box): + cdef int numcoords, size numcoords = coords.shape[0] + size = coords.size - _coord_transform( coords.data, numcoords, - box.data) + if size > 0: + _coord_transform( &coords[0,0], numcoords, + &box[0,0]) def calc_bond_distance(numpy.ndarray coords1, numpy.ndarray coords2, diff --git a/package/MDAnalysis/lib/formats/include/fastio.h b/package/MDAnalysis/lib/formats/include/fastio.h index 4eeda73e21f..9bcd54ab082 100644 --- a/package/MDAnalysis/lib/formats/include/fastio.h +++ b/package/MDAnalysis/lib/formats/include/fastio.h @@ -90,7 +90,7 @@ static int fio_open(const char *filename, int mode, fio_fd *fd) { access = FILE_ALL_ACCESS; /* XXX hack if above modes fail */ #endif - sharing = 0; /* disallow sharing with other processes */ + sharing = 1; /* allow sharing with other processes */ security = NULL; /* child processes don't inherit anything */ /* since we never append, blow away anything that's already there */ diff --git a/package/MDAnalysis/lib/formats/libdcd.pyx b/package/MDAnalysis/lib/formats/libdcd.pyx index be8469e3bb8..afbb57c812a 100644 --- a/package/MDAnalysis/lib/formats/libdcd.pyx +++ b/package/MDAnalysis/lib/formats/libdcd.pyx @@ -653,7 +653,7 @@ cdef class DCDFile: cdef np.ndarray[np.int64_t, ndim=1] c_indices if indices is None: - c_indices = np.arange(self.natoms) + c_indices = np.arange(self.natoms, dtype=np.int64) natoms = self.natoms else: natoms = len(indices) diff --git a/package/MDAnalysis/lib/formats/src/xdrfile.c b/package/MDAnalysis/lib/formats/src/xdrfile.c index 5ff70a8b38e..93586e09abd 100644 --- a/package/MDAnalysis/lib/formats/src/xdrfile.c +++ b/package/MDAnalysis/lib/formats/src/xdrfile.c @@ -45,7 +45,14 @@ #endif #include -#include + +#ifdef __unix__ + #include +#endif + +#ifdef _WIN32 + #include +#endif #ifdef HAVE_RPC_XDR_H # include @@ -2598,7 +2605,13 @@ xdrstdio_putbytes (XDR *xdrs, char *addr, unsigned int len) static off_t xdrstdio_getpos (XDR *xdrs) { + #ifdef __unix__ return ftello((FILE *) xdrs->x_private); + #endif + + #ifdef _WIN32 + return _ftelli64((FILE *) xdrs->x_private); + #endif } static int @@ -2610,7 +2623,13 @@ xdrstdio_setpos (XDR *xdrs, off_t pos, int whence) /* We return errno relying on the fact that it is never set to 0 on * success, which means that if an error occurrs it'll never be the same * as exdrOK, and xdr_seek won't be confused.*/ + #ifdef __unix__ return fseeko((FILE *) xdrs->x_private, pos, whence) < 0 ? errno : exdrOK; + #endif + + #ifdef _WIN32 + return _fseeki64((FILE *) xdrs->x_private, pos, whence) < 0 ? errno : exdrOK; + #endif } diff --git a/package/MDAnalysis/lib/include/calc_distances.h b/package/MDAnalysis/lib/include/calc_distances.h index 3d4315e24b2..72a45c2d6ae 100644 --- a/package/MDAnalysis/lib/include/calc_distances.h +++ b/package/MDAnalysis/lib/include/calc_distances.h @@ -307,7 +307,7 @@ static void _calc_self_distance_array_triclinic(coordinate* ref, int numref, } } -static void _coord_transform(coordinate* coords, int numCoords, coordinate* box) +void _coord_transform(float coords[][3], int numCoords, float box[][3]) { int i, j, k; float new[3]; diff --git a/package/setup.py b/package/setup.py index 6ea68b13e9a..06e8fb48557 100755 --- a/package/setup.py +++ b/package/setup.py @@ -286,6 +286,12 @@ def extensions(config): # The callable is passed so that it is only evaluated at install time. include_dirs = [get_numpy_include] + # Windows automatically handles math library linking + # and will not build MDAnalysis if we try to specify one + if os.name == 'nt': + mathlib = [] + else: + mathlib = ['m'] libdcd = MDAExtension('MDAnalysis.lib.formats.libdcd', ['MDAnalysis/lib/formats/libdcd' + source_suffix], @@ -295,13 +301,13 @@ def extensions(config): distances = MDAExtension('MDAnalysis.lib.c_distances', ['MDAnalysis/lib/c_distances' + source_suffix], include_dirs=include_dirs + ['MDAnalysis/lib/include'], - libraries=['m'], + libraries=mathlib, define_macros=define_macros, extra_compile_args=extra_compile_args) distances_omp = MDAExtension('MDAnalysis.lib.c_distances_openmp', ['MDAnalysis/lib/c_distances_openmp' + source_suffix], include_dirs=include_dirs + ['MDAnalysis/lib/include'], - libraries=['m'] + parallel_libraries, + libraries=mathlib + parallel_libraries, define_macros=define_macros + parallel_macros, extra_compile_args=parallel_args + extra_compile_args, extra_link_args=parallel_args) @@ -312,7 +318,7 @@ def extensions(config): extra_compile_args=extra_compile_args) transformation = MDAExtension('MDAnalysis.lib._transformations', ['MDAnalysis/lib/src/transformations/transformations.c'], - libraries=['m'], + libraries=mathlib, define_macros=define_macros, include_dirs=include_dirs, extra_compile_args=extra_compile_args) @@ -343,14 +349,14 @@ def extensions(config): sources=['MDAnalysis/analysis/encore/clustering/affinityprop' + source_suffix, 'MDAnalysis/analysis/encore/clustering/src/ap.c'], include_dirs=include_dirs+['MDAnalysis/analysis/encore/clustering/include'], - libraries=["m"], + libraries=mathlib, define_macros=define_macros, extra_compile_args=extra_compile_args) spe_dimred = MDAExtension('MDAnalysis.analysis.encore.dimensionality_reduction.stochasticproxembed', sources=['MDAnalysis/analysis/encore/dimensionality_reduction/stochasticproxembed' + source_suffix, 'MDAnalysis/analysis/encore/dimensionality_reduction/src/spe.c'], include_dirs=include_dirs+['MDAnalysis/analysis/encore/dimensionality_reduction/include'], - libraries=["m"], + libraries=mathlib, define_macros=define_macros, extra_compile_args=extra_compile_args) pre_exts = [libdcd, distances, distances_omp, qcprot, @@ -394,7 +400,7 @@ def dynamic_author_list(): # authors". We first want move the cursor down to the title of # interest. for line_no, line in enumerate(infile, start=1): - if line[:-1] == "Chronological list of authors": + if line.rstrip() == "Chronological list of authors": break else: # If we did not break, it means we did not find the authors. diff --git a/testsuite/MDAnalysisTests/analysis/test_hydrogenbondautocorrel.py b/testsuite/MDAnalysisTests/analysis/test_hydrogenbondautocorrel.py index 3fa8e74e589..09fc4e6bbe0 100644 --- a/testsuite/MDAnalysisTests/analysis/test_hydrogenbondautocorrel.py +++ b/testsuite/MDAnalysisTests/analysis/test_hydrogenbondautocorrel.py @@ -26,10 +26,10 @@ from six.moves import range from MDAnalysisTests.datafiles import TRZ, TRZ_psf -from MDAnalysisTests import tempdir from numpy.testing import assert_almost_equal import numpy as np import mock +import os import MDAnalysis as mda from MDAnalysis.analysis.hbonds import HydrogenBondAutoCorrel as HBAC @@ -199,7 +199,7 @@ def actual_function_int(t): np.array([0.33, 0.33, 5, 1, 0.1]), ) - def test_save(self, u, hydrogens, oxygens, nitrogens): + def test_save(self, u, hydrogens, oxygens, nitrogens, tmpdir): hbond = HBAC(u, hydrogens=hydrogens, acceptors=oxygens, @@ -209,12 +209,13 @@ def test_save(self, u, hydrogens, oxygens, nitrogens): ) hbond.run() - with tempdir.in_tempdir(): - hbond.save_results('hbondout.npz') + tmpfile = os.path.join(str(tmpdir), 'hbondout.npz') - loaded = np.load('hbondout.npz') - assert 'time' in loaded - assert 'results' in loaded + hbond.save_results(tmpfile) + + loaded = np.load(tmpfile) + assert 'time' in loaded + assert 'results' in loaded # setup errors def test_wronglength_DA(self, u, hydrogens, oxygens, nitrogens): diff --git a/testsuite/MDAnalysisTests/coordinates/test_pdb.py b/testsuite/MDAnalysisTests/coordinates/test_pdb.py index c06ba1e11bb..e11a6f0995a 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pdb.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pdb.py @@ -383,22 +383,6 @@ def test_conect_bonds_conect(self): assert_equal(len(u1.atoms), 1890) assert_equal(len(u1.bonds), 1922) - def test_conect_bonds_all(self): - conect = self.conect - assert_equal(len(conect.atoms), 1890) - assert_equal(len(conect.bonds), 1922) - - with tempdir.in_tempdir(): - try: - outfile = 'pdb-connect-bonds.pdb' - self.conect.atoms.write(outfile, bonds="all") - u2 = mda.Universe(outfile, guess_bonds=True) - finally: - os.unlink(outfile) - assert_equal(len(u2.atoms), 1890) - assert_equal(len([b for b in u2.bonds if not b.is_guessed]), 1922) - - # assert_equal(len([b for b in conect.bonds if not b.is_guessed]), 1922) def test_numconnections(self): u = self.multiverse @@ -459,6 +443,20 @@ def helper(atoms, bonds): "the test reference; len(actual) is %d, len(desired) " "is %d" % (len(u._topology.bonds.values), len(desired))) +def test_conect_bonds_all(tmpdir): + conect = mda.Universe(CONECT, guess_bonds=True) + + assert_equal(len(conect.atoms), 1890) + assert_equal(len(conect.bonds), 1922) + + outfile = os.path.join(str(tmpdir), 'pdb-connect-bonds.pdb') + conect.atoms.write(outfile, bonds="all") + u2 = mda.Universe(outfile, guess_bonds=True) + + assert_equal(len(u2.atoms), 1890) + assert_equal(len([b for b in u2.bonds if not b.is_guessed]), 1922) + + # assert_equal(len([b for b in conect.bonds if not b.is_guessed]), 1922) class TestMultiPDBWriter(TestCase): def setUp(self): diff --git a/testsuite/MDAnalysisTests/coordinates/test_trz.py b/testsuite/MDAnalysisTests/coordinates/test_trz.py index c664a2f5671..47ada65b04e 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_trz.py +++ b/testsuite/MDAnalysisTests/coordinates/test_trz.py @@ -35,7 +35,6 @@ from MDAnalysisTests.coordinates.reference import RefTRZ from MDAnalysisTests.coordinates.base import BaseTimestepTest from MDAnalysisTests.datafiles import (TRZ_psf, TRZ, two_water_gro) -from MDAnalysisTests import tempdir class TestTRZReader(RefTRZ): @@ -120,27 +119,17 @@ def test_title(self, universe): assert_equal(self.ref_title, universe.trajectory.title, "wrong title in trz") - def test_get_writer(self, universe): - with tempdir.in_tempdir(): - self.outfile = 'test-trz-writer.trz' - W = universe.trajectory.Writer(self.outfile) + def test_get_writer(self, universe, tmpdir): + self.outfile = os.path.join(str(tmpdir), 'test-trz-writer.trz') + with universe.trajectory.Writer(self.outfile) as W: assert_equal(isinstance(W, mda.coordinates.TRZ.TRZWriter), True) assert_equal(W.n_atoms, universe.trajectory.n_atoms) - try: - os.unlink(self.outfile) - except OSError: - pass - - def test_get_writer_2(self, universe): - with tempdir.in_tempdir(): - self.outfile = 'test-trz-writer-1.trz' - W = universe.trajectory.Writer(self.outfile, n_atoms=100) + + def test_get_writer_2(self, universe, tmpdir): + self.outfile = os.path.join(str(tmpdir), 'test-trz-writer-1.trz') + with universe.trajectory.Writer(self.outfile, n_atoms=100) as W: assert_equal(isinstance(W, mda.coordinates.TRZ.TRZWriter), True) assert_equal(W.n_atoms, 100) - try: - os.unlink(self.outfile) - except OSError: - pass class TestTRZWriter(RefTRZ): @@ -203,12 +192,9 @@ class TestTRZWriter2(object): def u(self): return mda.Universe(two_water_gro) - def test_writer_trz_from_other(self, u): - with tempdir.in_tempdir(): - outfile = 'trz-writer-2.trz' - W = mda.coordinates.TRZ.TRZWriter(outfile, - n_atoms=len(u.atoms)) - + def test_writer_trz_from_other(self, u, tmpdir): + outfile = os.path.join(str(tmpdir), 'trz-writer-2.trz') + with mda.coordinates.TRZ.TRZWriter(outfile, len(u.atoms)) as W: W.write(u.trajectory.ts) W.close() diff --git a/testsuite/MDAnalysisTests/core/test_atomselections.py b/testsuite/MDAnalysisTests/core/test_atomselections.py index 3a167a1a52d..d9cdc07d401 100644 --- a/testsuite/MDAnalysisTests/core/test_atomselections.py +++ b/testsuite/MDAnalysisTests/core/test_atomselections.py @@ -80,7 +80,10 @@ def test_protein_resnames(self, resname): u = make_Universe(('resnames',)) # set half the residues' names to the resname we're testing myprot = u.residues[::2] - myprot.resnames = resname + # Windows note: the parametrized test input string objects + # are actually of type 'numpy.str_' and coercion to str + # proper is needed for unit test on Windows + myprot.resnames = str(resname) # select protein sel = u.select_atoms('protein') # check that contents (atom indices) are identical afterwards diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index c010dc887fb..c3bae60e2a8 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -24,6 +24,7 @@ from six.moves import range, StringIO import pytest +import os import numpy as np from numpy.testing import (assert_equal, assert_almost_equal, @@ -105,7 +106,10 @@ def test_ValueError(self, x): def test_greedy_splitext(inp="foo/bar/boing.2.pdb.bz2", - ref=("foo/bar/boing", ".2.pdb.bz2")): + ref=["foo/bar/boing", ".2.pdb.bz2"]): + inp = os.path.normpath(inp) + ref[0] = os.path.normpath(ref[0]) + ref[1] = os.path.normpath(ref[1]) root, ext = util.greedy_splitext(inp) assert root == ref[0], "root incorrect" assert ext == ref[1], "extension incorrect" diff --git a/testsuite/MDAnalysisTests/utils/test_streamio.py b/testsuite/MDAnalysisTests/utils/test_streamio.py index 2b510aeda8e..0668a60e6ba 100644 --- a/testsuite/MDAnalysisTests/utils/test_streamio.py +++ b/testsuite/MDAnalysisTests/utils/test_streamio.py @@ -168,7 +168,7 @@ def test_matryoshka(self): class TestNamedStream_filename_behavior(object): - textname = "~/stories/jabberwock.txt" # with tilde ~ to test regular expanduser() + textname = os.path.join("~", "stories", "jabberwock.txt") # with tilde ~ to test regular expanduser() # note: no setUp() because classes with generators would run it # *for each generated test* and we need it for the generator method diff --git a/testsuite/setup.py b/testsuite/setup.py index 6889d8e4530..cc05b08f39d 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -65,7 +65,7 @@ def dynamic_author_list(): # authors". We first want move the cursor down to the title of # interest. for line_no, line in enumerate(infile, start=1): - if line[:-1] == "Chronological list of authors": + if line.rstrip() == "Chronological list of authors": break else: # If we did not break, it means we did not find the authors. From c1189a1c48faa09909234c8ccecae7c0c0ac07a2 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 28 Apr 2018 20:16:57 -0400 Subject: [PATCH 023/455] TopologyAttributes are now statically typed Fixed Issue #1876 --- package/CHANGELOG | 3 ++ package/MDAnalysis/core/topologyattrs.py | 35 +++++++++++++++---- .../core/test_topologyattrs.py | 16 +++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 42f33e8c79d..25717eab2b5 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -26,8 +26,11 @@ Fixes * coordinates.memory.MemoryReader now takes np.ndarray only (Issue #1685) * Silenced warning when duecredit is not installed (Issue #1872) * Fixed HBondAnalysis not considering PBC for distances (Issue #1878) + * Adding new TopologyAttrs with values defined always coerces this into + a numpy array (Issue #1876) Changes + * TopologyAttrs are now statically typed (Issue #1876) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, diff --git a/package/MDAnalysis/core/topologyattrs.py b/package/MDAnalysis/core/topologyattrs.py index e85c84d536e..5bb4d1c0a32 100644 --- a/package/MDAnalysis/core/topologyattrs.py +++ b/package/MDAnalysis/core/topologyattrs.py @@ -198,6 +198,8 @@ class TopologyAttr(six.with_metaclass(_TopologyAttrMeta, object)): name for the attribute on a singular object (Atom/Residue/Segment) per_object : str If there is a strict mapping between Component and Attribute + dtype : int/float/object + Type to coerce this attribute to be. For string use 'object' top : Topology handle for the Topology object TopologyAttr is associated with @@ -211,9 +213,13 @@ class TopologyAttr(six.with_metaclass(_TopologyAttrMeta, object)): groupdoc = None singledoc = None + dtype = None def __init__(self, values, guessed=False): - self.values = values + if self.dtype is None: + self.values = values + else: + self.values = np.asarray(values, dtype=self.dtype) self._guessed = guessed @staticmethod @@ -244,6 +250,9 @@ def from_blank(cls, n_atoms=None, n_residues=None, n_segments=None, """ if values is None: values = cls._gen_initial_values(n_atoms, n_residues, n_segments) + elif cls.dtype is not None: + # if supplied starting values and statically typed + values = np.asarray(values, dtype=cls.dtype) return cls(values) def copy(self): @@ -450,6 +459,7 @@ class Atomids(AtomAttr): attrname = 'ids' singular = 'id' per_object = 'atom' + dtype = int @staticmethod def _gen_initial_values(na, nr, ns): @@ -463,6 +473,7 @@ class Atomnames(AtomAttr): attrname = 'names' singular = 'name' per_object = 'atom' + dtype = object transplants = defaultdict(list) @staticmethod @@ -627,6 +638,7 @@ class Atomtypes(AtomAttr): attrname = 'types' singular = 'type' per_object = 'atom' + dtype = object @staticmethod def _gen_initial_values(na, nr, ns): @@ -638,6 +650,7 @@ class Elements(AtomAttr): """Element for each atom""" attrname = 'elements' singular = 'element' + dtype = object @staticmethod def _gen_initial_values(na, nr, ns): @@ -650,6 +663,7 @@ class Radii(AtomAttr): attrname = 'radii' singular = 'radius' per_object = 'atom' + dtype = float @staticmethod def _gen_initial_values(na, nr, ns): @@ -698,6 +712,7 @@ class ChainIDs(AtomAttr): attrname = 'chainIDs' singular = 'chainID' per_object = 'atom' + dtype = object @staticmethod def _gen_initial_values(na, nr, ns): @@ -709,6 +724,7 @@ class Tempfactors(AtomAttr): attrname = 'tempfactors' singular = 'tempfactor' per_object = 'atom' + dtype = float @staticmethod def _gen_initial_values(na, nr, ns): @@ -722,6 +738,7 @@ class Masses(AtomAttr): target_classes = [AtomGroup, ResidueGroup, SegmentGroup, Atom, Residue, Segment] transplants = defaultdict(list) + dtype = np.float64 groupdoc = """Mass of each component in the Group. @@ -733,10 +750,6 @@ class Masses(AtomAttr): singledoc = """Mass of the component.""" - def __init__(self, values, guessed=False): - self.values = np.asarray(values, dtype=np.float64) - self._guessed = guessed - @staticmethod def _gen_initial_values(na, nr, ns): return np.zeros(na) @@ -1092,6 +1105,7 @@ class Charges(AtomAttr): target_classes = [AtomGroup, ResidueGroup, SegmentGroup, Atom, Residue, Segment] transplants = defaultdict(list) + dtype = float @staticmethod def _gen_initial_values(na, nr, ns): @@ -1137,6 +1151,7 @@ class Bfactors(AtomAttr): attrname = 'bfactors' singular = 'bfactor' per_object = 'atom' + dtype = float @staticmethod def _gen_initial_values(na, nr, ns): @@ -1148,6 +1163,7 @@ class Occupancies(AtomAttr): attrname = 'occupancies' singular = 'occupancy' per_object = 'atom' + dtype = float @staticmethod def _gen_initial_values(na, nr, ns): @@ -1160,6 +1176,7 @@ class AltLocs(AtomAttr): attrname = 'altLocs' singular = 'altLoc' per_object = 'atom' + dtype = object @staticmethod def _gen_initial_values(na, nr, ns): @@ -1205,6 +1222,7 @@ class Resids(ResidueAttr): attrname = 'resids' singular = 'resid' target_classes = [AtomGroup, ResidueGroup, SegmentGroup, Atom, Residue] + dtype = int @staticmethod def _gen_initial_values(na, nr, ns): @@ -1217,6 +1235,7 @@ class Resnames(ResidueAttr): singular = 'resname' target_classes = [AtomGroup, ResidueGroup, SegmentGroup, Atom, Residue] transplants = defaultdict(list) + dtype = object @staticmethod def _gen_initial_values(na, nr, ns): @@ -1378,6 +1397,7 @@ class Resnums(ResidueAttr): attrname = 'resnums' singular = 'resnum' target_classes = [AtomGroup, ResidueGroup, SegmentGroup, Atom, Residue] + dtype = int @staticmethod def _gen_initial_values(na, nr, ns): @@ -1388,6 +1408,7 @@ class ICodes(ResidueAttr): """Insertion code for Atoms""" attrname = 'icodes' singular = 'icode' + dtype = object @staticmethod def _gen_initial_values(na, nr, ns): @@ -1402,6 +1423,7 @@ class Moltypes(ResidueAttr): attrname = 'moltypes' singular = 'moltype' target_classes = [AtomGroup, ResidueGroup, SegmentGroup, Atom, Residue] + dtype = object class Molnums(ResidueAttr): @@ -1412,7 +1434,7 @@ class Molnums(ResidueAttr): attrname = 'molnums' singular = 'molnum' target_classes = [AtomGroup, ResidueGroup, Atom, Residue] - + dtype = int # segment attributes @@ -1454,6 +1476,7 @@ class Segids(SegmentAttr): target_classes = [AtomGroup, ResidueGroup, SegmentGroup, Atom, Residue, Segment] transplants = defaultdict(list) + dtype = object @staticmethod def _gen_initial_values(na, nr, ns): diff --git a/testsuite/MDAnalysisTests/core/test_topologyattrs.py b/testsuite/MDAnalysisTests/core/test_topologyattrs.py index fbaa341021e..a40fb644280 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyattrs.py +++ b/testsuite/MDAnalysisTests/core/test_topologyattrs.py @@ -543,3 +543,19 @@ def test_segment_record_types(self, rectype_uni): assert not rt[0].dtype == bool assert (rt[0] == 'ATOM').all() assert (rt[1] == 'HETATM').all() + + +def test_static_typing(): + ta = tpattrs.Charges(['1.0', '2.0', '3.0']) + + assert isinstance(ta.values, np.ndarray) + assert ta.values.dtype == float + + +def test_static_typing_from_empty(): + u = mda.Universe.empty(3) + + u.add_TopologyAttr('masses', values=['1.0', '2.0', '3.0']) + + assert isinstance(u._topology.masses.values, np.ndarray) + assert isinstance(u.atoms[0].mass, float) From 3bbef5221e2d393f8466280387b9dc5f62be2f25 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 28 Apr 2018 20:53:56 -0400 Subject: [PATCH 024/455] updated PDB writing occupancies test to allow floating point errors --- .../MDAnalysisTests/coordinates/test_pdb.py | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_pdb.py b/testsuite/MDAnalysisTests/coordinates/test_pdb.py index e11a6f0995a..355330e44c9 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pdb.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pdb.py @@ -730,32 +730,18 @@ def test_uses_PDBReader(self): assert isinstance(self.universe.trajectory, PDBReader), "failed to choose PDBReader" -class TestPDBWriterOccupancies(TestCase): - """Tests for Issue #620""" +def test_write_occupancies(tmpdir): + """Tests for Issue #620 Modify occupancies, write out the file and check""" + u = mda.Universe(PDB_small) + u.atoms.occupancies = 0.12 - def setUp(self): - self.tempdir = tempdir.TempDir() - self.outfile = self.tempdir.name + '/occ.pdb' + outfile = str(tmpdir.join('occ.pdb')) - def tearDown(self): - try: - os.unlink(self.outfile) - except OSError: - pass - del self.tempdir - del self.outfile + u.atoms.write(outfile) - def test_write_occupancies(self): - """Modify occupancies, write out the file and check""" - u = mda.Universe(PDB_small) - - u.atoms.occupancies = 0.12 - - u.atoms.write(self.outfile) - - u2 = mda.Universe(self.outfile) + u2 = mda.Universe(outfile) - assert all(u2.atoms.occupancies == 0.12) + assert_array_almost_equal(u2.atoms.occupancies, 0.12) class TestWriterAlignments(object): From c83f33eab858e3d41b9567e15a69515f2c57380b Mon Sep 17 00:00:00 2001 From: Max Linke Date: Wed, 2 May 2018 15:24:07 +0200 Subject: [PATCH 025/455] add benchmark for import times --- benchmarks/benchmarks/import.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 benchmarks/benchmarks/import.py diff --git a/benchmarks/benchmarks/import.py b/benchmarks/benchmarks/import.py new file mode 100644 index 00000000000..d1ca3cb43bd --- /dev/null +++ b/benchmarks/benchmarks/import.py @@ -0,0 +1,6 @@ +class ImportBench(object): + def time_import(self): + """Benchmark time needed to import MDAnalysis + """ + import MDAnalysis as mda + pass From 6f20407a8742c368b777904af80c24e1a16d2bc9 Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Mon, 16 Apr 2018 14:17:27 +0530 Subject: [PATCH 026/455] Adds a check for arbitrary atomgroups passed to MDAnalysis.core.groups.select_atoms --- package/MDAnalysis/core/groups.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index e5429c72d1e..6846170fe13 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -2064,6 +2064,11 @@ def select_atoms(self, sel, *othersel, **selgroups): """ updating = selgroups.pop('updating', False) sel_strs = (sel,) + othersel + + for group, thing in selgroups.items(): + if not isinstance(thing, MDAnalysis.core.groups.AtomGroup): + raise TypeError("Only AtomGroup type is allowed for the passed arbitrary atomgroups, you provided type {} for {}".format(str(type(thing)), group)) + selections = tuple((selection.Parser.parse(s, selgroups) for s in sel_strs)) if updating: From df2d116d49300f6321a9e71fa1747f35733e6c76 Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Mon, 16 Apr 2018 14:18:17 +0530 Subject: [PATCH 027/455] Updates docs for MDAnalysis.core.groups.select_atoms --- package/MDAnalysis/core/groups.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 6846170fe13..78d510bb276 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -1822,6 +1822,10 @@ def select_atoms(self, sel, *othersel, **selgroups): are not any duplicates, which can happen with complicated selections). + Raises + ------ + `TypeError` if the arbitrary atomgroups passed are of type MDAnalysis.core.groups.AtomGroup + Examples -------- All simple selection listed below support multiple arguments which are From 2984c9f4923d9a4d905986a5feea757b3e35d481 Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Wed, 18 Apr 2018 20:26:21 +0530 Subject: [PATCH 028/455] Fixes typo in docstring --- package/MDAnalysis/core/groups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 78d510bb276..42f2ace3885 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -1824,7 +1824,7 @@ def select_atoms(self, sel, *othersel, **selgroups): Raises ------ - `TypeError` if the arbitrary atomgroups passed are of type MDAnalysis.core.groups.AtomGroup + `TypeError` if the arbitrary atomgroups passed are not of type `MDAnalysis.core.groups.AtomGroup` Examples -------- From 7a415cdc92ce6bb30211cb84969e8e82d9d55ba3 Mon Sep 17 00:00:00 2001 From: Nabarun Pal Date: Wed, 18 Apr 2018 21:59:45 +0530 Subject: [PATCH 029/455] Adds tests for modifications in MDAnalysis.core.groups.select_Atoms --- testsuite/MDAnalysisTests/core/test_atomselections.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/testsuite/MDAnalysisTests/core/test_atomselections.py b/testsuite/MDAnalysisTests/core/test_atomselections.py index d9cdc07d401..4fc679512a0 100644 --- a/testsuite/MDAnalysisTests/core/test_atomselections.py +++ b/testsuite/MDAnalysisTests/core/test_atomselections.py @@ -1022,3 +1022,13 @@ def test_missing_icodes_range_VE(self, u): u = make_Universe(('resids',)) with pytest.raises(ValueError): u.select_atoms('resid 10A-12') + +class TestArbitraryAtomGroupSelection: + def test_arbitrary_atom_group_raises_error(self): + u = mda.Universe(GRO) + with pytest.raises(TypeError): + u.select_atoms('around 2.0 group this', this=u.atoms[0]) + + def test_arbitrary_atom_group_raises_no_error(self): + u = mda.Universe(GRO) + u.select_atoms('around 2.0 group this', this=u.atoms) From ee735e65c0678d6906d373905f7d92a361f3bb3c Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 6 May 2018 11:30:03 -0400 Subject: [PATCH 030/455] Updated 1852 against develop --- package/CHANGELOG | 1 + package/MDAnalysis/core/groups.py | 13 ++++++++----- .../MDAnalysisTests/core/test_atomselections.py | 14 +++++--------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 25717eab2b5..84a47b67b29 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -28,6 +28,7 @@ Fixes * Fixed HBondAnalysis not considering PBC for distances (Issue #1878) * Adding new TopologyAttrs with values defined always coerces this into a numpy array (Issue #1876) + * Groups passed to select_atoms() are now type checked (Issue #1852) Changes * TopologyAttrs are now statically typed (Issue #1876) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 42f2ace3885..8726e659846 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -2060,18 +2060,21 @@ def select_atoms(self, sel, *othersel, **selgroups): Added *bonded* selection .. versionchanged:: 0.16.0 Resid selection now takes icodes into account where present. - .. versionadded:: 0.16.0 + .. versionchanged:: 0.16.0 Updating selections now possible by setting the ``updating`` argument. - .. versionadded:: 0.17.0 + .. versionchanged:: 0.17.0 Added *moltype* and *molnum* selections. - + .. versionchanged:: 0.18.1 + Added strict type checking for passed groups """ updating = selgroups.pop('updating', False) sel_strs = (sel,) + othersel for group, thing in selgroups.items(): - if not isinstance(thing, MDAnalysis.core.groups.AtomGroup): - raise TypeError("Only AtomGroup type is allowed for the passed arbitrary atomgroups, you provided type {} for {}".format(str(type(thing)), group)) + if not isinstance(thing, AtomGroup): + raise TypeError("Passed groups must be AtomGroups. " + "You provided {} for group '{}'".format( + thing.__class__.__name__, group)) selections = tuple((selection.Parser.parse(s, selgroups) for s in sel_strs)) diff --git a/testsuite/MDAnalysisTests/core/test_atomselections.py b/testsuite/MDAnalysisTests/core/test_atomselections.py index 4fc679512a0..89c64d18765 100644 --- a/testsuite/MDAnalysisTests/core/test_atomselections.py +++ b/testsuite/MDAnalysisTests/core/test_atomselections.py @@ -1023,12 +1023,8 @@ def test_missing_icodes_range_VE(self, u): with pytest.raises(ValueError): u.select_atoms('resid 10A-12') -class TestArbitraryAtomGroupSelection: - def test_arbitrary_atom_group_raises_error(self): - u = mda.Universe(GRO) - with pytest.raises(TypeError): - u.select_atoms('around 2.0 group this', this=u.atoms[0]) - - def test_arbitrary_atom_group_raises_no_error(self): - u = mda.Universe(GRO) - u.select_atoms('around 2.0 group this', this=u.atoms) + +def test_arbitrary_atom_group_raises_error(): + u = make_Universe(trajectory=True) + with pytest.raises(TypeError): + u.select_atoms('around 2.0 group this', this=u.atoms[0]) From f184da17b39f2812438c553a6427ef3a89d1ef17 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Mon, 7 May 2018 17:12:00 -0400 Subject: [PATCH 031/455] added coveralls token --- .coveralls.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .coveralls.yml diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 00000000000..18bae6d566d --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1,2 @@ +service_name: travis-pro +repo_token: wTp3SXSqCNiZPb5xMojbKrADQXVgbrQFT \ No newline at end of file From 7d60bc504c42dd4db22ee5c69adc8a61ff31bc4d Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Sun, 6 May 2018 12:54:38 -0700 Subject: [PATCH 032/455] add sitemap.xml to sphinx docs - install https://github.com/jdillard/sphinx-sitemap with pip - create sitemap.xml that is correct for the RELEASE docs (it is incorrect for the development docs but we do not want to index the devdocs anyway... but we could change it so that by default it is correct for devdocs and then we fix sitemap.xml when we manually add the release docs with the maintainer/deploy_master_docs.sh script) - see https://github.com/MDAnalysis/MDAnalysis.github.io/issues/78 --- .travis.yml | 2 +- package/doc/sphinx/source/conf.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1c218dfa44f..aa447c96516 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ env: - CONDA_DEPENDENCIES="${CONDA_MIN_DEPENDENCIES} seaborn>=0.7.0 clustalw=2.1 netcdf4 scikit-learn coveralls" - CONDA_CHANNELS='biobuilds conda-forge' - CONDA_CHANNEL_PRIORITY=True - - PIP_DEPENDENCIES="duecredit" + - PIP_DEPENDENCIES="duecredit sphinx-sitemap" - NUMPY_VERSION=stable - INSTALL_HOLE="true" diff --git a/package/doc/sphinx/source/conf.py b/package/doc/sphinx/source/conf.py index d1654716028..58500a79ca2 100644 --- a/package/doc/sphinx/source/conf.py +++ b/package/doc/sphinx/source/conf.py @@ -36,10 +36,17 @@ extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.napoleon', 'sphinx.ext.todo', + 'sphinx_sitemap', 'alabaster'] mathjax_path = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML' +# for sitemap with https://github.com/jdillard/sphinx-sitemap +# NOTE: This sitemap is only correct for the release doccs. The development docs +# are served from https://www.mdanalysis.org/mdanalysis/ and the sitemap.xml +# will NOT be correct for the development docs. +site_url = "https://www.mdanalysis.org/docs/" + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] From 8bab35993272ad9f1c8ad4893f85bd29928450a8 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Mon, 7 May 2018 13:05:45 -0700 Subject: [PATCH 033/455] create doc sitemap.xml for development site and fix for master deployment - sitemap.xml is appropriate for the development docs: thus we do not ship and install a sitemap.xml that is misleading (when installing automatically via Travis CI) - change the loc in the sitemap.xml with the new maintainer/adapt_sitemap.py script: parse XML tree and replace the developer site URL prefix with the release doc prefix - manually create the release docs from master with the maintainer/deploy_master_docs.sh script (which is now calling the adapt_sitemap.py script) --- maintainer/adapt_sitemap.py | 64 +++++++++++++++++++++++++++++++ maintainer/deploy_master_docs.sh | 20 +++++++++- package/doc/sphinx/source/conf.py | 9 +++-- 3 files changed, 88 insertions(+), 5 deletions(-) create mode 100755 maintainer/adapt_sitemap.py diff --git a/maintainer/adapt_sitemap.py b/maintainer/adapt_sitemap.py new file mode 100755 index 00000000000..593b4c4cf4b --- /dev/null +++ b/maintainer/adapt_sitemap.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# +# +# Adjust path in sitemap.xml + +from __future__ import print_function + +from xml.etree import ElementTree +import argparse + +# defaults for MDAnalysis, see https://github.com/MDAnalysis/mdanalysis/pull/1890 +# and https://github.com/MDAnalysis/MDAnalysis.github.io/issues/78 + +RELEASE_URL = "https://www.mdanalysis.org/docs/" +DEVELOP_URL = "https://www.mdanalysis.org/mdanalysis/" + +# change if sitemaps.org updates their schema +NAMESPACE = {"sitemaps": "http://www.sitemaps.org/schemas/sitemap/0.9"} + +def replace_loc(tree, search, replace, namespace=NAMESPACE): + root = tree.getroot() + urls = root.findall("sitemaps:url", namespace) + if len(urls) == 0: + raise ValueError("No sitemaps:url element found: check if the namespace in the XML file " + "is still xmlns='{0[sitemaps]}'".format(namespace)) + for url in urls: + loc = url.find("sitemaps:loc", namespace) + try: + loc.text = loc.text.replace(search, replace) + except AttributError: + raise ValueError("No sitemaps:loc element found: check if the namespace in the XML file " + "is still xmlns='{0[sitemaps]}'".format(namespace)) + return tree + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Change top level loc in sitemap.', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('sitemap', metavar="FILE", + help="path to sitemap.xml file, will be changed in place") + parser.add_argument('--output', '-o', metavar="FILE", + default="sitemap_release.xml", + help="write altered XML to output FILE") + parser.add_argument("--search", "-s", metavar="URL", + default=DEVELOP_URL, + help="search this URL in the loc elements") + parser.add_argument("--replace", "-r", metavar="URL", + default=RELEASE_URL, + help="replace the searched URL with this URL in the loc elements") + args = parser.parse_args() + + + with open(args.sitemap) as xmlfile: + tree = ElementTree.parse(xmlfile) + + tree = replace_loc(tree, args.search, args.replace) + + with open(args.output, "wb") as xmlfile: + tree.write(xmlfile, encoding="utf-8", xml_declaration=True, + default_namespace=NAMESPACE['sitemaps']) + + print("adapt_sitemap.py: Created output file {} with change in loc:".format(args.output)) + print("adapt_sitemap.py: {0} --> {1}".format(args.search, args.replace)) diff --git a/maintainer/deploy_master_docs.sh b/maintainer/deploy_master_docs.sh index 39123162698..2c9d5b8e03a 100755 --- a/maintainer/deploy_master_docs.sh +++ b/maintainer/deploy_master_docs.sh @@ -25,6 +25,14 @@ # (cd package && python setup.py build_sphinx) # +# The release sitemap.xml is generated from the development +# sitemap.xml by changing MDA_DEVELOPMENT_DOCS_URL --> MDA_RELEASE_DOCS_URL +# +# See comment in package/doc/sphinx/source/conf.py for site_url. +# +MDA_RELEASE_DOCS_URL="https://www.mdanalysis.org/docs/" +MDA_DEVELOPMENT_DOCS_URL="https://www.mdanalysis.org/mdanalysis/" + GH_REPOSITORY=github.com/MDAnalysis/docs.git #MDA_DOCDIR=${TRAVIS_BUILD_DIR}/package/doc/html/html MDA_DOCDIR=package/doc/html/html @@ -44,6 +52,9 @@ function die () { } rev=$(git rev-parse --short HEAD) +rootdir="$(git rev-parse --show-toplevel)" + +maintainer_dir="${rootdir}/maintainer" # the following tests should be superfluous because of -o nounset test -n "${GH_TOKEN}" || die "GH_TOKEN is empty: need OAuth GitHub token to continue" 100 @@ -60,7 +71,7 @@ git config user.name "${GIT_CI_USER}" git config user.email "${GIT_CI_EMAIL}" git remote add docs "https://${GH_TOKEN}@${GH_REPOSITORY}" -git fetch --depth 50 docs master +git fetch --depth 10 docs master git reset docs/master touch . @@ -68,6 +79,13 @@ touch .nojekyll git add -A . git commit -m "rebuilt html docs from branch ${GH_DOC_BRANCH} with sphinx at MDAnalysis/mdanalysis@${rev}" + +# fix sitemap.xml for release docs +${maintainer_dir}/adapt_sitemap.py --search ${MDA_DEVELOPMENT_DOCS_URL} --replace ${MDA_RELEASE_DOCS_URL} -o sitemap.xml sitemap.xml + +git add sitemap.xml +git commit -m "adjusted sitemap.xml for release docs at ${MDA_RELEASE_DOCS_URL}" + git push -q docs HEAD:master diff --git a/package/doc/sphinx/source/conf.py b/package/doc/sphinx/source/conf.py index 58500a79ca2..f1cfeceee83 100644 --- a/package/doc/sphinx/source/conf.py +++ b/package/doc/sphinx/source/conf.py @@ -42,10 +42,11 @@ mathjax_path = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML' # for sitemap with https://github.com/jdillard/sphinx-sitemap -# NOTE: This sitemap is only correct for the release doccs. The development docs -# are served from https://www.mdanalysis.org/mdanalysis/ and the sitemap.xml -# will NOT be correct for the development docs. -site_url = "https://www.mdanalysis.org/docs/" +# NOTE: This sitemap is only correct for the DEVELOPMENT doccs. The RELEASE docs +# are served from https://www.mdanalysis.org/docs/ and the sitemap.xml +# is manually fixed when deploying the release docs with the +# maintainer/deploy_master_docs.sh script +site_url = "https://www.mdanalysis.org/mdanalysis/" # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] From be4a4179f13c2a9dde88cd5ad88f84457a306eea Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 6 May 2018 13:56:17 -0400 Subject: [PATCH 034/455] Added lammps dump reference file --- .../MDAnalysisTests/data/lammps/wat.lammpstrj | 99 +++++++++++++++++++ testsuite/MDAnalysisTests/datafiles.py | 2 + testsuite/setup.py | 2 +- 3 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj diff --git a/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj b/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj new file mode 100644 index 00000000000..37befa4ef40 --- /dev/null +++ b/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj @@ -0,0 +1,99 @@ +ITEM: TIMESTEP +0 +ITEM: NUMBER OF ATOMS +24 +ITEM: BOX BOUNDS pp pp pp +0.0000000000000000e+00 6.2000000000000002e+00 +0.0000000000000000e+00 6.2000000000000002e+00 +0.0000000000000000e+00 6.2000000000000002e+00 +ITEM: ATOMS id type xs ys zs +1 2 0.25 0.25 0.241936 +2 1 0.25 0.381692 0.335058 +3 1 0.25 0.118308 0.335058 +13 2 0.25 0.25 0.741936 +14 1 0.25 0.381692 0.835058 +15 1 0.25 0.118308 0.835058 +7 2 0.25 0.75 0.241936 +8 1 0.25 0.881692 0.335058 +9 1 0.25 0.618308 0.335058 +19 2 0.25 0.75 0.741936 +20 1 0.25 0.881692 0.835058 +21 1 0.25 0.618308 0.835058 +4 2 0.75 0.25 0.241936 +5 1 0.75 0.381692 0.335058 +6 1 0.75 0.118308 0.335058 +16 2 0.75 0.25 0.741936 +17 1 0.75 0.381692 0.835058 +18 1 0.75 0.118308 0.835058 +10 2 0.75 0.75 0.241936 +11 1 0.75 0.881692 0.335058 +12 1 0.75 0.618308 0.335058 +22 2 0.75 0.75 0.741936 +23 1 0.75 0.881692 0.835058 +24 1 0.75 0.618308 0.835058 +ITEM: TIMESTEP +500 +ITEM: NUMBER OF ATOMS +24 +ITEM: BOX BOUNDS pp pp pp +2.1427867124774069e-01 5.9857213287522608e+00 +2.1427867124774069e-01 5.9857213287522608e+00 +2.1427867124774069e-01 5.9857213287522608e+00 +ITEM: ATOMS id type xs ys zs +1 2 0.278215 0.12611 0.322087 +2 1 0.419229 0.0963968 0.22581 +3 1 0.326078 0.183441 0.478483 +13 2 0.394618 0.263115 0.798295 +14 1 0.33327 0.406617 0.873669 +15 1 0.56664 0.275761 0.781396 +7 2 0.172549 0.633511 0.237899 +8 1 0.337181 0.65854 0.285938 +9 1 0.136246 0.734083 0.101499 +19 2 0.143421 0.854531 0.779421 +20 1 0.138083 0.84979 0.606258 +21 1 0.287323 -0.063525 0.830558 +4 2 0.826394 0.340196 0.492484 +5 1 0.838175 0.302551 0.661249 +6 1 0.975131 0.299059 0.413603 +16 2 0.852765 0.296579 0.961632 +17 1 0.837169 0.449493 0.0417052 +18 1 0.98021 0.205361 0.0356204 +10 2 0.667956 0.748774 0.961347 +11 1 0.651409 0.752752 0.133823 +12 1 0.825815 0.805015 0.917145 +22 2 0.609818 0.720116 0.441249 +23 1 0.693115 0.568674 0.454077 +24 1 0.516269 0.74692 0.584663 +ITEM: TIMESTEP +1000 +ITEM: NUMBER OF ATOMS +24 +ITEM: BOX BOUNDS pp pp pp +-5.4458069063278991e-03 6.2054458069063330e+00 +-5.4458069063278991e-03 6.2054458069063330e+00 +-5.4458069063278991e-03 6.2054458069063330e+00 +ITEM: ATOMS id type xs ys zs +1 2 0.507123 1.00424 0.280972 +2 1 0.44857 0.127381 0.36659 +3 1 0.457188 0.865453 0.345515 +13 2 0.332363 0.30544 0.641589 +14 1 0.183362 0.279208 0.586516 +15 1 0.337725 0.273331 0.799266 +7 2 0.154955 0.592958 0.179249 +8 1 0.0364823 0.533235 0.270461 +9 1 0.0951073 0.704636 0.0799102 +19 2 0.182998 0.98073 0.92225 +20 1 0.232236 0.885156 0.802402 +21 1 0.307536 0.0145782 0.0185147 +4 2 0.86639 0.267588 0.45692 +5 1 0.821284 0.305404 0.606778 +6 1 0.739673 0.210757 0.375465 +16 2 0.785958 0.296464 0.911263 +17 1 0.801267 0.45559 0.930395 +18 1 0.859657 0.220486 1.03258 +10 2 0.727608 0.814653 0.962399 +11 1 0.637062 0.884451 0.0757645 +12 1 0.865474 0.896197 0.946095 +22 2 0.454407 0.738168 0.629281 +23 1 0.425499 0.580843 0.610971 +24 1 0.564523 0.759408 0.744805 diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 97a791fdd55..a751151667b 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -118,6 +118,7 @@ "LAMMPScnt", "LAMMPScnt2", # triclinic box "LAMMPShyd", "LAMMPShyd2", "LAMMPSdata_deletedatoms", # with deleted atoms + "LAMMPSDUMP", "unordered_res", # pdb file with resids non sequential "GMS_ASYMOPT", # GAMESS C1 optimization "GMS_SYMOPT", # GAMESS D4h optimization @@ -364,6 +365,7 @@ LAMMPShyd = resource_filename(__name__, "data/lammps/hydrogen-class1.data") LAMMPShyd2 = resource_filename(__name__, "data/lammps/hydrogen-class1.data2") LAMMPSdata_deletedatoms = resource_filename(__name__, 'data/lammps/deletedatoms.data') +LAMMPSDUMP = resource_filename(__name__, "data/lammps/wat.lammpstrj") unordered_res = resource_filename(__name__, "data/unordered_res.pdb") diff --git a/testsuite/setup.py b/testsuite/setup.py index cc05b08f39d..c1bb999ab3c 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -198,7 +198,7 @@ def dynamic_author_list(): 'data/lammps/*.data', 'data/lammps/*.data.bz2', 'data/lammps/*.data2', 'data/lammps/*.dcd', 'data/lammps/*.trz', - 'data/lammps/*.inp', + 'data/lammps/*.inp', 'data/lammps/*.lammpstrj', 'data/gms/*.xyz', 'data/gms/*.gms', 'data/gms/*.gms.gz', 'data/*.inpcrd', From 02bf09bb95009b1b0e51e185ce3d51f864fb5342 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 6 May 2018 13:58:46 -0400 Subject: [PATCH 035/455] Lammps dump parser finished --- package/MDAnalysis/coordinates/LAMMPS.py | 90 ++++++++++++++++++- package/MDAnalysis/topology/LAMMPSParser.py | 43 +++++++++ .../topology/test_lammpsdata.py | 31 +++++++ 3 files changed, 162 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index e5d14fcbd29..482c9280b80 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -115,12 +115,14 @@ """ from __future__ import absolute_import -from six.moves import zip, range +from six.moves import zip, range, map +import os import numpy as np from ..core import flags from ..core.groups import requires -from ..lib import util, mdamath +from ..lib import util, mdamath, distances +from ..lib.util import cached from . import DCD from .. import units from ..topology.LAMMPSParser import DATAParser @@ -443,3 +445,87 @@ def write(self, selection, frame=None): if has_velocities: self._write_velocities(atoms) + + +class DumpReader(base.ReaderBase): + """Reads the default LAMMPS dump format + + .. versionadded:: 0.18.1 + """ + format = 'LAMMPSDUMP' + + def __init__(self, filename, **kwargs): + super(DumpReader, self).__init__(filename, **kwargs) + + root, ext = os.path.splitext(self.filename) + self._file = util.anyopen(self.filename) + self._cache = {} + + self.ts = self._Timestep(self.n_atoms, **self._ts_kwargs) + + self._read_next_timestep() + + @property + @cached('n_atoms') + def n_atoms(self): + with util.anyopen(self.filename) as f: + f.readline() + f.readline() + f.readline() + n_atoms = int(f.readline()) + return n_atoms + + def close(self): + self._file.close() + + def _read_next_timestep(self): + f = self._file + ts = self.ts + + f.readline() # ITEM TIMESTEP + step_num = int(f.readline()) + ts.data['step'] = step_num + + f.readline() # ITEM NUMBER OF ATOMS + n_atoms = int(f.readline()) + if n_atoms != self.n_atoms: + raise ValueError("Number of atoms in trajectory changed " + "this is not suported in MDAnalysis") + + triclinic = len(f.readline().split()) == 9 # ITEM BOX BOUNDS + if triclinic: + xlo, xhi, xy = map(float, f.readline().split()) + ylo, yhi, xz = map(float, f.readline().split()) + zlo, zhi, yz = map(float, f.readline().split()) + + box = np.zeros((3, 3), dtype=np.float64) + box[0] = xhi - xlo, 0.0, 0.0 + box[1] = xy, yhi - ylo, 0.0 + box[2] = xz, yz, zhi - zlo + + xlen, ylen, zlen, alpha, beta, gamma = mdamath.triclinic_box(*box) + else: + xlo, xhi = map(float, f.readline().split()) + ylo, yhi = map(float, f.readline().split()) + zlo, zhi = map(float, f.readline().split()) + xlen = xhi - xlo + ylen = yhi - ylo + zlen = zhi - zlo + alpha = beta = gamma = 90. + ts.dimensions = xlen, ylen, zlen, alpha, beta, gamma + + indices = np.zeros(self.n_atoms, dtype=int) + + f.readline() # ITEM ATOMS etc + for i in range(self.n_atoms): + idx, _, xs, ys, zs = f.readline().split() + + indices[i] = idx + ts.positions[i] = xs, ys, zs + + order = np.argsort(indices) + ts.positions = ts.positions[order] + # by default coordinates are given in scaled format, undo that + ts.positions = distances.transform_StoR(ts.positions, ts.dimensions) + + return ts diff --git a/package/MDAnalysis/topology/LAMMPSParser.py b/package/MDAnalysis/topology/LAMMPSParser.py index 3d780b8b94e..7f5e048407e 100644 --- a/package/MDAnalysis/topology/LAMMPSParser.py +++ b/package/MDAnalysis/topology/LAMMPSParser.py @@ -80,6 +80,7 @@ import logging import string import functools +import warnings from . import guessers from ..lib.util import openany, conv_float @@ -575,6 +576,48 @@ def _parse_box(self, header): return unitcell +class LammpsDumpParser(TopologyReaderBase): + format = 'LAMMPSDUMP' + + def parse(self, **kwargs): + with openany(self.filename) as fin: + fin.readline() # ITEM TIMESTEP + fin.readline() # 0 + + fin.readline() # ITEM NUMBER OF ATOMS + natoms = int(fin.readline()) + + fin.readline() # ITEM BOX + fin.readline() # x + fin.readline() # y + fin.readline() # z + + indices = np.zeros(natoms, dtype=int) + types = np.zeros(natoms, dtype=object) + + fin.readline() # ITEM ATOMS + for i in range(natoms): + idx, atype, _, _, _ = fin.readline().split() + + indices[i] = idx + types[i] = atype + + order = np.argsort(indices) + indices = indices[order] + types = types[order] + + attrs = [] + attrs.append(Atomids(indices)) + attrs.append(Atomtypes(types)) + attrs.append(Masses(np.ones(natoms, dtype=np.float64), guessed=True)) + warnings.warn('Guessed all Masses to 1.0') + attrs.append(Resids(np.array([1], dtype=int))) + attrs.append(Resnums(np.array([1], dtype=int))) + attrs.append(Segids(np.array(['SYSTEM'], dtype=object))) + + return Topology(natoms, 1, 1, attrs=attrs) + + @functools.total_ordering class LAMMPSAtom(object): # pragma: no cover __slots__ = ("index", "name", "type", "chainid", "charge", "mass", "_positions") diff --git a/testsuite/MDAnalysisTests/topology/test_lammpsdata.py b/testsuite/MDAnalysisTests/topology/test_lammpsdata.py index 9a094bdf222..98360215853 100644 --- a/testsuite/MDAnalysisTests/topology/test_lammpsdata.py +++ b/testsuite/MDAnalysisTests/topology/test_lammpsdata.py @@ -35,6 +35,7 @@ LAMMPShyd, LAMMPShyd2, LAMMPSdata_deletedatoms, + LAMMPSDUMP, ) @@ -237,3 +238,33 @@ def test_interpret_atom_style_missing(): match='atom_style string missing required.+?'): style = mda.topology.LAMMPSParser.DATAParser._interpret_atom_style( 'id charge z y x') + + +class TestDumpParser(ParserBase): + expected_attrs = ['types'] + guessed_attrs = ['masses'] + expected_n_atoms = 24 + expected_n_residues = 1 + expected_n_segments = 1 + + parser = mda.topology.LAMMPSParser.LammpsDumpParser + ref_filename = LAMMPSDUMP + + def test_creates_universe(self): + u = mda.Universe(self.ref_filename, format='LAMMPSDUMP') + + assert isinstance(u, mda.Universe) + assert len(u.atoms) == 24 + + def test_masses_warning(self): + # masses are mandatory, but badly guessed + # check that user is alerted + with self.parser(self.ref_filename) as p: + with pytest.warns(UserWarning, match='Guessed all Masses to 1.0'): + p.parse() + + def test_id_ordering(self): + # ids are nonsequential in file, but should get rearranged + u = mda.Universe(self.ref_filename, format='LAMMPSDUMP') + # the 4th in file has id==13, but should have been sorted + assert u.atoms[3].id == 4 From 438e80af6ffc28502d2cf93db5f95dbe625d6755 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 6 May 2018 15:44:16 -0400 Subject: [PATCH 036/455] Finished tests for lammps dump reader --- package/MDAnalysis/coordinates/LAMMPS.py | 42 +++++++++- .../coordinates/test_lammps.py | 82 ++++++++++++++++++- 2 files changed, 119 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index 482c9280b80..7fd6527332f 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -458,13 +458,21 @@ def __init__(self, filename, **kwargs): super(DumpReader, self).__init__(filename, **kwargs) root, ext = os.path.splitext(self.filename) - self._file = util.anyopen(self.filename) self._cache = {} - self.ts = self._Timestep(self.n_atoms, **self._ts_kwargs) + self._reopen() self._read_next_timestep() + def _reopen(self): + try: + self._file.close() + except AttributeError: + pass + self._file = util.anyopen(self.filename) + self.ts = self._Timestep(self.n_atoms, **self._ts_kwargs) + self.ts.frame = -1 + @property @cached('n_atoms') def n_atoms(self): @@ -474,13 +482,39 @@ def n_atoms(self): f.readline() n_atoms = int(f.readline()) return n_atoms - + + @property + @cached('n_frames') + def n_frames(self): + # 2(timestep) + 2(natoms info) + 4(box info) + 1(atom header) + n_atoms + lines_per_frame = self.n_atoms + 9 + offsets = [] + counter = 0 + with util.anyopen(self.filename) as f: + line = True + while line: + if not counter % lines_per_frame: + offsets.append(f.tell()) + line = f.readline() + counter += 1 + self._offsets = offsets[:-1] # last is EOF + return len(self._offsets) + def close(self): self._file.close() + def _read_frame(self, frame): + self._file.seek(self._offsets[frame]) + self.ts.frame = frame - 1 # gets +1'd in next + + return self._read_next_timestep() + def _read_next_timestep(self): f = self._file ts = self.ts + ts.frame += 1 + if ts.frame >= len(self): + raise EOFError f.readline() # ITEM TIMESTEP step_num = int(f.readline()) @@ -513,7 +547,7 @@ def _read_next_timestep(self): zlen = zhi - zlo alpha = beta = gamma = 90. ts.dimensions = xlen, ylen, zlen, alpha, beta, gamma - + indices = np.zeros(self.n_atoms, dtype=int) f.readline() # ITEM ATOMS etc diff --git a/testsuite/MDAnalysisTests/coordinates/test_lammps.py b/testsuite/MDAnalysisTests/coordinates/test_lammps.py index 93a47966705..b9a900dc4f6 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_lammps.py +++ b/testsuite/MDAnalysisTests/coordinates/test_lammps.py @@ -20,6 +20,8 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # from __future__ import absolute_import +from six.moves import zip + import os import numpy as np import pytest @@ -34,7 +36,7 @@ RefLAMMPSData, RefLAMMPSDataMini, RefLAMMPSDataDCD, ) from MDAnalysisTests.datafiles import ( - LAMMPScnt, LAMMPShyd, LAMMPSdata, LAMMPSdata_mini + LAMMPScnt, LAMMPShyd, LAMMPSdata, LAMMPSdata_mini, LAMMPSDUMP ) @@ -393,3 +395,81 @@ def test_write_non_numerical_types(self, tmpout): assert 'must be convertible to integers' in e.args[0] else: raise pytest.fail() + + +class TestLammpsDumpReader(object): + @pytest.fixture() + def u(self): + return mda.Universe(LAMMPSDUMP, format='LAMMPSDUMP') + + @pytest.fixture() + def reference_positions(self): + # manually copied from traj file + data = {} + + # at timestep 500 + lo, hi = float(2.1427867124774069e-01), float(5.9857213287522608e+00) + length1 = hi - lo + # at timestep 1000 + lo, hi = float(-5.4458069063278991e-03), float(6.2054458069063330e+00) + length2 = hi - lo + boxes = [ + np.array([6.2, 6.2, 6.2, 90., 90., 90.]), + np.array([length1, length1, length1, 90., 90., 90.]), + np.array([length2, length2, length2, 90., 90., 90.]), + ] + data['box'] = boxes + + # data for atom id 1 in traj (ie first in frame) + # isn't sensitive to required sorting + atom1_pos1 = np.array([0.25, 0.25, 0.241936]) * boxes[0][:3] + atom1_pos2 = np.array([0.278215, 0.12611, 0.322087]) * boxes[1][:3] + atom1_pos3 = np.array([0.507123, 1.00424, 0.280972]) * boxes[2][:3] + data['atom1_pos'] = [atom1_pos1, atom1_pos2, atom1_pos3] + # data for atom id 13 + # *is* sensitive to reordering of positions + # normally appears 4th in traj data + atom13_pos1 = np.array([0.25, 0.25, 0.741936]) * boxes[0][:3] + atom13_pos2 = np.array([0.394618, 0.263115, 0.798295]) * boxes[1][:3] + atom13_pos3 = np.array([0.332363, 0.30544, 0.641589]) * boxes[2][:3] + data['atom13_pos'] = [atom13_pos1, atom13_pos2, atom13_pos3] + + return data + + def test_n_atoms(self, u): + assert len(u.atoms) == 24 + + def test_length(self, u): + assert len(u.trajectory) == 3 + for i, ts in enumerate(u.trajectory): + assert ts.frame == i + assert ts.data['step'] == i * 500 + for i, ts in enumerate(u.trajectory): + assert ts.frame == i + assert ts.data['step'] == i * 500 + + def test_seeking(self, u, reference_positions): + u.trajectory[1] + + assert_almost_equal(u.dimensions, reference_positions['box'][1], + decimal=5) + assert_almost_equal(u.atoms[0].position, + reference_positions['atom1_pos'][1], + decimal=5) + assert_almost_equal(u.atoms[12].position, + reference_positions['atom13_pos'][1], + decimal=5) + + def test_boxsize(self, u, reference_positions): + for ts, box in zip(u.trajectory, + reference_positions['box']): + assert_almost_equal(ts.dimensions, box, decimal=5) + + def test_atom_reordering(self, u, reference_positions): + atom1 = u.atoms[0] + atom13 = u.atoms[12] + for ts, atom1_pos, atom13_pos in zip(u.trajectory, + reference_positions['atom1_pos'], + reference_positions['atom13_pos']): + assert_almost_equal(atom1.position, atom1_pos, decimal=5) + assert_almost_equal(atom13.position, atom13_pos, decimal=5) From 5d5777eb277ddf6a98e36dfe6711b8743c1bbafc Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 6 May 2018 16:37:57 -0400 Subject: [PATCH 037/455] docs for lammps dump format --- package/MDAnalysis/coordinates/LAMMPS.py | 18 +++++++++++++++--- package/MDAnalysis/coordinates/__init__.py | 2 ++ package/MDAnalysis/topology/LAMMPSParser.py | 12 +++++++++++- package/MDAnalysis/topology/__init__.py | 3 +++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index 7fd6527332f..b85f509e4d2 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -24,8 +24,8 @@ """LAMMPS DCD trajectory and DATA I/O --- :mod:`MDAnalysis.coordinates.LAMMPS` =============================================================================== -Classes to read and write LAMMPS_ DCD binary trajectories and LAMMPS DATA -files. Trajectories can be read regardless of system-endianness +Classes to read and write LAMMPS_ DCD binary trajectories, LAMMPS DATA files +and LAMMPS dump files. Trajectories can be read regardless of system-endianness as this is auto-detected. LAMMPS can `write DCD`_ trajectories but unlike a `CHARMM trajectory`_ @@ -51,6 +51,12 @@ By default either the `atomic` or `full` atom styles are expected, however this can be customised, see :ref:`atom_style_kwarg`. +Dump files +---------- + +The DumpReader expects ascii dump files written with the default +`LAMMPS dump format`_ of 'atom' + Example: Loading a LAMMPS simulation ------------------------------------ @@ -95,6 +101,7 @@ .. _units command: http://lammps.sandia.gov/doc/units.html .. _`Issue 64`: https://github.com/MDAnalysis/mdanalysis/issues/64 .. _`Issue 84`: https://github.com/MDAnalysis/mdanalysis/issues/84 +.. _`LAMMPS dump format`: http://lammps.sandia.gov/doc/dump.html Classes ------- @@ -448,7 +455,12 @@ def write(self, selection, frame=None): class DumpReader(base.ReaderBase): - """Reads the default LAMMPS dump format + """Reads the default `LAMMPS dump format`_ + + Expects trajectories produced by the default 'atom' style dump. + + Will automatically convert positions from their scaled/fractional + representation to their real values. .. versionadded:: 0.18.1 """ diff --git a/package/MDAnalysis/coordinates/__init__.py b/package/MDAnalysis/coordinates/__init__.py index dfe69c3fdcf..6246672c589 100644 --- a/package/MDAnalysis/coordinates/__init__.py +++ b/package/MDAnalysis/coordinates/__init__.py @@ -172,6 +172,8 @@ class can choose an appropriate reader automatically. +---------------+-----------+-------+------------------------------------------------------+ | LAMMPS [#a]_ | data | r | Single frame of coordinates read from .data files | +---------------+-----------+-------+------------------------------------------------------+ + | LAMMPS [#a]_ | lammpsdump| r | Ascii trajectory in atom style | + +---------------+-----------+-------+------------------------------------------------------+ | Gromacs | xtc | r/w | Compressed (lossy) xtc trajectory format. Module | | | | | :mod:`MDAnalysis.coordinates.XTC` | +---------------+-----------+-------+------------------------------------------------------+ diff --git a/package/MDAnalysis/topology/LAMMPSParser.py b/package/MDAnalysis/topology/LAMMPSParser.py index 7f5e048407e..caa8a9ab73c 100644 --- a/package/MDAnalysis/topology/LAMMPSParser.py +++ b/package/MDAnalysis/topology/LAMMPSParser.py @@ -24,10 +24,11 @@ LAMMPSParser ============ -Parses data_ files produced by LAMMPS_. +Parses data_ or dump_ files produced by LAMMPS_. .. _LAMMPS: http://lammps.sandia.gov/ .. _data: DATA file format: :http://lammps.sandia.gov/doc/2001/data_format.html +.. _dump: http://lammps.sandia.gov/doc/dump.html .. _atom_style_kwarg: @@ -65,6 +66,9 @@ :members: :inherited-members: +.. autoclass:: LammpsDumpParser + :members: + Deprecated classes ------------------ @@ -577,6 +581,12 @@ def _parse_box(self, header): class LammpsDumpParser(TopologyReaderBase): + """Parses Lammps ascii dump files in 'atom' format + + Only reads atom ids. Sets all masses to 1.0. + + .. versionadded:: 0.18.1 + """ format = 'LAMMPSDUMP' def parse(self, **kwargs): diff --git a/package/MDAnalysis/topology/__init__.py b/package/MDAnalysis/topology/__init__.py index 073ab93313e..8afd6fec182 100644 --- a/package/MDAnalysis/topology/__init__.py +++ b/package/MDAnalysis/topology/__init__.py @@ -118,6 +118,9 @@ resids, bonds, angles, dihedrals + LAMMPS [#a]_ lammpsdump id, masses LAMMPS ascii dump file reader + :mod:`MDAnalysis.topology.LAMMPSParser` + XYZ [#a]_ xyz names XYZ File Parser. Reads only the labels from atoms and constructs minimal topology data. :mod:`MDAnalysis.topology.XYZParser` From 45bdbd834b729d54dc4ede1fd7f8debf10a69669 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Thu, 10 May 2018 11:37:19 -0400 Subject: [PATCH 038/455] switched lammps test file to bz2 compression --- .../MDAnalysisTests/data/lammps/wat.lammpstrj | 99 ------------------ .../data/lammps/wat.lammpstrj.bz2 | Bin 0 -> 1006 bytes testsuite/MDAnalysisTests/datafiles.py | 2 +- testsuite/setup.py | 5 +- 4 files changed, 2 insertions(+), 104 deletions(-) delete mode 100644 testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj create mode 100644 testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj.bz2 diff --git a/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj b/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj deleted file mode 100644 index 37befa4ef40..00000000000 --- a/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj +++ /dev/null @@ -1,99 +0,0 @@ -ITEM: TIMESTEP -0 -ITEM: NUMBER OF ATOMS -24 -ITEM: BOX BOUNDS pp pp pp -0.0000000000000000e+00 6.2000000000000002e+00 -0.0000000000000000e+00 6.2000000000000002e+00 -0.0000000000000000e+00 6.2000000000000002e+00 -ITEM: ATOMS id type xs ys zs -1 2 0.25 0.25 0.241936 -2 1 0.25 0.381692 0.335058 -3 1 0.25 0.118308 0.335058 -13 2 0.25 0.25 0.741936 -14 1 0.25 0.381692 0.835058 -15 1 0.25 0.118308 0.835058 -7 2 0.25 0.75 0.241936 -8 1 0.25 0.881692 0.335058 -9 1 0.25 0.618308 0.335058 -19 2 0.25 0.75 0.741936 -20 1 0.25 0.881692 0.835058 -21 1 0.25 0.618308 0.835058 -4 2 0.75 0.25 0.241936 -5 1 0.75 0.381692 0.335058 -6 1 0.75 0.118308 0.335058 -16 2 0.75 0.25 0.741936 -17 1 0.75 0.381692 0.835058 -18 1 0.75 0.118308 0.835058 -10 2 0.75 0.75 0.241936 -11 1 0.75 0.881692 0.335058 -12 1 0.75 0.618308 0.335058 -22 2 0.75 0.75 0.741936 -23 1 0.75 0.881692 0.835058 -24 1 0.75 0.618308 0.835058 -ITEM: TIMESTEP -500 -ITEM: NUMBER OF ATOMS -24 -ITEM: BOX BOUNDS pp pp pp -2.1427867124774069e-01 5.9857213287522608e+00 -2.1427867124774069e-01 5.9857213287522608e+00 -2.1427867124774069e-01 5.9857213287522608e+00 -ITEM: ATOMS id type xs ys zs -1 2 0.278215 0.12611 0.322087 -2 1 0.419229 0.0963968 0.22581 -3 1 0.326078 0.183441 0.478483 -13 2 0.394618 0.263115 0.798295 -14 1 0.33327 0.406617 0.873669 -15 1 0.56664 0.275761 0.781396 -7 2 0.172549 0.633511 0.237899 -8 1 0.337181 0.65854 0.285938 -9 1 0.136246 0.734083 0.101499 -19 2 0.143421 0.854531 0.779421 -20 1 0.138083 0.84979 0.606258 -21 1 0.287323 -0.063525 0.830558 -4 2 0.826394 0.340196 0.492484 -5 1 0.838175 0.302551 0.661249 -6 1 0.975131 0.299059 0.413603 -16 2 0.852765 0.296579 0.961632 -17 1 0.837169 0.449493 0.0417052 -18 1 0.98021 0.205361 0.0356204 -10 2 0.667956 0.748774 0.961347 -11 1 0.651409 0.752752 0.133823 -12 1 0.825815 0.805015 0.917145 -22 2 0.609818 0.720116 0.441249 -23 1 0.693115 0.568674 0.454077 -24 1 0.516269 0.74692 0.584663 -ITEM: TIMESTEP -1000 -ITEM: NUMBER OF ATOMS -24 -ITEM: BOX BOUNDS pp pp pp --5.4458069063278991e-03 6.2054458069063330e+00 --5.4458069063278991e-03 6.2054458069063330e+00 --5.4458069063278991e-03 6.2054458069063330e+00 -ITEM: ATOMS id type xs ys zs -1 2 0.507123 1.00424 0.280972 -2 1 0.44857 0.127381 0.36659 -3 1 0.457188 0.865453 0.345515 -13 2 0.332363 0.30544 0.641589 -14 1 0.183362 0.279208 0.586516 -15 1 0.337725 0.273331 0.799266 -7 2 0.154955 0.592958 0.179249 -8 1 0.0364823 0.533235 0.270461 -9 1 0.0951073 0.704636 0.0799102 -19 2 0.182998 0.98073 0.92225 -20 1 0.232236 0.885156 0.802402 -21 1 0.307536 0.0145782 0.0185147 -4 2 0.86639 0.267588 0.45692 -5 1 0.821284 0.305404 0.606778 -6 1 0.739673 0.210757 0.375465 -16 2 0.785958 0.296464 0.911263 -17 1 0.801267 0.45559 0.930395 -18 1 0.859657 0.220486 1.03258 -10 2 0.727608 0.814653 0.962399 -11 1 0.637062 0.884451 0.0757645 -12 1 0.865474 0.896197 0.946095 -22 2 0.454407 0.738168 0.629281 -23 1 0.425499 0.580843 0.610971 -24 1 0.564523 0.759408 0.744805 diff --git a/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj.bz2 b/testsuite/MDAnalysisTests/data/lammps/wat.lammpstrj.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..a008021d7344f40a98613303cb2297ae084b4d81 GIT binary patch literal 1006 zcmVv;t0AnVZ115$+k){M-i6S*MHc_O) zdP5^^Nt$`6;z;#&Tm#I@VJ3yyF-0>{S&Pv;EAJC%sFn)%AEC#KD6*mE{pb?`RZ^H) zl81ckR<^_#ITpjI0@z*3n1FyFgd7JB97Raf2ufVV!y-@xoJ_sY3GPN0w6O}8!ZRkK zGHO6dsI?kVc(4VEM2ZdrhYlvlOhcGKk|0v#9T2E$;25w~v@ul{2x3KE%DcA~rtV3R z2u6yXyStQ~>Mhgl1B=?$v7Jo~F;=TdcJ5E3R`9~adJ zHZU`RULzirJb|+?1JIdhC{l`QjWRs!45lI&l>;~$M6Bpcu_-YEID1`NiU)fu6(GI~ zpd9!QQ}nLU)h#rm(q(|lQs*>G+g)L)XWP;Md1~>9r%h9V0!eX?2FMK-dtQ;*5mD92ewE$d5f7nnwq(-e!)bq_cXM^GiWJb(>AxqFq&r$xTA zOsH*LRnrAUN`^UkFjtH(NNIk4j&+554v2W+-9c!84l!#SCiVt8!Lp!RtC?Z~;)zG; ziP*47B$7!a-tYsWt|{WPuWn6lSU^nBYngj`Qpt^zI<%H-@#Wr=ZL@ACHFH5AjKs0L z9tvc%HaObnLPeHHH+K`6UELFn-I+1F4R_TSuMawG&c=gI;F3>0+N77^Ye@*gSgM4e z;_U3!ngDIbvs?CSwngs{8E;WWrje3MD3|l(@v(g?xvRIL8NKN^$ZUq`tPGCQ;P1eXD)-ezr!xL1Ht$E9yGy0uF21R)oXwM#ah(_wtM z?1xAfU@-v4EqbzQ=J5}VYjjN)ad9ek8fbPps)y;N?-FQWkTF z*J@gELl@@wfZjtE5Bcb?vv;FsydQ9PcXAqZ9LIp>JO_530RG%Nj;|5;eV;SD@FcH? co9OXyhto)PdbVsmSU+O!NT&)C55K7m;G{6WI{*Lx literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index a751151667b..b4a4068878e 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -365,7 +365,7 @@ LAMMPShyd = resource_filename(__name__, "data/lammps/hydrogen-class1.data") LAMMPShyd2 = resource_filename(__name__, "data/lammps/hydrogen-class1.data2") LAMMPSdata_deletedatoms = resource_filename(__name__, 'data/lammps/deletedatoms.data') -LAMMPSDUMP = resource_filename(__name__, "data/lammps/wat.lammpstrj") +LAMMPSDUMP = resource_filename(__name__, "data/lammps/wat.lammpstrj.bz2") unordered_res = resource_filename(__name__, "data/unordered_res.pdb") diff --git a/testsuite/setup.py b/testsuite/setup.py index c1bb999ab3c..9a9ab977f66 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -195,10 +195,7 @@ def dynamic_author_list(): 'data/mol2/*.mol2', 'data/contacts/*.gro.bz2', 'data/contacts/*.dat', 'data/capping/*.gro', 'data/capping/*.pdb', - 'data/lammps/*.data', 'data/lammps/*.data.bz2', - 'data/lammps/*.data2', - 'data/lammps/*.dcd', 'data/lammps/*.trz', - 'data/lammps/*.inp', 'data/lammps/*.lammpstrj', + 'data/lammps/*', 'data/gms/*.xyz', 'data/gms/*.gms', 'data/gms/*.gms.gz', 'data/*.inpcrd', From 002770bf9dba7bb5c08064fe1f8ad84ef077cd99 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Thu, 10 May 2018 11:37:34 -0400 Subject: [PATCH 039/455] added loop over compression types for lammps tests --- .../coordinates/test_lammps.py | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_lammps.py b/testsuite/MDAnalysisTests/coordinates/test_lammps.py index b9a900dc4f6..5fdad691f8b 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_lammps.py +++ b/testsuite/MDAnalysisTests/coordinates/test_lammps.py @@ -22,6 +22,8 @@ from __future__ import absolute_import from six.moves import zip +import bz2 +import gzip import os import numpy as np import pytest @@ -398,9 +400,26 @@ def test_write_non_numerical_types(self, tmpout): class TestLammpsDumpReader(object): - @pytest.fixture() - def u(self): - return mda.Universe(LAMMPSDUMP, format='LAMMPSDUMP') + @pytest.fixture( + params=['ascii', 'bz2', 'gzip'] + ) + def u(self, tmpdir, request): + trjtype = request.param + if trjtype == 'bz2': + # no conversion needed + f = LAMMPSDUMP + else: + f = str(tmpdir.join('lammps.' + trjtype)) + with bz2.BZ2File(LAMMPSDUMP, 'rb') as datain: + data = datain.read() + if trjtype == 'ascii': + with open(f, 'wb') as fout: + fout.write(data) + elif trjtype == 'gzip': + with gzip.GzipFile(f, 'wb') as fout: + fout.write(data) + + yield mda.Universe(f, format='LAMMPSDUMP') @pytest.fixture() def reference_positions(self): From 4b31257fe5169578bc64fac13f1b0047aae741a7 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Fri, 11 May 2018 13:23:39 -0400 Subject: [PATCH 040/455] redo DumpReader.close to make linter happy --- package/MDAnalysis/coordinates/LAMMPS.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index b85f509e4d2..0d138bf9032 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -477,10 +477,7 @@ def __init__(self, filename, **kwargs): self._read_next_timestep() def _reopen(self): - try: - self._file.close() - except AttributeError: - pass + self.close() self._file = util.anyopen(self.filename) self.ts = self._Timestep(self.n_atoms, **self._ts_kwargs) self.ts.frame = -1 @@ -513,7 +510,8 @@ def n_frames(self): return len(self._offsets) def close(self): - self._file.close() + if hasattr(self, '_file'): + self._file.close() def _read_frame(self, frame): self._file.seek(self._offsets[frame]) From 2e9db81a2ea2fb38b823cfbd33cdf37b9c898264 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Fri, 11 May 2018 13:26:36 -0400 Subject: [PATCH 041/455] fixed lammps docs --- package/MDAnalysis/topology/__init__.py | 230 ++++++++++++------------ 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/package/MDAnalysis/topology/__init__.py b/package/MDAnalysis/topology/__init__.py index 8afd6fec182..5c0cf1c13a9 100644 --- a/package/MDAnalysis/topology/__init__.py +++ b/package/MDAnalysis/topology/__init__.py @@ -43,121 +43,121 @@ .. table:: Table of Supported Topology Formats - ================= ========= ================= =================================================== - Name extension attributes remarks - ================= ========= ================= =================================================== - CHARMM/XPLOR PSF psf resnames, :mod:`MDAnalysis.topology.PSFParser` - names, types, - charges, - bonds, angles, - dihedrals, - impropers - - CHARMM CARD [#a]_ crd names, "CARD" coordinate output from CHARMM; deals with - tempfactors, either standard or EXTended format; - resnames, :mod:`MDAnalysis.topology.CRDParser` - - Brookhaven [#a]_ pdb/ent names, bonds, a simplified PDB format (as used in MD simulations) - resids, resnums, is read by default - types, - chainids, - occupancies, - bfactors, - resids, icodes, - resnames, - segids, - - XPDB [#a]_ pdb As PDB except Extended PDB format (can use 5-digit residue - icodes numbers). To use, specify the format "XPBD" - explicitly: - ``Universe(..., topology_format="XPDB")``. - Module :mod:`MDAnalysis.coordinates.PDB` - - PQR [#a]_ pqr names, charges, PDB-like but whitespace-separated files with charge - types, and radius information; - radii, resids, :mod:`MDAnalysis.topology.PQRParser` - resnames, icodes, - segids - - PDBQT [#a]_ pdbqt names, types, file format used by AutoDock with atom types and - altLocs, charges, partial charges. Module: - resnames, :mod:`MDAnalysis.topology.PDBQTParser` - resids, - icodes, - occupancies, - tempfactors, - segids, - - GROMOS96 [#a]_ gro names, resids, GROMOS96 coordinate file; - resnames, :mod:`MDAnalysis.topology.GROParser` - - AMBER top, names, charges simple AMBER format reader (only supports a subset - prmtop, type_indices, of flags); - parm7 types, :mod:`MDAnalysis.topology.TOPParser` - resnames, - - DESRES [#a]_ dms names, numbers, DESRES molecular sturcture reader (only supports - masses, charges, the atom and bond records); - chainids, resids, :mod:`MDAnalysis.topology.DMSParser` - resnames, segids, - radii, - - TPR [#b]_ tpr names, types, Gromacs portable run input reader (limited - resids, resnames, experimental support for some of the more recent - charges, bonds, versions of the file format); - masses, moltypes, :mod:`MDAnalysis.topology.TPRParser` - molnums - - MOL2 [#a]_ mol2 ids, names, Tripos MOL2 molecular structure format; - types, resids, :mod:`MDAnalysis.topology.MOL2Parser` - charges, bonds, - resnames, - - LAMMPS [#a]_ data ids, types, LAMMPS Data file parser - masses, charges, :mod:`MDAnalysis.topology.LAMMPSParser` - resids, bonds, - angles, dihedrals - - LAMMPS [#a]_ lammpsdump id, masses LAMMPS ascii dump file reader - :mod:`MDAnalysis.topology.LAMMPSParser` - - XYZ [#a]_ xyz names XYZ File Parser. Reads only the labels from atoms - and constructs minimal topology data. - :mod:`MDAnalysis.topology.XYZParser` - - TXYZ [#a]_ txyz, names, atomids, Tinker XYZ File Parser. Reads atom labels, numbers - arc masses, types, and connectivity; masses are guessed from atoms names. - bonds :mod:`MDAnalysis.topology.TXYZParser` - - GAMESS [#a]_ gms, names, GAMESS output parser. Read only atoms of assembly - log atomic charges, section (atom, elems and coords) and construct - topology. - :mod:`MDAnalysis.topology.GMSParser` - - DL_Poly [#a]_ config, ids, names DL_Poly CONFIG or HISTORY file. Reads only the - history atom names. If atoms are written out of order, will - correct the order. - :mod:`MDAnalysis.topology.DLPolyParser` - - Hoomd XML xml types, charges, `HOOMD XML`_ topology file. Reads atom types, - radii, masses masses, and charges if possible. Also reads bonds, - bonds, angles, angles, and dihedrals. - dihedrals :mod:`MDAnalysis.topology.HoomdXMLParser` - - GSD [#a]_ gsd types, charges, GSD topology file. Reads atom types, - radii, masses masses, and charges if possible. Also reads bonds, - bonds, angles, angles, and dihedrals. - dihedrals :mod:`MDAnalysis.topology.GSDParser` - - Macromolecular mmtf altLocs, `Macromolecular Transmission Format (MMTF)`_. - transmission bfactors, bonds, An efficient compact format for biomolecular - format charges, masses, structures. - names, - occupancies, - types, icodes, - resnames, resids, - segids, models - ================= ========= ================= =================================================== + ================= ========== ================= =================================================== + Name extension attributes remarks + ================= ========== ================= =================================================== + CHARMM/XPLOR PSF psf resnames, :mod:`MDAnalysis.topology.PSFParser` + names, types, + charges, + bonds, angles, + dihedrals, + impropers + + CHARMM CARD [#a]_ crd names, "CARD" coordinate output from CHARMM; deals with + tempfactors, either standard or EXTended format; + resnames, :mod:`MDAnalysis.topology.CRDParser` + + Brookhaven [#a]_ pdb/ent names, bonds, a simplified PDB format (as used in MD simulations) + resids, resnums, is read by default + types, + chainids, + occupancies, + bfactors, + resids, icodes, + resnames, + segids, + + XPDB [#a]_ pdb As PDB except Extended PDB format (can use 5-digit residue + icodes numbers). To use, specify the format "XPBD" + explicitly: + ``Universe(..., topology_format="XPDB")``. + Module :mod:`MDAnalysis.coordinates.PDB` + + PQR [#a]_ pqr names, charges, PDB-like but whitespace-separated files with charge + types, and radius information; + radii, resids, :mod:`MDAnalysis.topology.PQRParser` + resnames, icodes, + segids + + PDBQT [#a]_ pdbqt names, types, file format used by AutoDock with atom types and + altLocs, charges, partial charges. Module: + resnames, :mod:`MDAnalysis.topology.PDBQTParser` + resids, + icodes, + occupancies, + tempfactors, + segids, + + GROMOS96 [#a]_ gro names, resids, GROMOS96 coordinate file; + resnames, :mod:`MDAnalysis.topology.GROParser` + + AMBER top, names, charges simple AMBER format reader (only supports a subset + prmtop, type_indices, of flags); + parm7 types, :mod:`MDAnalysis.topology.TOPParser` + resnames, + + DESRES [#a]_ dms names, numbers, DESRES molecular sturcture reader (only supports + masses, charges, the atom and bond records); + chainids, resids, :mod:`MDAnalysis.topology.DMSParser` + resnames, segids, + radii, + + TPR [#b]_ tpr names, types, Gromacs portable run input reader (limited + resids, resnames, experimental support for some of the more recent + charges, bonds, versions of the file format); + masses, moltypes, :mod:`MDAnalysis.topology.TPRParser` + molnums + + MOL2 [#a]_ mol2 ids, names, Tripos MOL2 molecular structure format; + types, resids, :mod:`MDAnalysis.topology.MOL2Parser` + charges, bonds, + resnames, + + LAMMPS [#a]_ data ids, types, LAMMPS Data file parser + masses, charges, :mod:`MDAnalysis.topology.LAMMPSParser` + resids, bonds, + angles, dihedrals + + LAMMPS [#a]_ lammpsdump id, masses LAMMPS ascii dump file reader + :mod:`MDAnalysis.topology.LAMMPSParser` + + XYZ [#a]_ xyz names XYZ File Parser. Reads only the labels from atoms + and constructs minimal topology data. + :mod:`MDAnalysis.topology.XYZParser` + + TXYZ [#a]_ txyz, names, atomids, Tinker XYZ File Parser. Reads atom labels, numbers + arc masses, types, and connectivity; masses are guessed from atoms names. + bonds :mod:`MDAnalysis.topology.TXYZParser` + + GAMESS [#a]_ gms, names, GAMESS output parser. Read only atoms of assembly + log atomic charges, section (atom, elems and coords) and construct + topology. + :mod:`MDAnalysis.topology.GMSParser` + + DL_Poly [#a]_ config, ids, names DL_Poly CONFIG or HISTORY file. Reads only the + history atom names. If atoms are written out of order, will + correct the order. + :mod:`MDAnalysis.topology.DLPolyParser` + + Hoomd XML xml types, charges, `HOOMD XML`_ topology file. Reads atom types, + radii, masses masses, and charges if possible. Also reads bonds, + bonds, angles, angles, and dihedrals. + dihedrals :mod:`MDAnalysis.topology.HoomdXMLParser` + + GSD [#a]_ gsd types, charges, GSD topology file. Reads atom types, + radii, masses masses, and charges if possible. Also reads bonds, + bonds, angles, angles, and dihedrals. + dihedrals :mod:`MDAnalysis.topology.GSDParser` + + Macromolecular mmtf altLocs, `Macromolecular Transmission Format (MMTF)`_. + transmission bfactors, bonds, An efficient compact format for biomolecular + format charges, masses, structures. + names, + occupancies, + types, icodes, + resnames, resids, + segids, models + ================= ========== ================= =================================================== .. [#a] This format can also be used to provide *coordinates* so that it is possible to create a full From 13b1647a53d73c714085833221bd3985aa5b1b9a Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Mon, 21 May 2018 02:33:22 -0600 Subject: [PATCH 042/455] MAINT / CI: add missing imports flagged by pylint; Fixes Issue #1904. (#1905) * MAINT: add missing imports flagged by pylint; Fixes Issue #1904. * MAINT: adjust future import location in due.py * MAINT / CI: address additional pylint issues appearing in CI. --- package/MDAnalysis/analysis/hbonds/wbridge_analysis.py | 1 + package/MDAnalysis/due.py | 1 + testsuite/MDAnalysisTests/analysis/test_distances.py | 2 +- testsuite/MDAnalysisTests/analysis/test_wbridge.py | 6 +++--- testsuite/MDAnalysisTests/core/test_groups.py | 2 +- testsuite/MDAnalysisTests/lib/test_distances.py | 1 + testsuite/MDAnalysisTests/visualization/test_streamlines.py | 2 +- 7 files changed, 9 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py index cbe45968e18..308f7d077a4 100644 --- a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py @@ -281,6 +281,7 @@ class WaterBridgeAnalysis_OtherFF(WaterBridgeAnalysis): import pandas as pd df = pd.DataFrame.from_records(w.table) """ +from __future__ import absolute_import, division import six from collections import defaultdict diff --git a/package/MDAnalysis/due.py b/package/MDAnalysis/due.py index 8570f9a722f..cff77b92687 100644 --- a/package/MDAnalysis/due.py +++ b/package/MDAnalysis/due.py @@ -26,6 +26,7 @@ """ +from __future__ import absolute_import __version__ = '0.0.5' diff --git a/testsuite/MDAnalysisTests/analysis/test_distances.py b/testsuite/MDAnalysisTests/analysis/test_distances.py index 00afa80fccf..779b8c401fa 100644 --- a/testsuite/MDAnalysisTests/analysis/test_distances.py +++ b/testsuite/MDAnalysisTests/analysis/test_distances.py @@ -21,7 +21,7 @@ # -from __future__ import print_function, absolute_import +from __future__ import print_function, absolute_import, division import pytest import scipy diff --git a/testsuite/MDAnalysisTests/analysis/test_wbridge.py b/testsuite/MDAnalysisTests/analysis/test_wbridge.py index 0b9db198a7c..af66337cbfe 100644 --- a/testsuite/MDAnalysisTests/analysis/test_wbridge.py +++ b/testsuite/MDAnalysisTests/analysis/test_wbridge.py @@ -169,7 +169,7 @@ def test_count_by_type_multiple_link(self): wb = WaterBridgeAnalysis(u, 'protein and (resid 1)', 'protein and (resid 4)') # Build an dummy WaterBridgeAnalysis object for testing wb._timeseries = True - wb.timesteps = range(1) + wb.timesteps = [0] wb._water_network = [{('SOL', 2): [{(2, 0, ('SOL', 2, 'HW1'), ('ALA', 1, 'O'), 2.0, 179.99998), (1, 2, ('ALA', 1, 'H'), ('SOL', 2, 'OW'), 2.0, 179.99998)}, {(3, 4, ('SOL', 2, 'HW2'), ('ALA', 4, 'O'), 2.0, 179.99998), @@ -197,7 +197,7 @@ def test_count_by_type_multiple_frame(self): wb = WaterBridgeAnalysis(u, 'protein and (resid 1)', 'protein and (resid 4)') # Build an dummy WaterBridgeAnalysis object for testing wb._timeseries = True - wb.timesteps = range(6) + wb.timesteps = [0, 1, 2, 3, 4, 5] wb._water_network = [# a 2 * 2 water netwrok consists of all four links {('SOL', 2): [{(2, 0, ('SOL', 2, 'HW1'), ('ALA', 1, 'O'), 2.0, 179.99998), (1, 2, ('ALA', 1, 'H'), ('SOL', 2, 'OW'), 2.0, 179.99998)}, @@ -224,4 +224,4 @@ def test_count_by_type_multiple_frame(self): (0, 4, 'ALA', 1, 'O', 'ALA', 4, 'O', 0.5), (1, 3, 'ALA', 1, 'H', 'ALA', 4, 'H', 0.5), (1, 4, 'ALA', 1, 'H', 'ALA', 4, 'O', 0.5)] - assert_equal(sorted(wb.count_by_type().tolist()), result) \ No newline at end of file + assert_equal(sorted(wb.count_by_type().tolist()), result) diff --git a/testsuite/MDAnalysisTests/core/test_groups.py b/testsuite/MDAnalysisTests/core/test_groups.py index 48cca68a7e0..0b5e199d45d 100644 --- a/testsuite/MDAnalysisTests/core/test_groups.py +++ b/testsuite/MDAnalysisTests/core/test_groups.py @@ -19,7 +19,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -from __future__ import absolute_import +from __future__ import absolute_import, division from six.moves import range diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 5b9c434f15b..71e74231239 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -20,6 +20,7 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # +from __future__ import absolute_import import pytest import numpy as np from numpy.testing import assert_equal diff --git a/testsuite/MDAnalysisTests/visualization/test_streamlines.py b/testsuite/MDAnalysisTests/visualization/test_streamlines.py index c600c43b76d..ab5bf8f8fee 100644 --- a/testsuite/MDAnalysisTests/visualization/test_streamlines.py +++ b/testsuite/MDAnalysisTests/visualization/test_streamlines.py @@ -19,7 +19,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -from __future__ import absolute_import, print_function +from __future__ import absolute_import, print_function, division import numpy as np from numpy.testing import assert_almost_equal import MDAnalysis From bdb1844d17d1be6340452a25e95ed39d614d9edf Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Sun, 20 May 2018 17:40:41 -0600 Subject: [PATCH 043/455] BLD: added Python 3.6 64-bit Windows appveyor CI test. --- .appveyor.yml | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 .appveyor.yml diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 00000000000..b21008db6c9 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,78 @@ +# config based on examples from SciPy & NumPy repositories, which +# themselves credit an original example by Olivier Grisel at +# https://github.com/ogrisel/python-appveyor-demo/blob/master/appveyor.yml +clone_depth: 50 +max_jobs: 100 + +cache: + - '%LOCALAPPDATA%\pip\Cache' + +matrix: + # FIXME: allow all Windows builds + # to fail for now; remove this + # when we have full Windows compatibility + allow_failures: + - PYTHON_ARCH: 64 + +image: + - Visual Studio 2015 + +environment: + global: + MINGW_64: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin + OPENBLAS_64: https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com/openblas-5f998ef_gcc7_1_0_win64.zip + APPVEYOR_SAVE_CACHE_ON_ERROR: true + APPVEYOR_SKIP_FINALIZE_ON_EXIT: true + TEST_TIMEOUT: 1000 + PYTHON: "C:\\conda" + MINICONDA_VERSION: "latest" + CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci-helpers\\appveyor\\windows_sdk.cmd" + + matrix: + + - PYTHON_VERSION: 3.6 + PYTHON_ARCH: 64 + MSVC_VERSION: "Visual Studio 10 Win64" + +init: + - "ECHO %PYTHON% %PYTHON_VERSION% %PYTHON_ARCH%" + - "ECHO \"%APPVEYOR_SCHEDULED_BUILD%\"" + # cancel build if newer one is submitted; complicated + # details for getting this to work are credited to JuliaLang + # developers + - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod ` + https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | ` + Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { ` + raise "There are newer queued builds for this pull request, skipping build." + } + +install: + # set up a conda env + - "git clone --depth 1 git://github.com/astropy/ci-helpers.git" + - "powershell ci-helpers/appveyor/install-miniconda.ps1" + - SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH% + # deal with missing stdint.h as previously described + # see: https://github.com/swistakm/pyimgui/blob/master/.appveyor.yml + - cp "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h" "C:\Users\appveyor\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include\stdint.h" + - ps: conda config --append channels conda-forge + - ps: conda create -n testing python=$env:PYTHON_VERSION pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis + - cmd: C:\conda\envs\testing\Scripts\pip.exe install gsd==1.5.2 duecredit + - cmd: C:\conda\envs\testing\Scripts\activate testing + +build_script: + - cmd: cd package + - cmd: C:\conda\envs\testing\python.exe setup.py develop --no-deps --user 3>&1 + +test_script: + - cmd: cd ..\testsuite + - cmd: C:\conda\envs\testing\python.exe setup.py develop --no-deps --user 3>&1 + - cmd: cd MDAnalysisTests + - cmd: C:\conda\envs\testing\Scripts\pytest.exe --disable-pytest-warnings 3>&1 + +after_build: + # cache cleanup + - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -mtime +360 -delete + - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -size +10M -delete + - C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -empty -delete + # Show size of cache + - C:\cygwin\bin\du -hs "%LOCALAPPDATA%\pip\Cache" From 5feb9f4ffc7434f18eed85d517912c1cde4a1ac7 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Mon, 21 May 2018 14:55:51 -0700 Subject: [PATCH 044/455] Issue 1906 xfail duecredit (#1907) * skip duecredit tests if duecredit is not installed fix #1906 * renamed duecredit test from duecredits to duecredit --- testsuite/CHANGELOG | 3 ++- .../utils/{test_duecredits.py => test_duecredit.py} | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) rename testsuite/MDAnalysisTests/utils/{test_duecredits.py => test_duecredit.py} (93%) diff --git a/testsuite/CHANGELOG b/testsuite/CHANGELOG index 792c1395a54..b9de50dce60 100644 --- a/testsuite/CHANGELOG +++ b/testsuite/CHANGELOG @@ -15,7 +15,8 @@ and https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests ------------------------------------------------------------------------------ mm/dd/18 - * 0.18.1 + * 0.18.1 orbeckst + - skip tests for duecredit when duecredit is not installed (#1906) 04/15/18 tylerjereddy, zemanj * 0.18.0 diff --git a/testsuite/MDAnalysisTests/utils/test_duecredits.py b/testsuite/MDAnalysisTests/utils/test_duecredit.py similarity index 93% rename from testsuite/MDAnalysisTests/utils/test_duecredits.py rename to testsuite/MDAnalysisTests/utils/test_duecredit.py index 163b6604ebe..ca5ccfd207a 100644 --- a/testsuite/MDAnalysisTests/utils/test_duecredits.py +++ b/testsuite/MDAnalysisTests/utils/test_duecredit.py @@ -31,12 +31,16 @@ import MDAnalysis as mda from MDAnalysisTests.datafiles import MMTF +# duecredit itself is not needed in the name space but this is a +# convenient way to skip all tests if duecredit is not installed +# (see https://github.com/MDAnalysis/mdanalysis/issues/1906) +pytest.importorskip('duecredit') @pytest.mark.skipif((os.environ.get('DUECREDIT_ENABLE', 'yes').lower() in ('no', '0', 'false')), reason= "duecredit is explicitly disabled with DUECREDIT_ENABLE=no") -class TestDuecredits(object): +class TestDuecredit(object): def test_duecredit_active(self): assert mda.due.active == True From eeeb30a0f9cc6ddb4f7eb891fabc2ff86ffe141c Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Mon, 21 May 2018 16:49:17 -0700 Subject: [PATCH 045/455] update PyPi meta data for package and testsuite - fix #1837 - indicate content type for long description as reST - updated links in various README, SUMMARY, INSTALL files (also updated https://github.com/MDAnalysis/mdanalysis/wiki/Installing-from-binary-packages) - add more metadata for the new PyPi (e.g., links to Issue Tracker and groups, specify the Python versions) - display various badges on PyPi The {package,testsuite}/setup.py were checked with python setup.py -r -s (using https://github.com/pypa/readme_renderer) --- package/CHANGELOG | 1 + package/SUMMARY.txt | 74 +++++++++++++++++++++++++++++++-------------- package/setup.py | 24 +++++++++++---- testsuite/CHANGELOG | 6 ++-- testsuite/INSTALL | 44 +++++++++++---------------- testsuite/README | 50 ++++++++++++++++++++---------- testsuite/setup.py | 35 ++++++++++++--------- 7 files changed, 146 insertions(+), 88 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 84a47b67b29..c269227e1d4 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -32,6 +32,7 @@ Fixes Changes * TopologyAttrs are now statically typed (Issue #1876) + * updated meta data for new PyPi (#1837) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, diff --git a/package/SUMMARY.txt b/package/SUMMARY.txt index 084f4a8c752..9e7d893ed78 100644 --- a/package/SUMMARY.txt +++ b/package/SUMMARY.txt @@ -1,6 +1,9 @@ .. Summary for PyPI -.. http://pypi.python.org/pypi/MDAnalysis/ +.. https://pypi.python.org/project/MDAnalysis/ +|build| |cov| |docs| |usergroup| |developergroup| |anaconda| |mybinder| + + MDAnalysis_ is an object-oriented python toolkit to analyze molecular dynamics trajectories generated by CHARMM_, Gromacs_, Amber_, NAMD_, or LAMMPS_; it also reads other formats (e.g. PDB_ files and `XYZ @@ -22,13 +25,10 @@ out in a range of formats. Availability ============ -**Source code** is available from https://www.mdanalysis.org under the -`GNU Public Licence, version 2`_, together with the `online +**Source code** is available from https://www.mdanalysis.org under the `GNU +Public Licence, version 2`_, together with the `online documentation`_. **Packages** can be downloaded from - - http://pypi.python.org/pypi/MDAnalysis/ - -or installed/upgraded via PyPI using `pip`_:: +https://pypi.org/project/MDAnalysis/ or installed/upgraded via PyPI using `pip`_:: pip install --upgrade MDAnalysis @@ -36,7 +36,7 @@ By default MDAnalysis does not install every dependency needed to run every analysis available in the analysis module or read netcdf Amber_ trajectories. To install and update these dependencies as well run :: - pip install --upgrade 'MDAnalysis[analysis, AMBER] + pip install --upgrade 'MDAnalysis[analysis,AMBER] Please report **bugs** or **enhancement requests** through the `Issue Tracker`_. Questions can also be asked on the `mdnalysis-discussion mailing @@ -44,7 +44,7 @@ list`_. In order to run the `Unit Tests`_ it is also necessary to install a separate package MDAnalysisTests_ containing the test and test -data. As it contains about 20 MB of molecular dynamics trajectories +data. As it contains about 70 MB of molecular dynamics trajectories and simulation system structures it is not included with the library itself. @@ -74,12 +74,12 @@ For citations of included algorithms and sub-modules please see the references_. .. Links .. _MDAnalysis: https://www.mdanalysis.org -.. _`10.1002/jcc.21787`: http://dx.doi.org/10.1002/jcc.21787 +.. _`10.1002/jcc.21787`: https://dx.doi.org/10.1002/jcc.21787 .. _references: https://docs.mdanalysis.org/documentation_pages/references.html -.. _GNU Public Licence, version 2: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html -.. _Issue Tracker: http://issues.mdanalysis.org +.. _GNU Public Licence, version 2: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +.. _Issue Tracker: https://github.com/mdanalysis/mdanalysis/issues .. _`mdnalysis-discussion mailing list`: - http://groups.google.com/group/mdnalysis-discussion + https://groups.google.com/group/mdnalysis-discussion .. _`online documentation`: https://docs.mdanalysis.org .. _`Table of Supported Coordinate Formats`: @@ -90,21 +90,49 @@ For citations of included algorithms and sub-modules please see the references_. https://docs.mdanalysis.org/documentation_pages/selections.html#selection-commands .. _`Selection exporters`: https://docs.mdanalysis.org/documentation_pages/selections_modules.html#selection-exporters -.. _NumPy: http://numpy.scipy.org -.. _CHARMM: http://www.charmm.org/ +.. _NumPy: https://numpy.scipy.org +.. _CHARMM: https://www.charmm.org/ .. _Amber: http://ambermd.org/ .. _LAMMPS: http://lammps.sandia.gov/ .. _NAMD: http://www.ks.uiuc.edu/Research/namd/ .. _Gromacs: http://www.gromacs.org/ .. _VMD: http://www.ks.uiuc.edu/Research/vmd/ -.. _PyMOL: http://www.pymol.org/ -.. _PDB: http://www.rcsb.org/pdb/static.do?p=file_formats/pdb/index.html -.. _XYZ format: http://openbabel.org/wiki/XYZ_%28format%29 +.. _PyMOL: https://www.pymol.org/ +.. _PDB: https://www.rcsb.org/pdb/static.do?p=file_formats/pdb/index.html +.. _XYZ format: https://openbabel.org/wiki/XYZ_%28format%29 + +.. _Unit Tests: https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests +.. _MDAnalysisTests: https://github.com/MDAnalysis/mdanalysis/wiki/MDAnalysisTests + +.. _`pip`: https://www.pip-installer.org/en/latest/index.html + + +.. badges +.. |usergroup| image:: https://img.shields.io/badge/Google%20Group-Users-lightgrey.svg + :alt: User Google Group + :target: http://users.mdanalysis.org + +.. |developergroup| image:: https://img.shields.io/badge/Google%20Group-Developers-lightgrey.svg + :alt: Developer Google Group + :target: http://developers.mdanalysis.org + +.. |docs| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg + :alt: Documentation (latest release) + :target: https://docs.mdanalysis.org + +.. |build| image:: https://travis-ci.org/MDAnalysis/mdanalysis.svg?branch=develop + :alt: Build Status + :target: https://travis-ci.org/MDAnalysis/mdanalysis -.. _Unit Tests: http://wiki.mdanalysis.org/UnitTests -.. _MDAnalysisTests: http://wiki.mdanalysis.org/MDAnalysisTests +.. |cov| image:: https://coveralls.io/repos/MDAnalysis/mdanalysis/badge.svg?branch=develop + :alt: Coverage Status + :target: https://coveralls.io/r/MDAnalysis/mdanalysis?branch=develop -.. _`pip`: http://www.pip-installer.org/en/latest/index.html +.. |anaconda| image:: https://anaconda.org/conda-forge/mdanalysis/badges/version.svg + :alt: Anaconda + :target: https://anaconda.org/conda-forge/mdanalysis -PyPI Metadata -============= +.. |mybinder| image:: https://mybinder.org/badge.svg + :alt: My Binder + :target: https://mybinder.org/v2/gh/MDAnalysis/binder-notebook/master + diff --git a/package/setup.py b/package/setup.py index 06e8fb48557..38420dd2b3c 100755 --- a/package/setup.py +++ b/package/setup.py @@ -464,35 +464,47 @@ def dynamic_author_list(): 'Development Status :: 4 - Beta', 'Environment :: Console', 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: GNU General Public License (GPL)', + 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)', 'Operating System :: POSIX', 'Operating System :: MacOS :: MacOS X', 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'Programming Language :: C', + 'Topic :: Scientific/Engineering', 'Topic :: Scientific/Engineering :: Bio-Informatics', 'Topic :: Scientific/Engineering :: Chemistry', 'Topic :: Software Development :: Libraries :: Python Modules', ] - config = Config() exts, cythonfiles = extensions(config) setup(name='MDAnalysis', version=RELEASE, - description='An object-oriented toolkit to analyze molecular dynamics ' - 'trajectories generated by CHARMM, Gromacs, NAMD, LAMMPS, or Amber.', + description=('An object-oriented toolkit to analyze molecular dynamics ' + 'trajectories generated by CHARMM, Gromacs, NAMD, LAMMPS, or Amber.'), long_description=LONG_DESCRIPTION, + long_description_content_type='text/x-rst', author='Naveen Michaud-Agrawal', author_email='naveen.michaudagrawal@gmail.com', maintainer='Richard Gowers', maintainer_email='mdnalysis-discussion@googlegroups.com', url='https://www.mdanalysis.org', download_url='https://github.com/MDAnalysis/mdanalysis/releases', - provides=['MDAnalysis'], + project_urls={'Documentation': 'https://www.mdanalysis.org/docs/', + 'Issue Tracker': 'https://github.com/mdanalysis/mdanalysis/issues', + 'User Group': 'https://groups.google.com/forum/#!forum/mdnalysis-discussion', + 'Source': 'https://github.com/mdanalysis/mdanalysis', + }, license='GPL 2', + classifiers=CLASSIFIERS, + provides=['MDAnalysis'], packages=find_packages(), ext_modules=exts, - classifiers=CLASSIFIERS, requires=['numpy (>=1.10.4)', 'biopython (>= 1.71)', 'mmtf (>=1.0.0)', 'networkx (>=1.0)', 'GridDataFormats (>=0.3.2)', 'joblib', 'scipy (>=1.0.0)', 'matplotlib (>=1.5.1)'], diff --git a/testsuite/CHANGELOG b/testsuite/CHANGELOG index b9de50dce60..5cc462da11b 100644 --- a/testsuite/CHANGELOG +++ b/testsuite/CHANGELOG @@ -13,10 +13,10 @@ Also see https://github.com/MDAnalysis/mdanalysis/wiki/MDAnalysisTests and https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests ------------------------------------------------------------------------------ -mm/dd/18 - - * 0.18.1 orbeckst +mm/dd/18 orbeckst + * 0.18.1 - skip tests for duecredit when duecredit is not installed (#1906) + - updated meta data for PyPi and updated README and INSTALL 04/15/18 tylerjereddy, zemanj * 0.18.0 diff --git a/testsuite/INSTALL b/testsuite/INSTALL index f845e1cfa2f..b0db41ed077 100644 --- a/testsuite/INSTALL +++ b/testsuite/INSTALL @@ -25,22 +25,21 @@ related pages. You can always ask questions on the MDAnalysis mailing list: - http://groups.google.com/group/mdnalysis-discussion + https://groups.google.com/group/mdnalysis-discussion -People there are very happy to help. When posting please remember to -mention the release of MDAnalysis you are trying to install (e.g. "tar -file MDAnalysis-0.7.3 from website" or "subversion r818"), all the -commands that you typed to install the package, and the full output -(typically right from 'python setup.py build'). You should also -mention your operating system (e.g. Ubuntu 10.04) and Python version -(output from 'python --version') so that we can better diagnose the -problem. +People there are very happy to help. When posting please remember to mention +the release of MDAnalysis you are trying to install (e.g. "tar file +MDAnalysis-0.7.3 from website" or "git commit deadbee3"), all the commands that +you typed to install the package, and the full output (typically right from +``python setup.py build``). You should also mention your operating system +(e.g. Ubuntu 16.04) and Python version (output from ``python --version``) so +that we can better diagnose the problem. Getting the source ================== -Download a tar ball from https://pypi.python.org/pypi/MDAnalysisTests; these +Download a tar ball from https://pypi.org/project/MDAnalysisTests; these instructions apply to versions 0.7.4 or higher. Alternatively, check out the MDAnalysis directory from the git @@ -62,10 +61,9 @@ and executing from the top directory :: This installs MDAnalysisTests in the system wide python directory; this may require administrative privileges. -It is also possible to use --prefix, --home, or --user options for -setup.py to install in a different (probably your private) python -directory hierarchy. ``python setup.py install --help`` should show -you your options. +It is also possible to use ``--prefix``, ``--home``, or ``--user`` options for +``setup.py`` to install in a different (probably your private) python directory +hierarchy. ``python setup.py install --help`` should show you your options. If you have problem at this stage then have a look at the operating system specific notes at the end of this file or look in the issue @@ -76,7 +74,7 @@ found in the comments Running tests ============= -See http://wiki.mdanalysis.org/UnitTests for details. +See https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests for details. From sources @@ -84,17 +82,11 @@ From sources From the top directory of the checked out sources: - pytest /testsuite/MDAnalysisTests/ --numprocesses 4 + pytest --numprocesses 4 --disable-pytest-warnings testsuite/MDAnalysisTests/ -(use --numprocesses 4 if you have 4 cores available to run in parallel or -adapt to available cores.) +Use ``--numprocesses 4`` if you have 4 cores available to run in +parallel or adapt to available cores. To run tests in parallel you +will need to have *pytest-xdist>=1.18.1* installed (``pip install +pytest-xdist``). -To run tests in parallel you will need pytest-xdist>=1.18.1 installed. - -From installed package ----------------------- - -The test runner can be launched as - - python -c 'from MDAnalysis.tests import test; test()' diff --git a/testsuite/README b/testsuite/README index e334fa381cb..ebc78b15536 100644 --- a/testsuite/README +++ b/testsuite/README @@ -1,39 +1,57 @@ -============================= - MDAnalysisTests README -============================= +=================== + MDAnalysisTests +=================== -MDAnalysis is a Python toolkit to analyze molecular dynamics +|build| |cov| |devdocs| |developergroup| + +MDAnalysis_ is a Python toolkit to analyze molecular dynamics trajectories generated by CHARMM, Amber, NAMD, LAMMPS, or Gromacs. .. NOTE:: *This* package only contains the UnitTests and the data - files that are used in the test suite of the MDAnalysis + files that are used in the test suite of the MDAnalysis_ package https://www.mdanalysis.org. They should be - installed together with MDAnalysis. - - You can get MDAnalysis from https://www.mdanalysis.org - + installed together with MDAnalysis_. The test files change less frequently, take up around 70 MB of space, and are not needed for daily use of MDAnalysis so they are distributed separately from the main package. For installation instruction please have a look at INSTALL and the -instructions online at http://wiki.mdanalysis.org/INSTALL +instructions online at https://github.com/MDAnalysis/mdanalysis/wiki/INSTALL -The tests are described at http://wiki.mdanalysis.org/UnitTests +The tests are described at https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests -For further information please see the documentation for MDAnalysis +For further information please see the `documentation for MDAnalysis`_ itself. Contact ======= -Please report bugs and feature requests through the Issue Tracker at +Please report bugs and feature requests through the `Issue Tracker`_. + +Help is also available through the mailing list at https://groups.google.com/group/mdnalysis-discussion + +.. Links +.. _MDAnalysis: https://www.mdanalysis.org +.. _Issue Tracker: https://github.com/mdanalysis/mdanalysis/issues +.. _`documentation for MDAnalysis`: https://www.mdanalysis.org/docs/ - http://issues.mdanalysis.org -Help is also available through the mailing list +.. badges + +.. |build| image:: https://travis-ci.org/MDAnalysis/mdanalysis.svg?branch=develop + :alt: Build Status + :target: https://travis-ci.org/MDAnalysis/mdanalysis - http://groups.google.com/group/mdnalysis-discussion +.. |cov| image:: https://coveralls.io/repos/MDAnalysis/mdanalysis/badge.svg?branch=develop + :alt: Coverage Status + :target: https://coveralls.io/r/MDAnalysis/mdanalysis?branch=develop +.. |devdocs| image:: https://img.shields.io/badge/docs-development-yellow.svg + :alt: Documentation (development version) + :target: https://www.mdanalysis.org/mdanalysis/ + +.. |developergroup| image:: https://img.shields.io/badge/Google%20Group-Developers-lightgrey.svg + :alt: Developer Google Group + :target: http://developers.mdanalysis.org diff --git a/testsuite/setup.py b/testsuite/setup.py index 9a9ab977f66..d6eda4dcc5a 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -133,26 +133,25 @@ def dynamic_author_list(): # this must be in-sync with MDAnalysis RELEASE = "0.18.1-dev" - LONG_DESCRIPTION = \ - """MDAnalysis is a tool for analyzing molecular dynamics trajectories. + with open("README") as summary: + LONG_DESCRIPTION = summary.read() -This package (MDAnalysisTests) contains the test code and the trajectory data -that are used for the test cases. In order to make downloads and binary package -maintenance more efficient, these tests were moved into this package. - -For details see the report for `Issue 87`_. - -.. _`Issue 87`: https://github.com/MDAnalysis/mdanalysis/issues/87 -""" CLASSIFIERS = [ 'Development Status :: 4 - Beta', 'Environment :: Console', 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: GNU General Public License (GPL)', + 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)', 'Operating System :: POSIX', 'Operating System :: MacOS :: MacOS X', 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'Programming Language :: C', + 'Topic :: Scientific/Engineering', 'Topic :: Scientific/Engineering :: Bio-Informatics', 'Topic :: Scientific/Engineering :: Chemistry', 'Topic :: Software Development :: Libraries :: Python Modules', @@ -160,14 +159,24 @@ def dynamic_author_list(): setup(name='MDAnalysisTests', version=RELEASE, - description='MDAnalysis http://mdanalysis.org testsuite', + description='MDAnalysis testsuite', + long_description=LONG_DESCRIPTION, + long_description_content_type='text/x-rst', author='Naveen Michaud-Agrawal', author_email='naveen.michaudagrawal@gmail.com', maintainer='Richard Gowers', maintainer_email='mdnalysis-discussion@googlegroups.com', url='https://www.mdanalysis.org', download_url='https://github.com/MDAnalysis/mdanalysis/releases', + project_urls={'Documentation': 'https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests', + 'CI Tests': 'https://travis-ci.org/MDAnalysis/mdanalysis', + 'CI Coverage': 'https://coveralls.io/r/MDAnalysis/mdanalysis?branch=develop', + 'Developer Group': 'https://groups.google.com/forum/#!forum/mdnalysis-devel', + 'Issue Tracker': 'https://github.com/mdanalysis/mdanalysis/issues', + 'Source': 'https://github.com/mdanalysis/mdanalysis', + }, license='GPL 2', + classifiers=CLASSIFIERS, packages=find_packages(), package_dir={'MDAnalysisTests': 'MDAnalysisTests', 'MDAnalysisTests.plugins': 'MDAnalysisTests/plugins'}, @@ -208,8 +217,6 @@ def dynamic_author_list(): 'data/*.gsd', ], }, - classifiers=CLASSIFIERS, - long_description=LONG_DESCRIPTION, install_requires=[ 'MDAnalysis=={0!s}'.format(RELEASE), # same as this release! 'pytest>=3.1.2', From 92215af1d8a269589bbea3fa972f5ffe2e18f684 Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Tue, 22 May 2018 10:34:42 -0600 Subject: [PATCH 046/455] BUG: duecredit should now be imported properly on Windows. --- package/MDAnalysis/due.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package/MDAnalysis/due.py b/package/MDAnalysis/due.py index cff77b92687..9f5692f36cd 100644 --- a/package/MDAnalysis/due.py +++ b/package/MDAnalysis/due.py @@ -68,7 +68,11 @@ def _donothing_func(*args, **kwargs): as (os_dot_fork, os_dot_popen): import duecredit else: - with patch('os.fork') as os_dot_fork, patch('os.popen') as os_dot_popen: + if not os.name == 'nt': + with patch('os.fork') as os_dot_fork, patch('os.popen') as os_dot_popen: + import duecredit + else: + # Windows doesn't have os.fork import duecredit from duecredit import due, BibTeX, Doi, Url From dfb82537de81facb437440d5ab895dfde8d5198b Mon Sep 17 00:00:00 2001 From: zeman Date: Fri, 18 May 2018 02:41:18 +0200 Subject: [PATCH 047/455] Added compound parameter to MDAnalysis.core.topologyattrs.center_of_mass() to support COM calculation per residue or per segment --- package/MDAnalysis/core/groups.py | 7 +- package/MDAnalysis/core/topologyattrs.py | 82 +++++++++++++++++++++--- 2 files changed, 76 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 8726e659846..7f635beed2b 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -113,7 +113,6 @@ from ..exceptions import NoDataError from . import topologyobjects from ._get_readers import get_writer_for -from . import flags def _unpickle(uhash, ix): @@ -996,7 +995,7 @@ def wrap(self, compound="atoms", center="com", box=None): center of geometry. `box` allows a unit cell to be given for the transformation. If not - specified, an the dimensions information from the current Timestep will + specified, the dimensions information from the current Timestep will be used. .. note:: @@ -1018,7 +1017,7 @@ def wrap(self, compound="atoms", center="com", box=None): elif compound.lower() == 'fragments': objects = atomgroup.fragments else: - raise ValueError("Unrecognised compound definition: {0}" + raise ValueError("Unrecognized compound definition: {0}" "Please use one of 'group' 'residues' 'segments'" "or 'fragments'".format(compound)) @@ -1028,7 +1027,7 @@ def wrap(self, compound="atoms", center="com", box=None): elif center.lower() in ('cog', 'centroid', 'centerofgeometry'): centers = np.vstack([o.atoms.center_of_geometry() for o in objects]) else: - raise ValueError("Unrecognised center definition: {0}" + raise ValueError("Unrecognized center definition: {0}" "Please use one of 'com' or 'cog'".format(center)) centers = centers.astype(np.float32) diff --git a/package/MDAnalysis/core/topologyattrs.py b/package/MDAnalysis/core/topologyattrs.py index 5bb4d1c0a32..edb791bc7c6 100644 --- a/package/MDAnalysis/core/topologyattrs.py +++ b/package/MDAnalysis/core/topologyattrs.py @@ -49,7 +49,7 @@ from . import flags from ..lib.util import cached, convert_aa_code, iterable -from ..lib import transformations, mdamath +from ..lib import distances, transformations, mdamath from ..exceptions import NoDataError, SelectionError from .topologyobjects import TopologyGroup from . import selection @@ -780,19 +780,42 @@ def get_segments(self, sg): return masses - def center_of_mass(group, pbc=None): - """Center of mass of the Group. + def center_of_mass(group, compound='group', pbc=None): + """Center of mass of (compounds of) the group. + + Computes the center of mass of *unique* atoms of the group. + Centers of mass per residue or per segment can be obtained by setting + the `compound` parameter accordingly. Parameters ---------- + compound : {'group', 'segments', 'residues'}, optional + If 'group', the center of mass of all atoms in the group will be + returned as a single position vector. + Else, the centers of mass of each segment or residue will be + returned as an array of position vectors, i.e. a 2d array. + Note that, in any case, *only* the positions and masses of atoms + *belonging to the group* will be taken into account. + [``'group'``] pbc : bool, optional - If ``True``, move all atoms within the primary unit cell before - calculation. [``False``] + If ``True`` and `compound` is 'group', move all atoms to the primary + unit cell before calculation. + If ``True`` and `compund` is 'segments' or 'residues', the centers + of mass of each compound will be calculated without moving any + atoms to keep the compounds intact. Instead, the resulting + center-of-mass position vectors will be moved to the primary unit + cell after calculation. + [``False``] Returns ------- - center : ndarray - center of group given masses as weights + center : numpy.ndarray with dtype=numpy.float32 + Position vector(s) of the center(s) of mass of the group. + If `compound` was set to 'group', the output will be a single + position vector. + If `compund` was set to 'segments' or 'residues', the output will + be a 2d array of shape ``(n, 3)`` where ``n`` is the number + compounds. Note ---- @@ -801,9 +824,50 @@ def center_of_mass(group, pbc=None): .. versionchanged:: 0.8 Added `pbc` parameter + .. versionchanged:: 0.18.0 Added `compound` parameter """ - return group.atoms.center(weights=group.atoms.masses, - pbc=pbc) + atoms = group.atoms.unique + # COM of the whole group: + if compound == 'group': + return atoms.center(weights=atoms.masses, pbc=pbc) + # If COMs per compound are requested, get their number and indices: + elif compound.lower() == 'residues': + compound_indices = atoms.resindices + n_compounds = atoms.n_residues + elif compound.lower() == 'segments': + compound_indices = atoms.segindices + n_compounds = atoms.n_segments + else: + raise ValueError("Unrecognized compound definition: {}\nPlease use" + " one of 'group', 'residues', or 'segments'." + "".format(compound)) + # Sort positions and masses by compound index: + sort_indices = np.argsort(compound_indices) + compound_indices = compound_indices[sort_indices] + positions = atoms.positions[sort_indices] + masses = atoms.masses[sort_indices] + # Allocate output array: + coms = np.zeros((n_compounds, 3), dtype=np.float32) + # Get sizes of compounds: + unique_compound_indices, compound_sizes = np.unique(compound_indices, + return_counts=True) + unique_compound_sizes = np.unique(compound_sizes) + # Compute COMs per compound for each compound size: + for compound_size in unique_compound_sizes: + compound_mask = compound_sizes == compound_size + _compound_indices = unique_compound_indices[compound_mask] + atoms_mask = np.isin(compound_indices, _compound_indices) + _positions = positions[atoms_mask].reshape((-1, compound_size, 3)) + _masses = masses[atoms_mask].reshape((-1, compound_size)) + _coms = (_positions * _masses[:, :, None]).sum(axis=1) + _coms /= _masses.sum(axis=1)[:, None] + coms[compound_mask] = _coms + # Apply periodic boundary conditions if requested: + if pbc is None: + pbc = flags['use_pbc'] + if pbc: + coms = distances.apply_PBC(coms, group.dimensions) + return coms transplants[GroupBase].append( ('center_of_mass', center_of_mass)) From d6e5b247a31aa780ac8df136cd21062cad3935c5 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 22 May 2018 11:01:01 +0200 Subject: [PATCH 048/455] add compound keyword to center This makes the new kwarg available to all functions related to calculation of centroid or center of mass distances. --- package/MDAnalysis/core/groups.py | 59 ++++++++++++++++++++++-- package/MDAnalysis/core/topologyattrs.py | 55 +++------------------- 2 files changed, 61 insertions(+), 53 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 7f635beed2b..82029bd2d31 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -601,7 +601,7 @@ def dimensions(self): def dimensions(self, dimensions): self.universe.trajectory.ts.dimensions = dimensions - def center(self, weights, pbc=None): + def center(self, weights, pbc=None, compound='group'): """Calculate center of group given some weights Parameters @@ -611,6 +611,13 @@ def center(self, weights, pbc=None): pbc : boolean, optional ``True``: Move all atoms within the primary unit cell before calculation [``False``] + compound : {'group', 'segments', 'residues'}, optional + If 'group', the center of mass of all atoms in the atomgroup will + be returned as a single position vector. Else, the centers of mass + of each segment or residue will be returned as an array of position + vectors, i.e. a 2d array. Note that, in any case, *only* the + positions of atoms *belonging to the atomgroup* will be + taken into account. Returns ------- @@ -631,6 +638,7 @@ def center(self, weights, pbc=None): If the :class:`MDAnalysis.core.flags` flag *use_pbc* is set to ``True`` then the `pbc` keyword is used by default. + .. versionchanged:: 0.19.0 Added `compound` parameter """ atoms = self.atoms if pbc is None: @@ -640,9 +648,43 @@ def center(self, weights, pbc=None): else: xyz = atoms.positions - return np.average(xyz, weights=weights, axis=0) - - def center_of_geometry(self, pbc=None): + if compound.lower() == 'group': + return np.average(xyz, weights=weights, axis=0) + elif compound.lower() == 'residues': + compound_indices = atoms.resindices + n_compounds = atoms.n_residues + elif compound.lower() == 'segments': + compound_indices = atoms.segindices + n_compounds = atoms.n_segments + else: + raise ValueError("Unrecognized compound definition: {}\nPlease use" + " one of 'group', 'residues', or 'segments'." + "".format(compound)) + + # Sort positions and masses by compound index: + sort_indices = np.argsort(compound_indices) + compound_indices = compound_indices[sort_indices] + positions = atoms.positions[sort_indices] + weights = weights[sort_indices] + # Allocate output array: + coms = np.zeros((n_compounds, 3), dtype=np.float32) + # Get sizes of compounds: + unique_compound_indices, compound_sizes = np.unique(compound_indices, + return_counts=True) + unique_compound_sizes = np.unique(compound_sizes) + # Compute centers per compound for each compound size: + for compound_size in unique_compound_sizes: + compound_mask = compound_sizes == compound_size + _compound_indices = unique_compound_indices[compound_mask] + atoms_mask = np.isin(compound_indices, _compound_indices) + _positions = positions[atoms_mask].reshape((-1, compound_size, 3)) + _weights = weights[atoms_mask].reshape((-1, compound_size)) + _coms = (_positions * _weights[:, :, None]).sum(axis=1) + _coms /= _weights.sum(axis=1)[:, None] + coms[compound_mask] = _coms + return coms + + def center_of_geometry(self, pbc=None, compound='group'): """Center of geometry (also known as centroid) of the selection. Parameters @@ -650,6 +692,13 @@ def center_of_geometry(self, pbc=None): pbc : boolean, optional ``True``: Move all atoms within the primary unit cell before calculation [``False``] + compound : {'group', 'segments', 'residues'}, optional + If 'group', the center of mass of all atoms in the atomgroup will + be returned as a single position vector. Else, the centers of mass + of each segment or residue will be returned as an array of position + vectors, i.e. a 2d array. Note that, in any case, *only* the + positions of atoms *belonging to the atomgroup* will be + taken into account. Returns ------- @@ -664,7 +713,7 @@ def center_of_geometry(self, pbc=None): .. versionchanged:: 0.8 Added `pbc` keyword """ - return self.center(None, pbc=pbc) + return self.center(np.ones(self.n_atoms), pbc=pbc, compound=compound) centroid = center_of_geometry diff --git a/package/MDAnalysis/core/topologyattrs.py b/package/MDAnalysis/core/topologyattrs.py index edb791bc7c6..ad3900fb0be 100644 --- a/package/MDAnalysis/core/topologyattrs.py +++ b/package/MDAnalysis/core/topologyattrs.py @@ -790,13 +790,12 @@ def center_of_mass(group, compound='group', pbc=None): Parameters ---------- compound : {'group', 'segments', 'residues'}, optional - If 'group', the center of mass of all atoms in the group will be - returned as a single position vector. - Else, the centers of mass of each segment or residue will be - returned as an array of position vectors, i.e. a 2d array. - Note that, in any case, *only* the positions and masses of atoms - *belonging to the group* will be taken into account. - [``'group'``] + If 'group', the center of mass of all atoms in the atomgroup will + be returned as a single position vector. Else, the centers of mass + of each segment or residue will be returned as an array of position + vectors, i.e. a 2d array. Note that, in any case, *only* the + positions of atoms *belonging to the atomgroup* will be + taken into account. pbc : bool, optional If ``True`` and `compound` is 'group', move all atoms to the primary unit cell before calculation. @@ -827,47 +826,7 @@ def center_of_mass(group, compound='group', pbc=None): .. versionchanged:: 0.18.0 Added `compound` parameter """ atoms = group.atoms.unique - # COM of the whole group: - if compound == 'group': - return atoms.center(weights=atoms.masses, pbc=pbc) - # If COMs per compound are requested, get their number and indices: - elif compound.lower() == 'residues': - compound_indices = atoms.resindices - n_compounds = atoms.n_residues - elif compound.lower() == 'segments': - compound_indices = atoms.segindices - n_compounds = atoms.n_segments - else: - raise ValueError("Unrecognized compound definition: {}\nPlease use" - " one of 'group', 'residues', or 'segments'." - "".format(compound)) - # Sort positions and masses by compound index: - sort_indices = np.argsort(compound_indices) - compound_indices = compound_indices[sort_indices] - positions = atoms.positions[sort_indices] - masses = atoms.masses[sort_indices] - # Allocate output array: - coms = np.zeros((n_compounds, 3), dtype=np.float32) - # Get sizes of compounds: - unique_compound_indices, compound_sizes = np.unique(compound_indices, - return_counts=True) - unique_compound_sizes = np.unique(compound_sizes) - # Compute COMs per compound for each compound size: - for compound_size in unique_compound_sizes: - compound_mask = compound_sizes == compound_size - _compound_indices = unique_compound_indices[compound_mask] - atoms_mask = np.isin(compound_indices, _compound_indices) - _positions = positions[atoms_mask].reshape((-1, compound_size, 3)) - _masses = masses[atoms_mask].reshape((-1, compound_size)) - _coms = (_positions * _masses[:, :, None]).sum(axis=1) - _coms /= _masses.sum(axis=1)[:, None] - coms[compound_mask] = _coms - # Apply periodic boundary conditions if requested: - if pbc is None: - pbc = flags['use_pbc'] - if pbc: - coms = distances.apply_PBC(coms, group.dimensions) - return coms + return atoms.center(weights=atoms.masses, pbc=pbc, compound=compound) transplants[GroupBase].append( ('center_of_mass', center_of_mass)) From a0cad614de46cd0b4ea1752ac1e9a5308efb33d7 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 22 May 2018 11:06:43 +0200 Subject: [PATCH 049/455] add tests --- .../MDAnalysisTests/core/test_atomgroup.py | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index 063a097d689..01eb60010eb 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -899,11 +899,29 @@ def test_len(self, ag): def test_center_of_geometry(self, ag): assert_almost_equal(ag.center_of_geometry(), - np.array([-0.04223963, 0.0141824, -0.03505163], dtype=np.float32)) + [-0.04223963, 0.0141824, -0.03505163], decimal=5) def test_center_of_mass(self, ag): assert_almost_equal(ag.center_of_mass(), - np.array([-0.01094035, 0.05727601, -0.12885778])) + [-0.01094035, 0.05727601, -0.12885778], decimal=5) + + @pytest.mark.parametrize('name, compound', (('resids', 'residues'), + ('segids', 'segments'))) + def test_center_of_geometry_compounds(self, ag, name, compound): + ref = [a.center_of_geometry() for a in ag.groupby(name).values()] + cog = ag.center_of_geometry(compound=compound) + assert_almost_equal(cog, ref, decimal=5) + + @pytest.mark.parametrize('name, compound', (('resids', 'residues'), + ('segids', 'segments'))) + def test_center_of_mass_compounds(self, ag, name, compound): + ref = [a.center_of_mass() for a in ag.groupby(name).values()] + com = ag.center_of_mass(compound=compound) + assert_almost_equal(com, ref, decimal=5) + + def test_center_wrong_compound(self, ag): + with pytest.raises(ValueError): + ag.center(weights=None, compound="foo") def test_coordinates(self, ag): assert_almost_equal( From 29dfcc9da4de7120d3cb415493f1c363ddeda1c4 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 22 May 2018 11:17:16 +0200 Subject: [PATCH 050/455] update changelog --- package/CHANGELOG | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index c269227e1d4..cacb2816272 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,13 +13,14 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de +??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj * 0.18.1 Enhancements * Added various duecredit stubs * Import time reduced by a factor two (PR #1881) + * added compound kwarg to center, centroid, center_of_geometry, center_of_mass (PR #1903) Fixes * Fixed order of indices in Angle/Dihedral/Improper repr From 41336ff9260f5cdf335ac608a556c97246a300fe Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 22 May 2018 12:16:56 +0200 Subject: [PATCH 051/455] fix return type for compound='group' --- package/MDAnalysis/core/groups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 82029bd2d31..58258372b04 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -649,7 +649,7 @@ def center(self, weights, pbc=None, compound='group'): xyz = atoms.positions if compound.lower() == 'group': - return np.average(xyz, weights=weights, axis=0) + return np.average(xyz, weights=weights, axis=0).astype(np.float32) elif compound.lower() == 'residues': compound_indices = atoms.resindices n_compounds = atoms.n_residues From 6696168e13909ce3942732981283f7dbda365910 Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 22 May 2018 17:12:51 +0200 Subject: [PATCH 052/455] in `center_of_mass()`: `compound` kwarg as last parameter; removed uniqueness of atoms; streamlined docstring --- package/MDAnalysis/core/topologyattrs.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/core/topologyattrs.py b/package/MDAnalysis/core/topologyattrs.py index ad3900fb0be..141f231e19f 100644 --- a/package/MDAnalysis/core/topologyattrs.py +++ b/package/MDAnalysis/core/topologyattrs.py @@ -780,10 +780,10 @@ def get_segments(self, sg): return masses - def center_of_mass(group, compound='group', pbc=None): + def center_of_mass(group, pbc=None, compound='group'): """Center of mass of (compounds of) the group. - Computes the center of mass of *unique* atoms of the group. + Computes the center of mass of atoms in the group. Centers of mass per residue or per segment can be obtained by setting the `compound` parameter accordingly. @@ -823,9 +823,9 @@ def center_of_mass(group, compound='group', pbc=None): .. versionchanged:: 0.8 Added `pbc` parameter - .. versionchanged:: 0.18.0 Added `compound` parameter + .. versionchanged:: 0.19.0 Added `compound` parameter """ - atoms = group.atoms.unique + atoms = group.atoms return atoms.center(weights=atoms.masses, pbc=pbc, compound=compound) transplants[GroupBase].append( From e163a432f0881f489ea196421d72c04786930c3b Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 22 May 2018 18:04:34 +0200 Subject: [PATCH 053/455] Fixed PBC handling in `center()`, updated docstrings. Removed uniqueness of atoms, which should first be discussed in issue #1911. --- package/MDAnalysis/core/groups.py | 122 +++++++++++++++-------- package/MDAnalysis/core/topologyattrs.py | 21 ++-- 2 files changed, 92 insertions(+), 51 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 58258372b04..92104f6aff6 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -602,36 +602,54 @@ def dimensions(self, dimensions): self.universe.trajectory.ts.dimensions = dimensions def center(self, weights, pbc=None, compound='group'): - """Calculate center of group given some weights + """Weighted center of (compounds of) the group + + Computes the weighted center of atoms in the group. + Weighted centers per residue or per segment can be obtained by setting + the `compound` parameter accordingly. Parameters ---------- - weights : array_like - weights to be used - pbc : boolean, optional - ``True``: Move all atoms within the primary unit cell - before calculation [``False``] + weights : array_like or None + Weights to be used. Setting `weights=None` is equivalent to passing + identical weights for all atoms of the group. + pbc : bool or None, optional + If ``True`` and `compound` is 'group', move all atoms to the primary + unit cell before calculation. If ``True`` and `compound` is + 'segments' or 'residues', the center of each compound will be + calculated without moving any atoms to keep the compounds intact. + Instead, the resulting position vectors will be moved to the primary + unit cell after calculation. compound : {'group', 'segments', 'residues'}, optional - If 'group', the center of mass of all atoms in the atomgroup will - be returned as a single position vector. Else, the centers of mass - of each segment or residue will be returned as an array of position + If 'group', the weighted center of all atoms in the group will be + returned as a single position vector. Else, the weighted centers of + each segment or residue will be returned as an array of position vectors, i.e. a 2d array. Note that, in any case, *only* the - positions of atoms *belonging to the atomgroup* will be - taken into account. + positions of atoms *belonging to the group* will be taken into + account. Returns ------- - center : ndarray - weighted center of group + center : numpy.ndarray with dtype=numpy.float32 + Position vector(s) of the weighted center(s) of the group. + If `compound` was set to 'group', the output will be a single + position vector. + If `compound` was set to 'segments' or 'residues', the output will be + a 2d array of shape ``(n, 3)`` where ``n`` is the number of + compounds. Examples -------- - To find the charge weighted center of a given Atomgroup:: + To find the center of charge of a given AtomGroup:: >>> sel = u.select_atoms('prop mass > 4.0') >>> sel.center(sel.charges) + To find the centers of mass per residue of all CA atoms:: + + >>> sel = u.select_atoms('name CA') + >>> sel.center(sel.masses, compound='residues') Notes ----- @@ -640,16 +658,20 @@ def center(self, weights, pbc=None, compound='group'): .. versionchanged:: 0.19.0 Added `compound` parameter """ - atoms = self.atoms + if pbc is None: pbc = flags['use_pbc'] - if pbc: - xyz = atoms.pack_into_box(inplace=False) - else: - xyz = atoms.positions + + atoms = self.atoms if compound.lower() == 'group': - return np.average(xyz, weights=weights, axis=0).astype(np.float32) + if pbc: + coords = atoms.pack_into_box(inplace=False) + else: + coords = atoms.positions + centers = np.average(coords, weights=weights, axis=0) + return centers.astype(np.float32) #TODO: check if astype() is really required (according to the numpy manual: no) + elif compound.lower() == 'residues': compound_indices = atoms.resindices n_compounds = atoms.n_residues @@ -664,10 +686,11 @@ def center(self, weights, pbc=None, compound='group'): # Sort positions and masses by compound index: sort_indices = np.argsort(compound_indices) compound_indices = compound_indices[sort_indices] - positions = atoms.positions[sort_indices] - weights = weights[sort_indices] + coords = atoms.positions[sort_indices] + if weights is not None: + weights = weights[sort_indices] # Allocate output array: - coms = np.zeros((n_compounds, 3), dtype=np.float32) + centers = np.zeros((n_compounds, 3), dtype=np.float32) # Get sizes of compounds: unique_compound_indices, compound_sizes = np.unique(compound_indices, return_counts=True) @@ -677,33 +700,51 @@ def center(self, weights, pbc=None, compound='group'): compound_mask = compound_sizes == compound_size _compound_indices = unique_compound_indices[compound_mask] atoms_mask = np.isin(compound_indices, _compound_indices) - _positions = positions[atoms_mask].reshape((-1, compound_size, 3)) - _weights = weights[atoms_mask].reshape((-1, compound_size)) - _coms = (_positions * _weights[:, :, None]).sum(axis=1) - _coms /= _weights.sum(axis=1)[:, None] - coms[compound_mask] = _coms - return coms + _coords = coords[atoms_mask].reshape((-1, compound_size, 3)) + if weights is None: + _centers = _coords.mean(axis=1) + else: + _weights = weights[atoms_mask].reshape((-1, compound_size)) + _centers = (_coords * _weights[:, :, None]).sum(axis=1) + _centers /= _weights.sum(axis=1)[:, None] + centers[compound_mask] = _centers + if pbc: + centers = distances.apply_PBC(centers, atoms.dimensions) + return centers def center_of_geometry(self, pbc=None, compound='group'): - """Center of geometry (also known as centroid) of the selection. + """Center of geometry (also known as centroid) of the group. + + Computes the center of geometry (a.k.a. centroid) of atoms in the group. + Centers of geometry per residue or per segment can be obtained by + setting the `compound` parameter accordingly. Parameters ---------- - pbc : boolean, optional - ``True``: Move all atoms within the primary unit cell - before calculation [``False``] + pbc : bool or None, optional + If ``True`` and `compound` is 'group', move all atoms to the primary + unit cell before calculation. If ``True`` and `compound` is + 'segments' or 'residues', the center of each compound will be + calculated without moving any atoms to keep the compounds intact. + Instead, the resulting position vectors will be moved to the primary + unit cell after calculation. compound : {'group', 'segments', 'residues'}, optional - If 'group', the center of mass of all atoms in the atomgroup will - be returned as a single position vector. Else, the centers of mass + If 'group', the center of geometry of all atoms in the group will be + returned as a single position vector. Else, the centers of geometry of each segment or residue will be returned as an array of position vectors, i.e. a 2d array. Note that, in any case, *only* the - positions of atoms *belonging to the atomgroup* will be - taken into account. + positions of atoms *belonging to the group* will be taken into + account. Returns ------- - center : ndarray - geometric center of group + center : numpy.ndarray with dtype=numpy.float32 + Position vector(s) of the geometric center(s) of the group. + If `compound` was set to 'group', the output will be a single + position vector. + If `compound` was set to 'segments' or 'residues', the output will be + a 2d array of shape ``(n, 3)`` where ``n`` is the number of + compounds. Notes ----- @@ -712,8 +753,9 @@ def center_of_geometry(self, pbc=None, compound='group'): .. versionchanged:: 0.8 Added `pbc` keyword + .. versionchanged:: 0.19.0 Added `compound` parameter """ - return self.center(np.ones(self.n_atoms), pbc=pbc, compound=compound) + return self.center(None, pbc=pbc, compound=compound) centroid = center_of_geometry diff --git a/package/MDAnalysis/core/topologyattrs.py b/package/MDAnalysis/core/topologyattrs.py index 141f231e19f..a864e060def 100644 --- a/package/MDAnalysis/core/topologyattrs.py +++ b/package/MDAnalysis/core/topologyattrs.py @@ -49,7 +49,7 @@ from . import flags from ..lib.util import cached, convert_aa_code, iterable -from ..lib import distances, transformations, mdamath +from ..lib import transformations, mdamath from ..exceptions import NoDataError, SelectionError from .topologyobjects import TopologyGroup from . import selection @@ -789,22 +789,21 @@ def center_of_mass(group, pbc=None, compound='group'): Parameters ---------- - compound : {'group', 'segments', 'residues'}, optional - If 'group', the center of mass of all atoms in the atomgroup will - be returned as a single position vector. Else, the centers of mass - of each segment or residue will be returned as an array of position - vectors, i.e. a 2d array. Note that, in any case, *only* the - positions of atoms *belonging to the atomgroup* will be - taken into account. pbc : bool, optional If ``True`` and `compound` is 'group', move all atoms to the primary unit cell before calculation. - If ``True`` and `compund` is 'segments' or 'residues', the centers + If ``True`` and `compound` is 'segments' or 'residues', the centers of mass of each compound will be calculated without moving any atoms to keep the compounds intact. Instead, the resulting center-of-mass position vectors will be moved to the primary unit cell after calculation. - [``False``] + compound : {'group', 'segments', 'residues'}, optional + If 'group', the center of mass of all atoms in the atomgroup will + be returned as a single position vector. Else, the centers of mass + of each segment or residue will be returned as an array of position + vectors, i.e. a 2d array. Note that, in any case, *only* the + positions of atoms *belonging to the atomgroup* will be + taken into account. Returns ------- @@ -812,7 +811,7 @@ def center_of_mass(group, pbc=None, compound='group'): Position vector(s) of the center(s) of mass of the group. If `compound` was set to 'group', the output will be a single position vector. - If `compund` was set to 'segments' or 'residues', the output will + If `compound` was set to 'segments' or 'residues', the output will be a 2d array of shape ``(n, 3)`` where ``n`` is the number compounds. From df65850ef005b0cdb4bf93adc10d9eaa9c4399e0 Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 22 May 2018 18:31:28 +0200 Subject: [PATCH 054/455] Changed return type of `center()` from `np.float32` to `group.positions.dtype` in order to not break a gazillion of tests --- package/MDAnalysis/core/groups.py | 10 ++++------ package/MDAnalysis/core/topologyattrs.py | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 92104f6aff6..33d822e01e4 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -630,7 +630,7 @@ def center(self, weights, pbc=None, compound='group'): Returns ------- - center : numpy.ndarray with dtype=numpy.float32 + center : numpy.ndarray Position vector(s) of the weighted center(s) of the group. If `compound` was set to 'group', the output will be a single position vector. @@ -669,9 +669,7 @@ def center(self, weights, pbc=None, compound='group'): coords = atoms.pack_into_box(inplace=False) else: coords = atoms.positions - centers = np.average(coords, weights=weights, axis=0) - return centers.astype(np.float32) #TODO: check if astype() is really required (according to the numpy manual: no) - + return np.average(coords, weights=weights, axis=0) elif compound.lower() == 'residues': compound_indices = atoms.resindices n_compounds = atoms.n_residues @@ -690,7 +688,7 @@ def center(self, weights, pbc=None, compound='group'): if weights is not None: weights = weights[sort_indices] # Allocate output array: - centers = np.zeros((n_compounds, 3), dtype=np.float32) + centers = np.zeros((n_compounds, 3), dtype=coords.dtype) # Get sizes of compounds: unique_compound_indices, compound_sizes = np.unique(compound_indices, return_counts=True) @@ -738,7 +736,7 @@ def center_of_geometry(self, pbc=None, compound='group'): Returns ------- - center : numpy.ndarray with dtype=numpy.float32 + center : numpy.ndarray Position vector(s) of the geometric center(s) of the group. If `compound` was set to 'group', the output will be a single position vector. diff --git a/package/MDAnalysis/core/topologyattrs.py b/package/MDAnalysis/core/topologyattrs.py index a864e060def..1a1c24db117 100644 --- a/package/MDAnalysis/core/topologyattrs.py +++ b/package/MDAnalysis/core/topologyattrs.py @@ -807,7 +807,7 @@ def center_of_mass(group, pbc=None, compound='group'): Returns ------- - center : numpy.ndarray with dtype=numpy.float32 + center : numpy.ndarray Position vector(s) of the center(s) of mass of the group. If `compound` was set to 'group', the output will be a single position vector. From b210f45afa365d4132d75a322c32d9de19c2f890 Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 22 May 2018 21:51:04 +0200 Subject: [PATCH 055/455] Modified tests for `group.center*()` methods; replaced `np.isin()` by `np.in1d()` in `center()` to support numpy < 1.13.0 --- package/MDAnalysis/core/groups.py | 2 +- .../MDAnalysisTests/core/test_atomgroup.py | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 33d822e01e4..e73a4ef9bbc 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -697,7 +697,7 @@ def center(self, weights, pbc=None, compound='group'): for compound_size in unique_compound_sizes: compound_mask = compound_sizes == compound_size _compound_indices = unique_compound_indices[compound_mask] - atoms_mask = np.isin(compound_indices, _compound_indices) + atoms_mask = np.in1d(compound_indices, _compound_indices) _coords = coords[atoms_mask].reshape((-1, compound_size, 3)) if weights is None: _centers = _coords.mean(axis=1) diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index 01eb60010eb..6314901a566 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -33,7 +33,7 @@ ) import MDAnalysis as mda -from MDAnalysis.lib import transformations +from MDAnalysis.lib import distances, transformations from MDAnalysis.core.topologyobjects import ( Bond, Angle, @@ -905,18 +905,28 @@ def test_center_of_mass(self, ag): assert_almost_equal(ag.center_of_mass(), [-0.01094035, 0.05727601, -0.12885778], decimal=5) + @pytest.mark.parametrize('pbc', (True, False)) @pytest.mark.parametrize('name, compound', (('resids', 'residues'), ('segids', 'segments'))) - def test_center_of_geometry_compounds(self, ag, name, compound): + def test_center_of_geometry_compounds(self, ag, pbc, name, compound): + ag.universe.dimensions = [50, 50, 50, 90, 90, 90] ref = [a.center_of_geometry() for a in ag.groupby(name).values()] - cog = ag.center_of_geometry(compound=compound) + if pbc: + ref = np.asarray(ref, dtype=np.float32) + ref = distances.apply_PBC(ref, ag.dimensions) + cog = ag.center_of_geometry(pbc=pbc, compound=compound) assert_almost_equal(cog, ref, decimal=5) + @pytest.mark.parametrize('pbc', (True, False)) @pytest.mark.parametrize('name, compound', (('resids', 'residues'), ('segids', 'segments'))) - def test_center_of_mass_compounds(self, ag, name, compound): + def test_center_of_mass_compounds(self, ag, pbc, name, compound): + ag.universe.dimensions = [50, 50, 50, 90, 90, 90] ref = [a.center_of_mass() for a in ag.groupby(name).values()] - com = ag.center_of_mass(compound=compound) + if pbc: + ref = np.asarray(ref, dtype=np.float32) + ref = distances.apply_PBC(ref, ag.dimensions) + com = ag.center_of_mass(pbc=pbc, compound=compound) assert_almost_equal(com, ref, decimal=5) def test_center_wrong_compound(self, ag): From 2f2c4e8ddf661ba5bd14e3637978768dfcf89156 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Wed, 23 May 2018 12:54:06 +0200 Subject: [PATCH 056/455] split tests into pbc and no pbc --- .../MDAnalysisTests/core/test_atomgroup.py | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index 6314901a566..e06d2af8094 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -905,28 +905,38 @@ def test_center_of_mass(self, ag): assert_almost_equal(ag.center_of_mass(), [-0.01094035, 0.05727601, -0.12885778], decimal=5) - @pytest.mark.parametrize('pbc', (True, False)) @pytest.mark.parametrize('name, compound', (('resids', 'residues'), ('segids', 'segments'))) - def test_center_of_geometry_compounds(self, ag, pbc, name, compound): - ag.universe.dimensions = [50, 50, 50, 90, 90, 90] + def test_center_of_geometry_compounds(self, ag, name, compound): ref = [a.center_of_geometry() for a in ag.groupby(name).values()] - if pbc: - ref = np.asarray(ref, dtype=np.float32) - ref = distances.apply_PBC(ref, ag.dimensions) - cog = ag.center_of_geometry(pbc=pbc, compound=compound) + cog = ag.center_of_geometry(compound=compound) assert_almost_equal(cog, ref, decimal=5) - @pytest.mark.parametrize('pbc', (True, False)) @pytest.mark.parametrize('name, compound', (('resids', 'residues'), ('segids', 'segments'))) - def test_center_of_mass_compounds(self, ag, pbc, name, compound): - ag.universe.dimensions = [50, 50, 50, 90, 90, 90] + def test_center_of_mass_compounds(self, ag, name, compound): ref = [a.center_of_mass() for a in ag.groupby(name).values()] - if pbc: - ref = np.asarray(ref, dtype=np.float32) - ref = distances.apply_PBC(ref, ag.dimensions) - com = ag.center_of_mass(pbc=pbc, compound=compound) + com = ag.center_of_mass(compound=compound) + assert_almost_equal(com, ref, decimal=5) + + @pytest.mark.parametrize('name, compound', (('resids', 'residues'), + ('segids', 'segments'))) + def test_center_of_geometry_compounds_pbc(self, ag, name, compound): + ag.dimensions = [50, 50, 50, 90, 90, 90] + ref = [a.center_of_geometry() for a in ag.groupby(name).values()] + ref = distances.apply_PBC(np.asarray(ref, dtype=np.float32), + ag.dimensions) + cog = ag.center_of_geometry(pbc=True, compound=compound) + assert_almost_equal(cog, ref, decimal=5) + + @pytest.mark.parametrize('name, compound', (('resids', 'residues'), + ('segids', 'segments'))) + def test_center_of_mass_compounds_pbc(self, ag, name, compound): + ag.dimensions = [50, 50, 50, 90, 90, 90] + ref = [a.center_of_mass() for a in ag.groupby(name).values()] + ref = distances.apply_PBC(np.asarray(ref, dtype=np.float32), + ag.dimensions) + com = ag.center_of_mass(pbc=True, compound=compound) assert_almost_equal(com, ref, decimal=5) def test_center_wrong_compound(self, ag): @@ -1053,6 +1063,7 @@ def test_packintobox_badshape(self, universe): def test_packintobox_noshape(self, universe): ag = universe.atoms[:10] + ag.dimensions = np.zeros(6) with pytest.raises(ValueError): ag.pack_into_box() From 85bcb5d33c99406bfdf49a2c4264ce21b5196005 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 22 May 2018 15:50:53 +0200 Subject: [PATCH 057/455] clean up warnings in tests - silence user warnings - test for deprecation warnings --- testsuite/MDAnalysisTests/core/test_atom.py | 6 ++- .../MDAnalysisTests/core/test_atomgroup.py | 38 +++++++++++----- .../core/test_topologyattrs.py | 13 +++--- .../MDAnalysisTests/core/test_universe.py | 43 +++++++++++++------ 4 files changed, 71 insertions(+), 29 deletions(-) diff --git a/testsuite/MDAnalysisTests/core/test_atom.py b/testsuite/MDAnalysisTests/core/test_atom.py index 2e920c93163..986e5558f80 100644 --- a/testsuite/MDAnalysisTests/core/test_atom.py +++ b/testsuite/MDAnalysisTests/core/test_atom.py @@ -22,6 +22,8 @@ from __future__ import absolute_import +import warnings + import MDAnalysis as mda import numpy as np import pytest @@ -120,7 +122,9 @@ class TestAtomNoForceNoVel(object): @staticmethod @pytest.fixture() def a(): - u = mda.Universe(XYZ_mini) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u = mda.Universe(XYZ_mini) return u.atoms[0] def test_velocity_fail(self, a): diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index e06d2af8094..f34723b06d7 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -24,6 +24,7 @@ from glob import glob import itertools from os import path +import warnings import numpy as np @@ -102,7 +103,9 @@ def u(self): def test_write_no_args(self, u, tmpdir): with tmpdir.as_cwd(): - u.atoms.write() + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u.atoms.write() files = glob('*') assert len(files) == 1 @@ -149,7 +152,9 @@ def universe_from_tmp(self, outfile): return mda.Universe(outfile, convert_units=True) def test_write_atoms(self, universe, outfile): - universe.atoms.write(outfile) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + universe.atoms.write(outfile) u2 = self.universe_from_tmp(outfile) assert_almost_equal( universe.atoms.positions, u2.atoms.positions, @@ -164,7 +169,9 @@ def test_write_empty_atomgroup(self, universe, outfile): def test_write_selection(self, universe, outfile): CA = universe.select_atoms('name CA') - CA.write(outfile) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + CA.write(outfile) u2 = self.universe_from_tmp(outfile) # check EVERYTHING, otherwise we might get false positives! CA2 = u2.atoms @@ -176,8 +183,10 @@ def test_write_selection(self, universe, outfile): def test_write_Residue(self, universe, outfile): G = universe.select_atoms('segid 4AKE and resname ARG').residues[-2].atoms # 2nd but last Arg - G.write(outfile) - u2 = self.universe_from_tmp(outfile) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + G.write(outfile) + u2 = self.universe_from_tmp(outfile) # check EVERYTHING, otherwise we might get false positives! G2 = u2.atoms assert len(u2.atoms) == len(G.atoms), "written R206 Residue does not " \ @@ -188,8 +197,10 @@ def test_write_Residue(self, universe, outfile): def test_write_ResidueGroup(self, universe, outfile): G = universe.select_atoms('segid 4AKE and resname LEU') - G.write(outfile) - u2 = self.universe_from_tmp(outfile) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + G.write(outfile) + u2 = self.universe_from_tmp(outfile) G2 = u2.atoms assert len(u2.atoms) == len(G.atoms), "written LEU ResidueGroup does " \ "not match original ResidueGroup" @@ -199,7 +210,9 @@ def test_write_ResidueGroup(self, universe, outfile): def test_write_Segment(self, universe, outfile): G = universe.select_atoms('segid 4AKE') - G.write(outfile) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + G.write(outfile) u2 = self.universe_from_tmp(outfile) G2 = u2.atoms assert len(u2.atoms) == len(G.atoms), "written s4AKE segment does not" \ @@ -210,7 +223,8 @@ def test_write_Segment(self, universe, outfile): def test_write_Universe(self, universe, outfile): U = universe - with mda.Writer(outfile) as W: + with mda.Writer(outfile) as W, warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) W.write(U) u2 = self.universe_from_tmp(outfile) assert len(u2.atoms) == len(U.atoms), "written 4AKE universe does not" \ @@ -829,7 +843,8 @@ def test_override_flag(self, ag, ref_noPBC): def test_instantselection_termini(): """Test that instant selections work, even for residues that are also termini (Issue 70)""" universe = mda.Universe(PSF, DCD) - assert_equal(universe.residues[20].CA.name, 'CA', "CA of MET21 is not selected correctly") + with pytest.deprecated_call(): + assert_equal(universe.residues[20].CA.name, 'CA', "CA of MET21 is not selected correctly") del universe @@ -861,7 +876,8 @@ def test_getitem_slice2(self, universe): universe.atoms.ix[0:8:2]) def test_getitem_str(self, universe): - ag1 = universe.atoms['HT1'] + with pytest.deprecated_call(): + ag1 = universe.atoms['HT1'] # select_atoms always returns an AtomGroup even if single result ag2 = universe.select_atoms('name HT1')[0] assert_equal(ag1, ag2) diff --git a/testsuite/MDAnalysisTests/core/test_topologyattrs.py b/testsuite/MDAnalysisTests/core/test_topologyattrs.py index a40fb644280..f9f697a056c 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyattrs.py +++ b/testsuite/MDAnalysisTests/core/test_topologyattrs.py @@ -282,7 +282,8 @@ class TestResnames(TestResidueAttr): def test_residuegroup_getattr_single(self): u = make_Universe(('resnames',)) - res = u.residues.RsB + with pytest.deprecated_call(): + res = u.residues.RsB assert isinstance(res, groups.Residue) assert res == u.residues[1] @@ -291,7 +292,8 @@ def test_residuegroup_getattr_multiple(self): u = make_Universe(('resnames',)) u.residues[:10].resnames = 'ABC' - rg = u.residues.ABC + with pytest.deprecated_call(): + rg = u.residues.ABC assert isinstance(rg, groups.ResidueGroup) assert len(rg) == 10 @@ -301,11 +303,11 @@ def test_residuegroup_getattr_AE(self): with pytest.raises(AttributeError): getattr(u.residues, 'foo') - def test_segment_getattr_singular(self): u = make_Universe(('resnames',)) - res = u.segments[0].RsB + with pytest.deprecated_call(): + res = u.segments[0].RsB assert isinstance(res, groups.Residue) assert res == u.residues[1] @@ -314,7 +316,8 @@ def test_segment_getattr_multiple(self): u = make_Universe(('resnames',)) u.residues[:3].resnames = 'bar' - rg = u.segments[0].bar + with pytest.deprecated_call(): + rg = u.segments[0].bar assert isinstance(rg, groups.ResidueGroup) assert len(rg) == 3 diff --git a/testsuite/MDAnalysisTests/core/test_universe.py b/testsuite/MDAnalysisTests/core/test_universe.py index d002c56e5a8..8dc0c1ab478 100644 --- a/testsuite/MDAnalysisTests/core/test_universe.py +++ b/testsuite/MDAnalysisTests/core/test_universe.py @@ -23,7 +23,7 @@ from six.moves import cPickle - +import warnings import os try: @@ -86,12 +86,16 @@ def test_load(self): assert_equal(len(u.atoms), 3341, "Loading universe failed somehow") def test_load_topology_stringio(self): - u = mda.Universe(StringIO(CHOL_GRO), format='GRO') + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u = mda.Universe(StringIO(CHOL_GRO), format='GRO') assert_equal(len(u.atoms), 8, "Loading universe from StringIO failed somehow") assert_equal(u.trajectory.ts.positions[0], np.array([65.580002, 29.360001, 40.050003], dtype=np.float32)) def test_load_trajectory_stringio(self): - u = mda.Universe(StringIO(CHOL_GRO), StringIO(CHOL_GRO), format='GRO', topology_format='GRO') + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u = mda.Universe(StringIO(CHOL_GRO), StringIO(CHOL_GRO), format='GRO', topology_format='GRO') assert_equal(len(u.atoms), 8, "Loading universe from StringIO failed somehow") def test_make_universe_no_args(self): @@ -346,19 +350,24 @@ def test_universe_guess_bonds(self): def test_universe_guess_bonds_no_vdwradii(self): """Make a Universe that has atoms with unknown vdwradii.""" - with pytest.raises(ValueError): + with pytest.raises(ValueError), warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) mda.Universe(two_water_gro_nonames, guess_bonds = True) def test_universe_guess_bonds_with_vdwradii(self, vdw): """Unknown atom types, but with vdw radii here to save the day""" - u = mda.Universe(two_water_gro_nonames, guess_bonds=True, - vdwradii=vdw) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u = mda.Universe(two_water_gro_nonames, guess_bonds=True, + vdwradii=vdw) self._check_universe(u) assert u.kwargs['guess_bonds'] assert_equal(vdw, u.kwargs['vdwradii']) def test_universe_guess_bonds_off(self): - u = mda.Universe(two_water_gro_nonames, guess_bonds=False) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u = mda.Universe(two_water_gro_nonames, guess_bonds=False) for attr in ('bonds', 'angles', 'dihedrals'): assert not hasattr(u, attr) @@ -390,14 +399,18 @@ def test_atomgroup_guess_bonds(self): self._check_atomgroup(ag, u) def test_atomgroup_guess_bonds_no_vdwradii(self): - u = mda.Universe(two_water_gro_nonames) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u = mda.Universe(two_water_gro_nonames) ag = u.atoms[:3] with pytest.raises(ValueError): ag.guess_bonds() def test_atomgroup_guess_bonds_with_vdwradii(self, vdw): - u = mda.Universe(two_water_gro_nonames) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + u = mda.Universe(two_water_gro_nonames) ag = u.atoms[:3] ag.guess_bonds(vdwradii=vdw) @@ -599,15 +612,21 @@ def test_add_charges(self, universe, toadd, attrname, default): class TestAllCoordinatesKwarg(object): @pytest.fixture(scope='class') def u_GRO_TRR(self): - return mda.Universe(GRO, TRR) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + return mda.Universe(GRO, TRR) @pytest.fixture(scope='class') def u_GRO_TRR_allcoords(self): - return mda.Universe(GRO, TRR, all_coordinates=True) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + return mda.Universe(GRO, TRR, all_coordinates=True) @pytest.fixture(scope='class') def u_GRO(self): - return mda.Universe(GRO) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', UserWarning) + return mda.Universe(GRO) def test_all_coordinates_length(self, u_GRO_TRR, u_GRO_TRR_allcoords): # length with all_coords should be +1 From 72f70fe3aa75e90aad0c96291cc06b2054150406 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 22 May 2018 16:01:36 +0200 Subject: [PATCH 058/455] fix warnings in import --- .../MDAnalysisTests/import/fork_called.py | 3 ++ .../MDAnalysisTests/import/test_import.py | 52 +++++++++++-------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/testsuite/MDAnalysisTests/import/fork_called.py b/testsuite/MDAnalysisTests/import/fork_called.py index 54ae8d52492..5fbcbd37de6 100644 --- a/testsuite/MDAnalysisTests/import/fork_called.py +++ b/testsuite/MDAnalysisTests/import/fork_called.py @@ -22,6 +22,9 @@ from __future__ import absolute_import, print_function import os import mock +import warnings + +warnings.simplefilter('ignore', ImportWarning) """Tests whether os.fork() is called as a side effect when importing MDAnalysis. See PR #1794 for details.""" diff --git a/testsuite/MDAnalysisTests/import/test_import.py b/testsuite/MDAnalysisTests/import/test_import.py index c50b88d7c5d..4dc5a0dd6c3 100644 --- a/testsuite/MDAnalysisTests/import/test_import.py +++ b/testsuite/MDAnalysisTests/import/test_import.py @@ -23,37 +23,43 @@ import sys import os import subprocess +import warnings """Test if importing MDAnalysis has unwanted side effects (PR #1794).""" class TestMDAImport(object): # Tests concerning importing MDAnalysis. def test_os_dot_fork_not_called(self): - # Importing MDAnalysis shall not trigger calls to os.fork (see PR #1794) - # This test has to run in a separate Python instance to ensure that - # no previously imported modules interfere with it. It is therefore - # offloaded to the script "fork_called.py". - loc = os.path.dirname(os.path.realpath(__file__)) - script = os.path.join(loc, 'fork_called.py') - encoding = sys.stdout.encoding - if encoding is None: - encoding = "utf-8" - # If the script we are about to call fails, we want its stderr to show - # up in the pytest log. This is accomplished by redirecting the stderr - # of the subprocess to its stdout and catching the raised - # CalledProcessError. That error's output member then contains the - # failed script's stderr and we can print it: - try: - out = subprocess.check_output([sys.executable, script], - stderr=subprocess.STDOUT)\ - .decode(encoding) - except subprocess.CalledProcessError as err: - print(err.output) - raise(err) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', ImportWarning) + # Importing MDAnalysis shall not trigger calls to os.fork (see PR #1794) + # This test has to run in a separate Python instance to ensure that + # no previously imported modules interfere with it. It is therefore + # offloaded to the script "fork_called.py". + loc = os.path.dirname(os.path.realpath(__file__)) + script = os.path.join(loc, 'fork_called.py') + encoding = sys.stdout.encoding + if encoding is None: + encoding = "utf-8" + # If the script we are about to call fails, we want its stderr to show + # up in the pytest log. This is accomplished by redirecting the stderr + # of the subprocess to its stdout and catching the raised + # CalledProcessError. That error's output member then contains the + # failed script's stderr and we can print it: + try: + out = subprocess.check_output([sys.executable, script], + stderr=subprocess.STDOUT)\ + .decode(encoding) + except subprocess.CalledProcessError as err: + print(err.output) + raise(err) def test_os_dot_fork_not_none(self): # In MDAnalysis.core.universe, os.fork is set to None prior to importing # the uuid module and restored afterwards (see PR #1794 for details). # This tests asserts that os.fork has been restored. - import MDAnalysis - assert os.fork is not None + with warnings.catch_warnings(): + warnings.simplefilter('ignore', ImportWarning) + warnings.simplefilter('ignore', RuntimeWarning) + import MDAnalysis + assert os.fork is not None From b0106ad56c56b48669b4424740efad99b05a5214 Mon Sep 17 00:00:00 2001 From: Tyler Date: Tue, 22 May 2018 21:21:02 -0600 Subject: [PATCH 059/455] TST: ignore some os.fork() related unit tests on Windows. --- testsuite/MDAnalysisTests/import/test_import.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/testsuite/MDAnalysisTests/import/test_import.py b/testsuite/MDAnalysisTests/import/test_import.py index 4dc5a0dd6c3..4c15275abe1 100644 --- a/testsuite/MDAnalysisTests/import/test_import.py +++ b/testsuite/MDAnalysisTests/import/test_import.py @@ -24,9 +24,12 @@ import os import subprocess import warnings +import pytest """Test if importing MDAnalysis has unwanted side effects (PR #1794).""" +@pytest.mark.skipif(os.name == 'nt', + reason="fork-related import checks irrelevant on Windows") class TestMDAImport(object): # Tests concerning importing MDAnalysis. def test_os_dot_fork_not_called(self): From 18186ae3fd48d8bc149b8e890f8fd70f465930b0 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Fri, 25 May 2018 06:05:40 +0200 Subject: [PATCH 060/455] Revert "fix warnings in import" This reverts commit 72f70fe3aa75e90aad0c96291cc06b2054150406. --- .../MDAnalysisTests/import/fork_called.py | 3 -- .../MDAnalysisTests/import/test_import.py | 52 ++++++++----------- 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/testsuite/MDAnalysisTests/import/fork_called.py b/testsuite/MDAnalysisTests/import/fork_called.py index 5fbcbd37de6..54ae8d52492 100644 --- a/testsuite/MDAnalysisTests/import/fork_called.py +++ b/testsuite/MDAnalysisTests/import/fork_called.py @@ -22,9 +22,6 @@ from __future__ import absolute_import, print_function import os import mock -import warnings - -warnings.simplefilter('ignore', ImportWarning) """Tests whether os.fork() is called as a side effect when importing MDAnalysis. See PR #1794 for details.""" diff --git a/testsuite/MDAnalysisTests/import/test_import.py b/testsuite/MDAnalysisTests/import/test_import.py index 4c15275abe1..277d85a450d 100644 --- a/testsuite/MDAnalysisTests/import/test_import.py +++ b/testsuite/MDAnalysisTests/import/test_import.py @@ -23,7 +23,6 @@ import sys import os import subprocess -import warnings import pytest """Test if importing MDAnalysis has unwanted side effects (PR #1794).""" @@ -33,36 +32,31 @@ class TestMDAImport(object): # Tests concerning importing MDAnalysis. def test_os_dot_fork_not_called(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', ImportWarning) - # Importing MDAnalysis shall not trigger calls to os.fork (see PR #1794) - # This test has to run in a separate Python instance to ensure that - # no previously imported modules interfere with it. It is therefore - # offloaded to the script "fork_called.py". - loc = os.path.dirname(os.path.realpath(__file__)) - script = os.path.join(loc, 'fork_called.py') - encoding = sys.stdout.encoding - if encoding is None: - encoding = "utf-8" - # If the script we are about to call fails, we want its stderr to show - # up in the pytest log. This is accomplished by redirecting the stderr - # of the subprocess to its stdout and catching the raised - # CalledProcessError. That error's output member then contains the - # failed script's stderr and we can print it: - try: - out = subprocess.check_output([sys.executable, script], - stderr=subprocess.STDOUT)\ - .decode(encoding) - except subprocess.CalledProcessError as err: - print(err.output) - raise(err) + # Importing MDAnalysis shall not trigger calls to os.fork (see PR #1794) + # This test has to run in a separate Python instance to ensure that + # no previously imported modules interfere with it. It is therefore + # offloaded to the script "fork_called.py". + loc = os.path.dirname(os.path.realpath(__file__)) + script = os.path.join(loc, 'fork_called.py') + encoding = sys.stdout.encoding + if encoding is None: + encoding = "utf-8" + # If the script we are about to call fails, we want its stderr to show + # up in the pytest log. This is accomplished by redirecting the stderr + # of the subprocess to its stdout and catching the raised + # CalledProcessError. That error's output member then contains the + # failed script's stderr and we can print it: + try: + out = subprocess.check_output([sys.executable, script], + stderr=subprocess.STDOUT)\ + .decode(encoding) + except subprocess.CalledProcessError as err: + print(err.output) + raise(err) def test_os_dot_fork_not_none(self): # In MDAnalysis.core.universe, os.fork is set to None prior to importing # the uuid module and restored afterwards (see PR #1794 for details). # This tests asserts that os.fork has been restored. - with warnings.catch_warnings(): - warnings.simplefilter('ignore', ImportWarning) - warnings.simplefilter('ignore', RuntimeWarning) - import MDAnalysis - assert os.fork is not None + import MDAnalysis + assert os.fork is not None From 636a2097212ac7c6836cd92e688b0dd9f2fcea46 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Fri, 25 May 2018 06:05:40 +0200 Subject: [PATCH 061/455] Revert "clean up warnings in tests" This reverts commit 85bcb5d33c99406bfdf49a2c4264ce21b5196005. --- testsuite/MDAnalysisTests/core/test_atom.py | 6 +-- .../MDAnalysisTests/core/test_atomgroup.py | 38 +++++----------- .../core/test_topologyattrs.py | 13 +++--- .../MDAnalysisTests/core/test_universe.py | 43 ++++++------------- 4 files changed, 29 insertions(+), 71 deletions(-) diff --git a/testsuite/MDAnalysisTests/core/test_atom.py b/testsuite/MDAnalysisTests/core/test_atom.py index 986e5558f80..2e920c93163 100644 --- a/testsuite/MDAnalysisTests/core/test_atom.py +++ b/testsuite/MDAnalysisTests/core/test_atom.py @@ -22,8 +22,6 @@ from __future__ import absolute_import -import warnings - import MDAnalysis as mda import numpy as np import pytest @@ -122,9 +120,7 @@ class TestAtomNoForceNoVel(object): @staticmethod @pytest.fixture() def a(): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u = mda.Universe(XYZ_mini) + u = mda.Universe(XYZ_mini) return u.atoms[0] def test_velocity_fail(self, a): diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index f34723b06d7..e06d2af8094 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -24,7 +24,6 @@ from glob import glob import itertools from os import path -import warnings import numpy as np @@ -103,9 +102,7 @@ def u(self): def test_write_no_args(self, u, tmpdir): with tmpdir.as_cwd(): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u.atoms.write() + u.atoms.write() files = glob('*') assert len(files) == 1 @@ -152,9 +149,7 @@ def universe_from_tmp(self, outfile): return mda.Universe(outfile, convert_units=True) def test_write_atoms(self, universe, outfile): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - universe.atoms.write(outfile) + universe.atoms.write(outfile) u2 = self.universe_from_tmp(outfile) assert_almost_equal( universe.atoms.positions, u2.atoms.positions, @@ -169,9 +164,7 @@ def test_write_empty_atomgroup(self, universe, outfile): def test_write_selection(self, universe, outfile): CA = universe.select_atoms('name CA') - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - CA.write(outfile) + CA.write(outfile) u2 = self.universe_from_tmp(outfile) # check EVERYTHING, otherwise we might get false positives! CA2 = u2.atoms @@ -183,10 +176,8 @@ def test_write_selection(self, universe, outfile): def test_write_Residue(self, universe, outfile): G = universe.select_atoms('segid 4AKE and resname ARG').residues[-2].atoms # 2nd but last Arg - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - G.write(outfile) - u2 = self.universe_from_tmp(outfile) + G.write(outfile) + u2 = self.universe_from_tmp(outfile) # check EVERYTHING, otherwise we might get false positives! G2 = u2.atoms assert len(u2.atoms) == len(G.atoms), "written R206 Residue does not " \ @@ -197,10 +188,8 @@ def test_write_Residue(self, universe, outfile): def test_write_ResidueGroup(self, universe, outfile): G = universe.select_atoms('segid 4AKE and resname LEU') - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - G.write(outfile) - u2 = self.universe_from_tmp(outfile) + G.write(outfile) + u2 = self.universe_from_tmp(outfile) G2 = u2.atoms assert len(u2.atoms) == len(G.atoms), "written LEU ResidueGroup does " \ "not match original ResidueGroup" @@ -210,9 +199,7 @@ def test_write_ResidueGroup(self, universe, outfile): def test_write_Segment(self, universe, outfile): G = universe.select_atoms('segid 4AKE') - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - G.write(outfile) + G.write(outfile) u2 = self.universe_from_tmp(outfile) G2 = u2.atoms assert len(u2.atoms) == len(G.atoms), "written s4AKE segment does not" \ @@ -223,8 +210,7 @@ def test_write_Segment(self, universe, outfile): def test_write_Universe(self, universe, outfile): U = universe - with mda.Writer(outfile) as W, warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) + with mda.Writer(outfile) as W: W.write(U) u2 = self.universe_from_tmp(outfile) assert len(u2.atoms) == len(U.atoms), "written 4AKE universe does not" \ @@ -843,8 +829,7 @@ def test_override_flag(self, ag, ref_noPBC): def test_instantselection_termini(): """Test that instant selections work, even for residues that are also termini (Issue 70)""" universe = mda.Universe(PSF, DCD) - with pytest.deprecated_call(): - assert_equal(universe.residues[20].CA.name, 'CA', "CA of MET21 is not selected correctly") + assert_equal(universe.residues[20].CA.name, 'CA', "CA of MET21 is not selected correctly") del universe @@ -876,8 +861,7 @@ def test_getitem_slice2(self, universe): universe.atoms.ix[0:8:2]) def test_getitem_str(self, universe): - with pytest.deprecated_call(): - ag1 = universe.atoms['HT1'] + ag1 = universe.atoms['HT1'] # select_atoms always returns an AtomGroup even if single result ag2 = universe.select_atoms('name HT1')[0] assert_equal(ag1, ag2) diff --git a/testsuite/MDAnalysisTests/core/test_topologyattrs.py b/testsuite/MDAnalysisTests/core/test_topologyattrs.py index f9f697a056c..a40fb644280 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyattrs.py +++ b/testsuite/MDAnalysisTests/core/test_topologyattrs.py @@ -282,8 +282,7 @@ class TestResnames(TestResidueAttr): def test_residuegroup_getattr_single(self): u = make_Universe(('resnames',)) - with pytest.deprecated_call(): - res = u.residues.RsB + res = u.residues.RsB assert isinstance(res, groups.Residue) assert res == u.residues[1] @@ -292,8 +291,7 @@ def test_residuegroup_getattr_multiple(self): u = make_Universe(('resnames',)) u.residues[:10].resnames = 'ABC' - with pytest.deprecated_call(): - rg = u.residues.ABC + rg = u.residues.ABC assert isinstance(rg, groups.ResidueGroup) assert len(rg) == 10 @@ -303,11 +301,11 @@ def test_residuegroup_getattr_AE(self): with pytest.raises(AttributeError): getattr(u.residues, 'foo') + def test_segment_getattr_singular(self): u = make_Universe(('resnames',)) - with pytest.deprecated_call(): - res = u.segments[0].RsB + res = u.segments[0].RsB assert isinstance(res, groups.Residue) assert res == u.residues[1] @@ -316,8 +314,7 @@ def test_segment_getattr_multiple(self): u = make_Universe(('resnames',)) u.residues[:3].resnames = 'bar' - with pytest.deprecated_call(): - rg = u.segments[0].bar + rg = u.segments[0].bar assert isinstance(rg, groups.ResidueGroup) assert len(rg) == 3 diff --git a/testsuite/MDAnalysisTests/core/test_universe.py b/testsuite/MDAnalysisTests/core/test_universe.py index 8dc0c1ab478..d002c56e5a8 100644 --- a/testsuite/MDAnalysisTests/core/test_universe.py +++ b/testsuite/MDAnalysisTests/core/test_universe.py @@ -23,7 +23,7 @@ from six.moves import cPickle -import warnings + import os try: @@ -86,16 +86,12 @@ def test_load(self): assert_equal(len(u.atoms), 3341, "Loading universe failed somehow") def test_load_topology_stringio(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u = mda.Universe(StringIO(CHOL_GRO), format='GRO') + u = mda.Universe(StringIO(CHOL_GRO), format='GRO') assert_equal(len(u.atoms), 8, "Loading universe from StringIO failed somehow") assert_equal(u.trajectory.ts.positions[0], np.array([65.580002, 29.360001, 40.050003], dtype=np.float32)) def test_load_trajectory_stringio(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u = mda.Universe(StringIO(CHOL_GRO), StringIO(CHOL_GRO), format='GRO', topology_format='GRO') + u = mda.Universe(StringIO(CHOL_GRO), StringIO(CHOL_GRO), format='GRO', topology_format='GRO') assert_equal(len(u.atoms), 8, "Loading universe from StringIO failed somehow") def test_make_universe_no_args(self): @@ -350,24 +346,19 @@ def test_universe_guess_bonds(self): def test_universe_guess_bonds_no_vdwradii(self): """Make a Universe that has atoms with unknown vdwradii.""" - with pytest.raises(ValueError), warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) + with pytest.raises(ValueError): mda.Universe(two_water_gro_nonames, guess_bonds = True) def test_universe_guess_bonds_with_vdwradii(self, vdw): """Unknown atom types, but with vdw radii here to save the day""" - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u = mda.Universe(two_water_gro_nonames, guess_bonds=True, - vdwradii=vdw) + u = mda.Universe(two_water_gro_nonames, guess_bonds=True, + vdwradii=vdw) self._check_universe(u) assert u.kwargs['guess_bonds'] assert_equal(vdw, u.kwargs['vdwradii']) def test_universe_guess_bonds_off(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u = mda.Universe(two_water_gro_nonames, guess_bonds=False) + u = mda.Universe(two_water_gro_nonames, guess_bonds=False) for attr in ('bonds', 'angles', 'dihedrals'): assert not hasattr(u, attr) @@ -399,18 +390,14 @@ def test_atomgroup_guess_bonds(self): self._check_atomgroup(ag, u) def test_atomgroup_guess_bonds_no_vdwradii(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u = mda.Universe(two_water_gro_nonames) + u = mda.Universe(two_water_gro_nonames) ag = u.atoms[:3] with pytest.raises(ValueError): ag.guess_bonds() def test_atomgroup_guess_bonds_with_vdwradii(self, vdw): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - u = mda.Universe(two_water_gro_nonames) + u = mda.Universe(two_water_gro_nonames) ag = u.atoms[:3] ag.guess_bonds(vdwradii=vdw) @@ -612,21 +599,15 @@ def test_add_charges(self, universe, toadd, attrname, default): class TestAllCoordinatesKwarg(object): @pytest.fixture(scope='class') def u_GRO_TRR(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - return mda.Universe(GRO, TRR) + return mda.Universe(GRO, TRR) @pytest.fixture(scope='class') def u_GRO_TRR_allcoords(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - return mda.Universe(GRO, TRR, all_coordinates=True) + return mda.Universe(GRO, TRR, all_coordinates=True) @pytest.fixture(scope='class') def u_GRO(self): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', UserWarning) - return mda.Universe(GRO) + return mda.Universe(GRO) def test_all_coordinates_length(self, u_GRO_TRR, u_GRO_TRR_allcoords): # length with all_coords should be +1 From 04db9034ab7d646b60b78e6a3234c8bd1a6a3e16 Mon Sep 17 00:00:00 2001 From: VOD555 Date: Thu, 8 Mar 2018 12:04:43 -0700 Subject: [PATCH 062/455] add new analysis.rdf_s module for calculating rdf seperately --- package/MDAnalysis/analysis/__init__.py | 1 + package/MDAnalysis/analysis/rdf_s.py | 166 ++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 package/MDAnalysis/analysis/rdf_s.py diff --git a/package/MDAnalysis/analysis/__init__.py b/package/MDAnalysis/analysis/__init__.py index 929568cec0f..9fcfb17e476 100644 --- a/package/MDAnalysis/analysis/__init__.py +++ b/package/MDAnalysis/analysis/__init__.py @@ -124,6 +124,7 @@ 'polymer', 'psa', 'rdf', + 'rdf_s', 'rms', 'waterdynamics', ] diff --git a/package/MDAnalysis/analysis/rdf_s.py b/package/MDAnalysis/analysis/rdf_s.py new file mode 100644 index 00000000000..cb823a84b7c --- /dev/null +++ b/package/MDAnalysis/analysis/rdf_s.py @@ -0,0 +1,166 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +""" +Radial Distribution Functions --- :mod:`MDAnalysis.analysis.rdf` +================================================================ + +Tools for calculating pair distribution functions ("radial +distribution functions" or "RDF"). + +.. Not Implemented yet: +.. - Structure factor? +.. - Coordination number + +""" +from __future__ import division, absolute_import +import numpy as np + +from ..lib.util import blocks_of +from ..lib import distances +from .base import AnalysisBase +from six.moves import zip, range + + +class InterRDF_s(AnalysisBase): + """Intermolecular pair distribution function + + InterRDF_s(u, g1, g2, nbins=75, range=(0.0, 15.0)) + + Arguments + --------- + u : Universe + A Universe contains atoms in ags + ags : list + A list AtomGroup pairs + nbins : int (optional) + Number of bins in the histogram [75] + range : tuple or list (optional) + The size of the RDF [0.0, 15.0] + start : int (optional) + The frame to start at (default is first) + stop : int (optional) + The frame to end at (default is last) + step : int (optional) + The step size through the trajectory in frames (default is + every frame) + + Example + ------- + First create the :class:`InterRDF_s` object, by supplying one Universe + and two AtomGroup selection lists then use the :meth:`run` method :: + + rdf = InterRDF_s(u, ags) + rdf.run() + + Results are available through the :attr:`bins` and :attr:`rdf_s` + attributes:: + + plt.plot(rdf.bins, rdf.rdf_s[0]) + + To generate cdf, use the 'cdf_s' mehthod + + rdf.cdf_s() + + Results are available through the :attr:'cdf_s' attributes:: + + plt.plot(rdf.bins, rdf.cdf_s[0]) + + .. versionadded:: 0.18.0 + + """ + def __init__(self, u, ags, + nbins=75, range=(0.0, 15.0), density=True, **kwargs): + super(InterRDF_s, self).__init__(u.universe.trajectory, **kwargs) + + # List of AtomGroups + self.ags = ags + + self.u = u + self._density = density + + self.rdf_settings = {'bins': nbins, + 'range': range} + + def _prepare(self): + # Empty list to store the RDF + count_list = [] + count, edges = np.histogram([-1], **self.rdf_settings) + count_list = [np.zeros((ag1.n_atoms, ag2.n_atoms, len(count)), dtype=np.float64) + for ag1, ag2 in self.ags] + + self.count = count_list + self.edges = edges + self.bins = 0.5 * (edges[:-1] + edges[1:]) + + # Need to know average volume + self.volume = 0.0 + + + def _single_frame(self): + for i, (ag1, ag2) in enumerate(self.ags): + result=distances.distance_array(ag1.positions, ag2.positions, + box=self.u.dimensions) + for j in range(ag1.n_atoms): + for k in range(ag2.n_atoms): + count = np.histogram(result[j, k], **self.rdf_settings)[0] + self.count[i][j, k, :] += count + + self.volume += self._ts.volume + + + def _conclude(self): + # Volume in each radial shell + vol = np.power(self.edges[1:], 3) - np.power(self.edges[:-1], 3) + vol *= 4/3.0 * np.pi + + # Empty lists to restore indices, RDF + indices = [] + rdf_s = [] + + for i, (ag1, ag2) in enumerate(self.ags): + # Number of each selection + nA = len(ag1) + nB = len(ag2) + N = nA * nB + indices.append([ag1.indices, ag2.indices]) + + # Average number density + box_vol = self.volume / self.n_frames + density = N / box_vol + + if self._density: + rdf_s.append(self.count[i] / (density * vol * self.n_frames)) + else: + rdf_s.append(self.count[i] / (vol * self.n_frames)) + + self.rdf_s = rdf_s + self.indices = indices + + def cdf_s(self): + # Empty list to restore CDF + cdf_s = [] + + for count in self.count: + cdf_s.append(np.cumsum(count, axis=2) / self.n_frames) + + self.cdf_s = cdf_s From 0fb3867ffe0c557ed663f357d2c6ddc6f0af5587 Mon Sep 17 00:00:00 2001 From: VOD555 Date: Thu, 26 Apr 2018 13:34:06 -0700 Subject: [PATCH 063/455] Add test file for rdf_s - Add test data files for rdf_s - add a module-level fixture rdf and remove rdf calculation - move YiiP_lipid files to data/analysis/ - add the file variables to datafiles.py - fix numpy.testing import error - gzip the YiiP GRO data file --- .../MDAnalysisTests/analysis/test_rdf_s.py | 104 ++++++++++++++++++ .../data/analysis/YiiP_lipids.gro.gz | Bin 0 -> 1000928 bytes .../data/analysis/YiiP_lipids.xtc | Bin 0 -> 822240 bytes testsuite/MDAnalysisTests/datafiles.py | 7 +- testsuite/setup.py | 3 +- 5 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 testsuite/MDAnalysisTests/analysis/test_rdf_s.py create mode 100644 testsuite/MDAnalysisTests/data/analysis/YiiP_lipids.gro.gz create mode 100644 testsuite/MDAnalysisTests/data/analysis/YiiP_lipids.xtc diff --git a/testsuite/MDAnalysisTests/analysis/test_rdf_s.py b/testsuite/MDAnalysisTests/analysis/test_rdf_s.py new file mode 100644 index 00000000000..053d6d26b36 --- /dev/null +++ b/testsuite/MDAnalysisTests/analysis/test_rdf_s.py @@ -0,0 +1,104 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +from __future__ import absolute_import +from six.moves import zip + +import pytest + +from numpy.testing import assert_almost_equal + +import MDAnalysis as mda +from MDAnalysis.analysis.rdf_s import InterRDF_s + +from MDAnalysisTests.datafiles import GRO_MEMPROT, XTC_MEMPROT + + +@pytest.fixture(scope='module') +def u(): + return mda.Universe(GRO_MEMPROT, XTC_MEMPROT) + + +@pytest.fixture(scope='module') +def sels(u): + s1 = u.select_atoms('name ZND and resid 289') + s2 = u.select_atoms('(name OD1 or name OD2) and resid 51 and sphzone 5.0 (resid 289)') + s3 = u.select_atoms('name ZND and (resid 291 or resid 292)') + s4 = u.select_atoms('(name OD1 or name OD2) and sphzone 5.0 (resid 291)') + ag = [[s1, s2], [s3, s4]] + return ag + +@pytest.fixture(scope='module') +def rdf(u,sels): + return InterRDF_s(u, sels).run() + +def test_nbins(u): + ag = sels(u) + rdf = InterRDF_s(u, ag, nbins=412).run() + + assert len(rdf.bins) == 412 + + +def test_range(u): + ag = sels(u) + rmin, rmax = 1.0, 13.0 + rdf = InterRDF_s(u, ag, range=(rmin, rmax)).run() + + assert rdf.edges[0] == rmin + assert rdf.edges[-1] == rmax + + +def test_count_size(rdf): + # ZND vs OD1 & OD2 + # should see 2 elements in rdf.count + # + assert len(rdf.count) == 2 + assert len(rdf.count[0]) == 1 + assert len(rdf.count[0][0]) == 2 + assert len(rdf.count[1]) == 2 + assert len(rdf.count[1][0]) == 2 + assert len(rdf.count[1][1]) == 2 + + +def test_count(rdf): + # should see one distance with 5 counts in count[0][0][1] + # should see one distance with 3 counts in count[1][1][0] + assert len(rdf.count[0][0][1][rdf.count[0][0][1] == 5]) == 1 + assert len(rdf.count[1][1][0][rdf.count[1][1][0] == 3]) == 1 + + +def test_double_run(rdf): + # running rdf twice should give the same result + assert len(rdf.count[0][0][1][rdf.count[0][0][1] == 5]) == 1 + assert len(rdf.count[1][1][0][rdf.count[1][1][0] == 3]) == 1 + +def test_cdf(rdf): + rdf.cdf_s() + assert rdf.cdf_s[0][0][0][-1] == rdf.count[0][0][0].sum()/rdf.n_frames + + +@pytest.mark.parametrize("density, value", [ + (True, 13275.775528444701), + (False, 0.021915460340071267)]) + +def test_density(u, sels, density, value): + rdf = InterRDF_s(u, sels, density=density).run() + assert_almost_equal(max(rdf.rdf_s[0][0][0]), value) diff --git a/testsuite/MDAnalysisTests/data/analysis/YiiP_lipids.gro.gz b/testsuite/MDAnalysisTests/data/analysis/YiiP_lipids.gro.gz new file mode 100644 index 0000000000000000000000000000000000000000..35603005e0450d57cfb1aa3f1df13199f965db85 GIT binary patch literal 1000928 zcmX6^bzBtR7Znht#HFQOx{*|3>0Em0T9hTEI~Jt7ySuxkLr}WAL8QC8{H@>Lzi-~> z&b*m<_nv#sd6Z#jXqK%nbzh)po0%yaSen_I89A_-+S|M^${31tlC{p*aSQ$CBaCws zhV*uS8;n#?DwV{NXF<0Fihj*G4zRpEY9F{dOK;C3jjk;l9|$M!`g~g3bbDd&_o>S3 zVeaqk!QaQ*lfNe$!q3+~p8Nhj-~7Ee%MyCt>pSs$I!^lW_#E}a>oG~#>qbe~BmeK^ z*{|QvB!7PiKixigJuLlr>NEIzeP;9b`ONF@%=3`f<4#mm)Md({@ZWKB-95@muQQIn zckEuzr+**K|FRqW)f93_x&AHea5Oh|rak+7nne6g!w0 zokC+Y7G-nCH8OLUTl$sSQ;?4_bk_XH>RRnmvGs>sM`Pb_rl*3wtOQE&hPZB3J+Tl``n_9qyOl<_~vR_yAHB7Z!8ZQm9`yF87y# zRmuGk>rJe^O8mxtUR+2&rL=RO4vo@%{6$HZFU;#)OMiuH-q zj`@a4&66=Y3Dbb^`8VaTeLchmLLNBulxht+50a{Gq<-F?@%=a57$zN?sptIbV*~f! zt)b!D4JYE3GXRyiett~>Sf&sE`_GMnu;g_OgPS#gVUhL}jFyW)u`g?4cH~n^rk?au z1@y1m$cDqPvZk4(Mcmj#=J(Wkq6#xf{&fq3EHO_9Qr&`@XQCqqez8PMSt}WbMxiSG zxj%sQEWd~&N#>L`@5%WC)Od86vVl+J%o8gmuBgweddvfyU|6dpX_CT~>OS=uya>=L zpiYw3I_-H%s8nIpw5oS+*t@^DJA@KbdnD}fblD+5P?fz)Y*qX;EtLqxv`##cU3>tn zyA*+84pW)a{4n=+xxZm*`rD#W1eL^BvUSwhAb?*VOr|b35;qFu?CG;2w#GgF^nh$J`#h znYbFbSumx5W?SPLbv8%n-z|WlSNt1&1tDEyCFkpiWrvm%jeGDlpFqKeB-O0&z(u$$?nDksqek2k>0YJb2$yKd{Oa zmHJ^G?;}|MhoH(s3*5zMB6fjDpdj@seKaO=$`1H$xAKj3`Y20Bi~vFU7e2n`X~*

|N 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%0A3zXISp%a6R_ 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%0D}_wB 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%0A7WPMh_5OL*qn(#Crb4L7@ zA~fI`Ea9EUpDr%W-q$saZaFWj>bE7kmS;*EG6cj zL6zyIkZ0KaV=>^w4#3eb{O-%j?mY`^&l#7irH#%#pCV?$-eLzAaGbl7kZ(c}c0&u@ zwc7oO4AMP#gO_*20z1d2XK0SQfnbC@B`x7}r_-A>BxAqYkv*d5oANm7&RB$U>|AO4 zI*qEDZdfn`;9X$YWfZ)1lmC&JOhPbvC*)XE$<3(#N z0B|5j@8PqhN$7j19`E&reyqtI{<8IsRXt1%WQ->5T(2J-KMZLfv{Ws^}`{giazCotOUmOZA&&(ASRy5#({nkB@oFD>Gch4 zX@ikZ_FE>`HIKJYg!-WAAb6NODB^uorcbYZeinI-{JdK^qO)ipdmc!%sowCfn+tqN ziA*+#MaKFamhoSfb*+;C)D{{+_e@;b}$DYC+g-=(e1LpSyg6<~tz!owlyaI3A^oRJGr^1y zOW4k8c=&;iywxDHfL<5ECz%#7AI_&udt-@JTSNc83td6X@lSK`yiKek8!vP>J%%xQt=0Uxcy=Do4%w}>#i`6H0Hh9! znC}eo48_f#Y5Ht5+(=^&hf2!hVsChvlgCDNFG;sVma&opz1*m?GR^^+gvm#Egs~&; z*Smoye71o_hnH_uzJgQfHhY(dOOedbQH|(Pt8Vd}JHZW{E+qV`4`&89=o(pVO~|@` z4nXb7mTF#ve$!xsaF}C1y;`*BDCfYj0>DNk%{|lj1~QF|dNZZ)pBUu~L!d8LJE*gh zR0e*y64CeU^9MycL12_>hUb)>K1N9Hf4t3E9jJ6q79zf??n#5aynj9t*m zGcM1uD#`TH;p$wGT?T4o#?jJ2ES_Gy4t@S0dHbLvXLt4f185rQC80bkCi#QP4e6%n z4a;?#;qx)hgLC+Fuo)p_s7Oi>$ zv1%-Q7z}5MRNl;^?`1zY=LKs;51}IQ(v4StcbfI=cdoH4D>D^YVN(ST9w_)Z`2Npz z2)!wv0`h9kRLh$U!0y0a6&77RX$#2?aeo_mKM)cdHYwef2wcQ3e*_a%2ErAxR&a+_ zr)zz_Nj=Rh1($3&bP}1NK&U1lf@-@G#r~B z6@oY{#67}$WO>P12R#k2@4WZX$1d;;ElxYy*+IE&kf@!F4VI_Pzy=u|qjhrgfq{I? z_y?|imNW66H5qH5hIg6iI{N(hhGs2Z)D~m?z)bX53YZ=V{dNv5wj1eAa9=-)CT|3S zre2YNEMTB{6OBL9J%aZ@-Is|4Y+jT-*k;|UR)^vafTmjnt^ZrJ8vI641A=2rWxT+Y3NPpn+| zrv`?H__$@u`A~%_={s5~=F%(m_a0)stZ^j}K3!$Cd5v=EotgIfZ(c+u<_e|yhLse_ zD+B~bLFQ!!X7Pz~?>3#?i}C9t&GC~7MW(J(y7x^CE}9>oaD;(eG_+f z)K4ql(c70k6+(zj`tP*l9qu>;8_wVhTIW;^1{9Rn~oVEd%`d&JL%EmTeSM zSEapNC8O_E?`0u6rDBuv47n3DUnD!_lI;@o#ZSE)y>Z|jUU(a&m7Hc@kz=p;pw54H z`usOS!^aKE9NvoxMvda*iQHVCK5p$~sh1DR{tpn%jr|aDUDUfUQtn=`qv0frD)!O+ zkYdWOH8jVsR!T;F(-orRZ{P?y$J3@~zJ6v@!1tT)n6I>hA0Tsy&!dCp2@mFbPpo0& zxXt~xkP!off04^3mbrcsAZ1SICwT8(tC`l&H}pl#9eg~cea)_HhFO=Xj1<93*!S8) zG7y~^JfSLABc~#KdDfW4Kp3!KQGXrO|Eptbeh`26+*Cjk@v=H1pa> z?b-45NDDhWjdL(I$YcT5T!;;0=1a#NnvA5J0#59Yy^qTN2`7Ddz^)w29;_2Zg(QdW zL=wv&()h072AVLm9#f4mfpfT(ti1hW~?4AcSnWT_!4lA!;SH?gE_W{1?f&vZ& zlosTImpVDotGgGXg_polO=74=R=%0B_~x#yx6iJiOz#TK=2#oLKw%QpkNue%ENj!4 zMBV(|_P)1HS3_iy$s^$5UL!9(k?EC!cnnjYhW_1u@yJE`Rj_;2?<^g%hlb*&FF>yd zO>Rz8pLof;v94fi&hyqDSItB9=~tI+-gt$4iEk)uYvv8I{xBZeb{BC0E{9p0g!pTC zguPO;+x-z@8tV-(?WM3~EI zJXF|pOqG4b^?ZY-?-5m;EY?U$a2QLaw@Z;RX?o9Mr~!Aphq?o4k+lE@4R8y7xl#fTiaX9VH_3Zp0%_Uh?^s96}KD@_rj4m8>(ffx~!k0Q?pxG;dJGMvLv-J|q{ehv`A!Kz~5 z5_!O_PKN+lA(@^lO%ngQ%|zuN8oNMA?NVKjl0^+Jo3Lb6JF5WI#F{LbFm8B2SE_cy z`jo_K0sM#gv z-y%Uf16LNxxP6{1pm?Zi4&XJ_+$j(K_7A4Xt%cE+53%g`x}F+b})K zQ)$e`B(x=YNl)X&bFJ?ImAhqoX{3BN=vxWqd%-K%MH8L!)y5jocN5~e?w`bDqKv!C z|MLyrnmR6wfY?+O)`LgOwoXmMd*xsz24>X=^+ivd=Be)hypfQl4U1+N_>q7@lGeG# z5b}gAgsF{8-WvJ(&I9es%oI<>T0M@-`undyGyAS>DpK0l-J%z+Jo74uB)uxC1iD+x zBa7?F{M6G>$n#<-uiLiW2!+AD5qt(i^$aM z{=GX;2w$Mr@lyYNh}Yk;3EbE3?5C^RZWlh`DE`rU-&eb}_Upeedj0_|Pu??8NPE}< zYgOv>B>kc6fR*Bpcg6TzWA9NiqMKIJr^ws4o6Z#~yTBI1<=)ag6*LT>Xr`G#S1U8{Fse`u?-dvx>@&m7U1)HOWfSCk36 z7gMntffz+Ox0*bwZnm{^>gnxZZzbp;e8xT}=FQorS zd8!BNfHgQ8+I@uc@~+?9QSrq767h^|btV{HQ^7Vsa~5YR?(N|8M1B(Qiob9avj1h91`>xqddpqS;i9V; z)8fcsaQG9*{db$S+R3>}{4`iKPsBG!U;Cum_z#SF>_SyyLLLYu+%HU8IWM%j!W%AW zfJ0dlF(qq}qCN+ghz~LjH{hZNokfql-ZiJIVpd;Sm0}AIqEuI;P26O5pjNXVdEvj( zr6UV1sBUvCaH{C8|9H`TZ>TU?rZW8f)ylqX^7_Q3kf2feFmO2!VRqF;p$|0DF*G$Z z7icX1p7VSs6No|H{AcO)2&~A*6YF2}HmI6A+6*?y@-H0$X0xs}uh-Xt*8>jG zRBLO04!|l^*SCLUim;NRTJPi!Bl>nLPi@V2pL}p9{zdqzvx2#v7se#Q{^!2Sl#BaB zm5goiyWNyU-um0z-<#IoR@+m-qZ-3$X0~xd2*;dditVgNo?q|k#<3Y z1l@uUG|C9}&_3X|BK0Ei!J$N+{dn+5>?bxcpSeJ@n?&UcI-P0#{H0(+$I|Fxh5bfm zl4(JirKbWk`e-1V2HX4iOaC7kA6#HH6G>hhFHiN(_w`ixr6V-Tc!yK#^MF=E5%C&n z@hIxU6~J9+noh{Onf1B~zZAW~KOaHaSm4&XA1?V^CZ3Yq@`Rax7Q6@fS9e7x>q^s{ ze5Ta|t5)w+NR&uisIjoQzxGco3-%!7!D*8u>}@C}v4W`z7c%mXO%nfZ&*-ojK#L|z zcw6lbvHcm^CrYbL!G%+1#e+_DuEnBg2D1l*8upQ%t_1g4P8(T2U6zOq3uPz84fV9Znc;X(# z&0_*#6Pc=xh)H~T{nHlg)qG!vxJ1p$vpmSui;&EuO~*Xr%Li&dx_vRm$Ua-11!j(J zvkCid1Uj28jG-TcYz?*#9ATbzwM$!&z_s9MEkR&g&FE@nh?f2GWm^Yu|FkQGP(O?Z zC5#ti9PZUMD@n8RDFE5sp?u|om>=`cl7%_C7R}JqUl)dda7}uVcTQd`Se8{PD4oQX~iGEi_W}uEdhs-4`DSRgR4L<(eo-ed<;Ecir3AK*v$2>z%an)nU zYbb`r)Gqv1f_tdUJ3Uu0JhIe8L%5*86Sxc{C+!h8oV#oz3A!Ed(Y{M{U!`(&CK9;h>@C5fGPHEpaCUvVcMvQ-CAC3tnTL~{2J@- zRHU#0c6;yV!sSN&XK$PfU_Q`tAXtG=oGhV=lD5_(9(YM!&;t28Ix8h${F-LUt?S+( zJ~&;;)DFYy;^4pc>&_N&z5nE?$%6C%caQ-!Q%7=CjjL6|huq^S1|Xm7_;Pez zF9ilhluY{~Y)-bSRHOF`J(XYA z0qGC;Du%;X5ubX>VIP0Y3`*_&CHOlEOY#gC@F3BE{=MERIZdn}xGMvDW#=_?9YA35 zWxe7iJWh$eA?_T`Cfntrf)fyQYy&|e!`zhViH$w&&2u+XQH zY8lk)XsFkR{6qi*UO?>-s+#x=S%cpa;hPxQDjmB2nDU=+eL^+!KD5+wXn`$Uys@}b zy(Mtaz49gzFx!;3Jnv5U(rcRYZ0y4C^;&yg2>;XK-~PAb0T-`!w1m3$sOT@w67{$g z!&b6$zH3I$zYS|FifgSx#Aqtkm7h8hyV0-&1`h#k5CpoV0zaS)MMx zcxXPv36-wl>rEH6S54R<4kW+%7L332R4|bE1A+(Es86-dMsyL);iiSl)D;%mlZJo?EPcIq6ff4(4gQ|IAc(m$IyjoJK4s zqtHO@9B)kN!C%v#f3)%jlzS|2=hI~v*(Ao*Ye5`osK$-nh4sE%+DKPmKJ3R%erRX+Weq*_VzA4;e9~UAkGVu zbV7r`uivgyfYg(vEr^Q88&(e2u<#yn>CUdOo`>9aNE8cxM$ceX^KtFBV z2Z}(sXZpdGHBKXG<}N9$3f5}_?OStX7Qx~H?bx%C2UdU^oxVs5C2&XP6HUN2E;KpK zhFx9}u);Ml??#4<>W(Qb9jzi0dNZ%6q+I`*-Fc#!kAFq}fa=nfE%Lc0X(q0+VZX(m zp3g(NXf#ivNk?LNkfDlk-%`!YxGGs&b%z0BMrS(q-cO2CnQ`KS|C ztCMWFl<%Of^*+Ow3*+Owd{sbZ9CQHRcGHU+-&EegPyUc3Yl*Vu=vuf_(0(bF0yc*?s4~rr_v-6EWl2@g5wG*O6SS5FJ&#Z(tJX z=9mTLChYPI?L}Kfy(c6|8U2QB__sgt@KLJ&EKi0u-YnA+{_w0mqi-*|afhNe28naK zk5uL|MNbsz|5pEEyDb)m+OsjDX@`zbD4E$9xdin}(TI0n8H3i9_XN=u3R~=yGmUbV zw8?7=&~lm@Gq1_*zdtwx>B5jC<1K3(Jr{S)Pg&P#3$1zvA+o8$=R8IfDk!)x^ynb{ z-EBr)UtGJCGuwc&BEsw%|O@==_neQjrL&-ut$kh;g#&IYDeav~bYKB9zRsi|qeUl2@TQz0)p6w*K92 z4s&UVn+}(Dw}*e`NM=Dbpj6#Q-uBr86b~9v(N2jP%B=OebQh-nTX}|V$`=m~2txRks)jgjcgqO)ey9J{Bj5Z6&I5uG- z%ht8MaR9MXM{C3=3FD8UxjFKK=9#VC`|~vAgS3Q^qtF^rZk0`{RtdQT&Qpz4m#%@r z1I=Eut@~oC!N~Q)>#lR;-T{y<2#G&6I24g~2#bT2BQiOZUp(5uS%<3A9wg_p%a_qt zr{$$D9A*@JIj+A!@g2p1LW=L>x5RA5ZEROv`+}JVk|&{bPx4WM3LSIpZ#@kzIquDn zq=uV4TIhS?w^}(;T15*+xNNDGoS@#hcI-e%l@3g5j;$~GmWGVplMHw(0|Lk)g)=|? zJ!0&7{nhu;sUhp9W4E*`w3?;fBe%4Psf)#&MXT(Ox^G6S;r0s;xPQ}=Q-0!!I3TLm zq^+eNQ|zwBf9v^AH=f1LCmk#3GP|>4H?1a7Q_bZxFjjF=zKy_GAS$*g$r2JFQ?f_@ zr#NTul9#PPCR38oQY@~MD}~(}(?yW+5CoCGaz?)9M%`dEa2FhA;U-C!M4Y~Wr22gz zr*s^u9u|M|0pso)FlyZDuwLSdwb|TAbD6(RDZXyfyN7|Q)tdBH%J)3WKP-)JoV0#C zF7&znU)+w>+$ZEy6z<}sA0Xgbc~@{%Owk~xZsf7~hZmtDrJd32h>O{Vzzh=eyM`n> zNgcAi%&1sqd62NSs`L6r^Z)b@)v2 zb`3R~RODIuYjgzGoF`G}>yJ^{Bad~FuU9ZJk=@too2OJoTUNUCLcs`Le9J+(UjcVr zt=%7rr5evteTs&+4Bq|s)hS)5mXkH+(`UQ3-VNZcaBv%S9djvv>*5Y_s z>hg0!8$^OppWp6%wWwR)YTE!nthh}cN)wm1y$8c6wVY$}XnIC#I!b^3Yq69eO#k`G zgume)L1fr*MAtqHe!!#fduYh$WDm)Lewu|%?tXyg*cJ2O3EW6?)xGArm(X62ptn5B zi|=wc6CGnhfgxM|y>mpn{U(itcC#tm9+_)clU3370+!*MSQd?xR(ZtGv&UcNs!MX!(k^&o&%)V4+-r{3?>{0 zi2C*`BVzcf@1A-<%n4xLG*}olWGZ}92AiGML}Kh3aD~a3J&rSr9T-fXZ{2W;SA?;p z8*~IRaS6cVUPwcohV1UQ-H4A?Ood-38E1p~pX+;%edHzT7l%LYm)UZP9tc2ZKz!s$ zCf+>SK1$y=6fp;neqQO}S9I#9w%roptsFVvKn_1`eRe!F!wfM2X)J z=4HKo?K32Mo>8(+A0QL7;p|@6VTOiDWmgH-I~i)fJ}A4nR?ve&C*1d1%G-<9^D(pM zIaT$ougWF=+mgPEi`bFZ$ntjW3>7Z_pOHM>ov?yofmPXL=F5u)YX6S&(UmiU46hX3^RHCZ*K z#?;Ji>C*?a)EIQ;;|2a7m@=2Li^cFfcqz=+F~4}pZ*fgOmIfNP67VOs(gWMGw}5m^ zCJbues~S>_mest`F_GnSdVum!h4rz0X>R|*Q&9G+QE|$QAemfIogsiBMN&UwI{tH6 zc;|Ij$XHy%0z!yr5bpebk;#7G#Aq9 z+_(0A5c&rpUVf3T7)52js>LMAuJALu$i$qS5n$g`6 zL!DN@oDN1&%1AN*?{yk=>$wIiGm>LZCR6hHNd|8_tdIl`V zqcM;XcfV%(y%I>TAB!)4?_C6O;DmYx3^Ma(w}@j!M+>VO?LxjKeK!sACnN=Cm6(xp zvQqsQjyFhZpId}3o8qfl!1}HAcCLEqF9DU~OY)_s)6m~=>XqOBf}RjR=^p|8c*ig` zZdXq{Tr1k63oOWEMVz277C!%BK*K31!Ck`CWqHn##292+p^qEH3>9e;mtEzSgp@Lc zp;oI>y%%66*bKQh;lO6Cl@D5}(~?hHFL((G7WjABw1(Y-;)${3gJx!@&$8BjUgATm z#M+yrZ%>=0%o~@v1oL})IPcsNmw3h;UgJ^n{<(AzsrYmP#^XEq;c;;`cMOKK~N} z_ief4WGA{gY=N=??R4L7q+gi`sGdb}1jk|0@$8c-Zn#z;?_` z{=!PPSzxbW=CIG)i%(;8h`mTlQv8^SG*2OX^Wo*?-?>Lx{X+dQ#EvyUY4axBe_f!o5yYY$l-~LYmbOF}h(~j^ z=|60^D5cw{;g4m^Tj`HSvT!G%s;xT{UDT`9Yx%KPLqzi~hxQMwf9}8_`^}4tLMoFl zx!QMH z{95jw`g@1e+wdgI%Pcd)vWZ^;F~XFcCtA@mo8-Adv32CLFf?Vg-%m4bW@pvq%~q z`3}z`ad+Q7C4gm9no|THWR)-xj%5t31fPi1gOy&5dTq+k{z67GcP+cmzOCv7yaTDX zk?P~k6Vbf&;8QnR>?f@TA*DBK0^r{nw_e~q%r+8+e-eiOT#EGLMV|RNkb`srF%(Cc zDWBULM3ZyLIDazL>tHZ14vB)wl}PjNB<}fpgnLGZewl?WPkPjdz4P-#D5k;q^``TW z8@1^FhG8F=Pd)%%rhFRR#}kZ6q!YB#a*iNFc1FQ|hEiEsTpV$qllt5!6b9(?4Pjgfy%$dHrIH|{PMA!|&NoKga2@E>cA?xpurlwD=?P%a%Xo3pe{aO>$|QQH+>YZ3nu(k+)pjOO!@IM7Sz_qN%xHLAz# zXY%~FhsMmPQ@bSM_E2i-^R>VJg}#Yy#&v$ZELl7_I#0qs>^I9N>Fz6m5#*^1vF_|3 zd1O(;v=95HM*5BLnW zQA0Crq-zeuRy!Xs^8wC{X{0r;J|k6gc=q^t_C}n5;V=}E_lYpkL!z}!2eDh9t)97I zBjdUO7a)|pjiMQ5w3+V&uuE2`{0-?VW3ob18-;6i#to__8}19Ln(E$^vIl8}^lmZr zDIFl-gva43{wR1YWiENRqxW5wj~iI4h4}G{y05IJ`^>JyT1nm7Q<`J${pm5GA2vg> z=L_cac*-&_w}joUKtX#aP!CBBx{6Vnjrj@Hr6tz^Cm+_iN;Yx@m4HNr+B+{%xf5+_ zR^P#r^WH`;>PKc;1Csuq;aHsI z12;g4W?ibV+3T(rJ$$E~w@7Q#g{#{Z2ATkGvDK0lo$z!dN~)Pbet&>!@jP)!Aot*> zinVEt5GZebDo2NFbD;kxBQu94!@z{GfZ-Fmnn!)&|B!$8;0ACuz~tpFm+qnxFmAHJMqq$8q3ftYCDRP6KXTWLW9i*wDA4P&r%$gjfczM_qeA7tS72t`M7 za=a~0$oM<(V_+oHKyaaxTOS0leVw~2U+^!%wu)u8106*`v;9=gkG#f|rH$M{SxlLl zz(lj4R&Z{x_`8O=|!8Ayh0b+w9 z%KPiD=rf{CA%r80GXF@^z6YSOyr`y(>3_sk-gW0?GhzHdqUX#N?!iwI^!NaZ_uTRh z!WxB{!z-tn@ths>%@Kt5r$E%!Twax1-#4A-$sMD`;o4{I5+8IeSRg0Pzf(W4 z31V^<;}lGzxInu076z_qM_OVSTu7ihn+cAb#vqfs{c9p8rSiZ>GgGv*%&`;;0GGlh>B(e!KE)`_&^s6{%R@)1Rq?yW=kO6uva~G}z?%b_#{a4tN-lorLV# zR>C+WJbcV#_42dFpm(oCrHn&VCM$^VkG81%6e6u_PUj9dk*GqvENM!#5#vR;jQQ(t z(AOSnaY2`dgz58l8noEb{(A=)H5*mkf9wPDWUxGfdY7I*Jk@O@Vf+@9B;V%3bx&T> zu!a&L;Dk*m{m2z@a;>K(w*HV$T78c_YQ`zv%nxOl$r zc)^vr0XALY%a@NMImM$(U9k-}-}u|lE|nfx3lHX1i$q7}EK1fO*Xs^e@2lq=9H4Fs zVjTxATzd@`0;WiFmi?puh}04NkYXnD>iOY{@j;v-o9q--Yg(Y-ekY_&2xl^J`tu8t z`*Mg~?%~+>bs=N*o2<9_4YQ>-_qmz35t-9QNJ~E4!s3yFN0gvHGdjDw zRO-W~n_FL)kdvD>abAx=s!j(Ojuj?HPkWW6Eqi+hnp<>TWz;|JyCiJ%Z^3=y#l-$d zIVk`cSkJAoebpV4@dkY5BF$y-R!_+6DH({%$j^^zK7FKzB0eU{aPfR3PEn9Wm}q}r zJIH$%F#;epuz9{RMn^a!{}H$+X-F>at!xjynp<$cuh}b_zxOxNvo|mW3biKXgF;4- zc^g7B-{Dz3HMCHO<@v;P#{{r~;qe7lQ{2RD-$pR)_22P{ii<9U$pY)G*yjOl(!ITL z%r8>YahTT^NBM;Ifw7|*+GQUthm?}3@(Z44!ZrSh{MXzsXCHQdY$p2cc1+<$gTkn*2rzi9$k!{%^1m|r7A zxriFE+{r8cz%3myhJLF_`#U}TSA9{_!Z8lf=J3&qi+hh5JT6+L2^LH3`WC!L>7Cn{ zP-U@WKRVqjE6mKJR*oypY=b%Xt^vylCJ|*`(4@kA4oT1z*qv7kyo7bsrnf^hVMSqq zE7b{8=69?8$GGs$WT#TZ%~h_N8PlpF%A7ZJVjwW17Gw^&Bh{50ICUvn5Dx@-jxC~J z$;*@H!1A2gPuSPKYOzsoZN_g7hEUqonWlX!ePy!q^&=Th7;q+^pn@e2Nm072PY*X z`zNh58?yNSSUT&tDBiaV6VixuNGsh)N{6&`cMB5I-CY6-NV;_Q(n>c-NV7;vH%N!z z`|S7k{>w*UXLfhyo^zjb9SR8#ov68N{BU^vdBG_{U#Sa8g_`yGt{w3#1bp@;JvLC1 zjRcxrj_Hk5lK5RS!!w7wJ^``Zgyt;NG+~?(lvx2C5#ZbHr4_zWihRskpQBhks3HG- zaV!G}`=*Th4lo7Wm;Av1ZpBCcW$8bj@_4)HNF!rj^|nh@^C|Cur|vOwrci0#8}k6~ zNWNh^Jk(Lxx=D8P4k$s%+m;$lfn1*k-+}UN(7WR}1LuKb5HSjma=w+botuUY#+PW42x? zx_~P;IBl2be144T=HtRqtp%v55R!LKuzd_?vRF5EYR#3tu&MG))sK znGO-I1ECqd+ZH&SZy|~CG5N}R)dm}rg+mwYhB`9=^MIVvB5<5ls(k=qBXToTm)<1a z5oYQh=dw(Qg-L78bIxZ z$?+1@*a{VAN_*JioVv>-^F;gnRPBm1)!|0@-7j-SL9OW-VKmU8z2Ik~m(K$|? zrB-n*z2hR>g6AYP{bp4Y*sdSpggmo|{w^dB9dzbQYkWQwo+MH6m|IY4e1QF-*Pfef zTkU8q25a^$ThucyP;#Sl5kp2B9T*fDbh{@@==Lr}qREizakRxDf!MI32ENrHBR7OiKt9os&Al%9b zH%oV0l&mOp(OCp-PDRb@j~Imp(!yUQiwwpO7rzhAC~EP#@u;dcc&DEaA>pJh2IeWD ze+JIXRn!R8coWTykz~*u;Zq@3U$-X_HhEjJt2kEBmtUygcHusbuaRFe4hCFPC)bT9 zNX<10o3EQKBV9Lo2^33hM>4&tQ4GFevU^TGk!U}M>(qbHLuA(N9I7tTqrH?wX)Fi_ z)0_GjO=;gTHlEY@LW#O$buFA($@^nJedkLZ44D1ng+zo>;2%-bLeNS4`f$u_=KM>c z*I5vl$I?lv;$BAfO1?BmzG)n#p)=Tv&g#@F?$GB|-;3u*{aY}BK<3-|;CKa^{Z#0i zv;}`USA~#$c>B9Ce));k<2~J@3MuSeh{Uof4qEfG32KLg{qA3PAgkx&6&!DN zIQez{9lb7AW&a>>Yu=;3e_M@8M13j}M50}|V`9s6+6eg)4%=%;Z`@YU`9x*woX4aN z(>$@N>VWsJ*w!WXw=#2Q)%@DXf1~qU#8IGK56)W6Wi#jRl=?Bl=VsjWVsE-}pd#dxqD1(yeyI*Nf+NHu>xwdhpgqlw|}k>{PxlB)zp?qyUV=oDa`N)*Ssb}dF29j-4iCLLXBTn(_}on@9Pax&n`d}I9Z!s zHXQ=_j~12Wg}9=Dle`SDII4qA_Pw0@lt9})K@!|3X&yyy9Hu` zZCrexSpquyg$m8V^EAbp=M^b_&3?=0Hr$5_)Y*5+dgmsW7& z0rBE$$xE|6HyQL7os|(AUguR{29GOY^XwatI&~;QhOOaH#p{eI@81|>BP%hoQA@~$ zt`HV}ux>tglLxFNj~DGx`GJqHmZR5RVOld3p3MRD@H&?~iA=6zKY{)-)WQK~Xib?L z*$lh}ysZadDBpg+{c_iEM`QLZO8e%&XkI2R0UolI^j=^j!K0=Q2hC_)LaGJaoC2+O>>4tlz zRHWIiH->h6eg)Ko7Rl_o(4A~!p2>aDrv^(g%avA)fh5w?;%u3$dhnFei%ar8u={X<+^0OZD&k3Ajn`}s zB6+h~cT8K020Mw$oUYTYu81ClM}q=%*c!fOr&aIzC_@*z<5>EM1!F6jx1Hb#n26br znC+GqvI;Z2t)a=9cI-E$N|>(StxXu&h@+J6?-3I9^4E9_9KD_ns|%ZLpeE-E4(DH$ zn#skae`gJQ*!3#fbx9ZMc9l`17y_^sym$qr$S1*h`V?CrB< zhpz`ElCY}kXuGj#d!!I3DRu6r`-R*27mQ=4zhSJ>mGKTqW@q%mO$9wA_#4kW$FQ~k zZcnmQt7j!quV(9M~S zTP_}_PuNmmK#8J%On%Lq-WoS#YfoABrb(I7_KxwhN7Uxllh+| z>#BO#fqNk8UrAnca{&>adJ|uq$Pu8%eE59N=-IMw2(g=2SJGfl?uByQ`m41u3R`>c2u z%HI|Ma$j+nETT1fZ`OJ0yLv<~jMhqKQ*9j!wXEU5#K%I3GtVu}<`af9mC*d~2bEPI z%dv{q3`A7h%|G-Sq*GbVc}xei4#SEor03bgy9k@Vtd6Sq;~S0I7vj2q7n+RGnkuxq z_r2J)|DKl4`0)IQ|825y_bb{yJAdi&Y||soCL{6z%efE{T3HPn(6Sj^Q$Rd{_cV*2 zqsCYN!{RwwixK5tc{+57EkwH+551Rt!5_vrJs(b97NTTJ+^U$H$G1>myRoMHF20~L z{&J5DUfzA1|IN-kp3p4GTQ1ZJeEl3PZp`RoT;QKJEL(HGzLS%toP}0)tRsCmreaNf zF0iH>?b8I?*?QVAW+#3ijQ+9x%{W-%(a!>1R-87(UD(BA2KP1YipS+E7IHPi0#gb& zs8(FLkCj$)-(UVu-aM6>Mqg6*JwdJd!p_z#J3)_Y>Pt@3`PeOT_NfQDO;ZM|e=q=E zNPop2vll($5#d+qSF8T*5)@zK5K(jnCA_PGB!xb_Rou8kTz`Jvp99K%aJHmsbSOgf zv4eU{Brww*{Rfija5WhL;~<$!N@Yf{SkT;8)5L%0_&=$+R_~;mVhBNI=L`$CDd;I7 zjZlUzFtf-40*7F6g8H0=L(d0pv)2t23$jB__!cYK0VXCGf#Gjj_dQEZ^`(Yob9bZ< z6`~4n~h!rKXiUVu-xwA9;jv(qyD4;;4}O8{f{qc^&Dbe&Lwljb!K8}6n$Bf zRv@<5i~AwQ=_nQuzNUKDO(~Ux*qi%16_9mt^&Ngg8W5m_VwEej@~$X)qZtuc$)lv$|*BK0NpOz|!!ef$K(np1vI%nw8M%cs zE@But`EzaAZbZwIbk#-yk7yN4&yWEYG5!`Y{)EhBT5P`*jdyhf!VraeGE1x{46VAB zM2ZpClZxfw?H$LaHoT3M6fDgtP{!7d6AH2?WDEd}%a)_O@*Tou2n_*zw3D(nj9HM>=c{Rhg z4_jkVeE+ZIH_m=#+&B1ru|VUKM%iKX*J0q<$6>Io>;GX#PNf7?E*jhNNUH6LM){@k z&BM12mHeEOk~ig+x8rs<$==XhF%DMj=eY{rqpEkF;LEl*&N3_(w2$!?M=HG5(1r_P zS`iH2!CqgZTjbQ`*?>yzLm?`CA$!OZD`&7<}McaW<=Gz zHcETxCe`PwzDnt-)KNzK*Uyc;JG18w3xM$U+Mzt@R`O2KNV0M3l8wLWb?^`FdY_W% zjd%{c{glg4_l(+fPiWDY217K z4YxDQ*kc9SjzCVN^$8OP@8(vDp#!3PT$OoQI?Sw}Jme(uZ?Q!#azTJPd-wjI?cMw_ zBpawWb$XmHvkDSSBJ&45JYpPA6@z4ey|NUcQ>#*#dT!1bL$d#;XYS2X_rR?WzEUhJ z`%0h{R2^lR(!*Woz*cqI=-S!=;4%U?T-YR42*2CE%?w!(;=Ml>u$Pz;a2_)C_!>Kt!>kFgy z6U77s@-GREQrMbuoK4V-_6Y?TovL*a7&W<1(VMmY#acUjk@eS|wTMSJTD5`(lH@e^ zdk&bfX6RZ@tS)>!v}n5pnsZ0QyK`DF>%7U;*FO>np%86?{YR;$XF;c}z1LAJRc^1= zXW7aFk3T2tiz_}ZwGz!zU0%G;1bqblmrx$@xs&C>{<;m=rle`d*2t~T4<0~h()3iJ zF~HJ~ARm8$Et7n?xz4`6_~ljW&A4u)7{?6(k=qDyiMiv8KL${qKNUbT_WDCKGI$I- z?V0gHo5D2o2HQwrF3J64*jvm|*xyimSZF`zOMLsKLlz#sJXy5x`b1>P|8Hn_e9FpS z*eQ<4tT*hrIHj?PuxGT9FWG4>;k$FqZqQQrv+cp%J&(V&fXU9&)!Eb9%dY*~2DvVcC<)dG2yS&f4b$T#1umWezYj?L?}MSCFK@6VAS zMJkZhj;#w(5Q$2K%g(-RdxmSJs#^yUNW;dF^vB=QphlEyYrsWeKjY28%lC404v*zB zwX*|MI9WI#{2Z8yr~f+)$dQQkBIDuV;xdMcL(5Js%n``f%07*}m z=!VEE$Uj&@;o}P|&)}yg8!DW0h~!nWXnCN!fpo6+J>ub$YdO(j3vl_O;OgvjL?1lU z4p8c(UHn5MC;TQGm!pKG80SG;oraRj5CL>vbUggfd(vA_GlR?hAA2-fm0yY>j+k?G z6b9vBfXmMYfFuHNa)*-=L9D!+HCKL@$q!(tzN;{9gzBCBKGJqA7}xN3J%NAu3IZgO zmx9+Y&7{fQkX%D29IgqOiQv8`3#ecbkf08>J81*#yX$TMK}U@>casXxZ%^EtmI*x} zRRKvtv*B;hBu_R`h2$NhuD*AyF` zSu`N@st3yN#Q9Xqu=UTz+U;XZ!go�{&pP1KSYX%8~h{t%2_d!sUxh=s0=CUZw*c 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 z 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.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�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

`pqr49! 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

Jalmy<4ap2N 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 yfmouo&-i5Pw>m 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%0DJaXITxm6u=3BWz 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 B+Zg}= literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/data/analysis/YiiP_lipids.xtc b/testsuite/MDAnalysisTests/data/analysis/YiiP_lipids.xtc new file mode 100644 index 0000000000000000000000000000000000000000..60673398ffa4808b34dbf200de93529b21001650 GIT binary patch literal 822240 zcmV(*K;FLq00+we0IApj000000000%B#lJ?000000002Mq>Vd44uOOK0000000000 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
ModkR6t+hW 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

!k>#0D&smSup$xQAVwdHmMFUZ)yA01ywcR`L;cB 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 Date: Fri, 11 May 2018 16:02:11 -0700 Subject: [PATCH 064/455] rename functions and moved into rdf module - change the name of function cdf_s to avoid use the same name for the function and its output - change name of function rdf_s - change name of cdf_s - move InterRDF_s into the rdf module - add docs to explain difference InterRDF and InterRDF_s - CHANGELOG and AUTHORS updated --- package/AUTHORS | 3 + package/CHANGELOG | 5 +- package/MDAnalysis/analysis/rdf.py | 182 +++++++++++++++++- package/MDAnalysis/analysis/rdf_s.py | 166 ---------------- .../MDAnalysisTests/analysis/test_rdf_s.py | 28 +-- 5 files changed, 203 insertions(+), 181 deletions(-) delete mode 100644 package/MDAnalysis/analysis/rdf_s.py diff --git a/package/AUTHORS b/package/AUTHORS index 0a05e9c163a..4870f02ac30 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -102,6 +102,8 @@ Chronological list of authors - Johannes Zeman - Ayush Suhane - Davide Cruz + - Shujie Fan + External code ------------- @@ -150,3 +152,4 @@ Logo The MDAnalysis 'Atom' logo was designed by Christian Beckstein; it is Copyright (c) 2011 Christian Beckstein and made available under a Creative Commons Attribution-NoDerivs 3.0 Unported License. + diff --git a/package/CHANGELOG b/package/CHANGELOG index cacb2816272..b04e990ec39 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,7 +13,8 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj +??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, + VOD555 * 0.18.1 @@ -21,6 +22,8 @@ Enhancements * Added various duecredit stubs * Import time reduced by a factor two (PR #1881) * added compound kwarg to center, centroid, center_of_geometry, center_of_mass (PR #1903) + * Added rdf.InterRDF_s to calculate site-specific pair distribution + functions (PR #1815) Fixes * Fixed order of indices in Angle/Dihedral/Improper repr diff --git a/package/MDAnalysis/analysis/rdf.py b/package/MDAnalysis/analysis/rdf.py index e69565db673..76d7cf78d78 100644 --- a/package/MDAnalysis/analysis/rdf.py +++ b/package/MDAnalysis/analysis/rdf.py @@ -24,8 +24,27 @@ Radial Distribution Functions --- :mod:`MDAnalysis.analysis.rdf` ================================================================ -Tools for calculating pair distribution functions ("radial -distribution functions" or "RDF"). +This module contains two classes to calculate pair distribution functions + ("radial distribution functions" or "RDF"). + +:class:`InterRDF` is a tool to calculate average radial distribution functions +between two groups of atoms. Suppose we have two atom group A and B. A contains +atom A1, A2, and B contains B1, B2. Give A and B to class:`InterRDF`, the output +will be the average of RDFs bewteen A1 and B1, A1 and B2, A2 and B1, A2 and B2. + +:class:`InterRDF_s` is a tool to calculate site-specific radial distribution +functions. Give the same A and B to class:`InterRDF_s`, the output will be +a list of RDFs between A1 and B1, A1 and B2, A2 and B1, A2 and B2, which are the +site-specific radial distribution functions. + + +Classes: +------- + +.. autoclass:: InterRDF +.. autoclass:: InterRDF_s + +------- .. Not Implemented yet: .. - Structure factor? @@ -38,6 +57,7 @@ from ..lib.util import blocks_of from ..lib import distances from .base import AnalysisBase +from six.moves import zip, range class InterRDF(AnalysisBase): @@ -161,3 +181,161 @@ def _conclude(self): rdf = self.count / (density * vol * self.n_frames) self.rdf = rdf + + + +""" +Site-specific Radial Distribution Functions --- :mod:`MDAnalysis.analysis.rdf_s` +================================================================ + +Tools for calculating site-specific pair distribution functions ("radial +distribution functions" or "RDF"). + +""" + +class InterRDF_s(AnalysisBase): + """Site-specific intermolecular pair distribution function + + Arguments + --------- + u : Universe + A Universe contains atoms in ags + ags : list + A list of pairs of AtomGroups + nbins : int (optional) + Number of bins in the histogram [75] + range : tuple or list (optional) + The size of the RDF [0.0, 15.0] + start : int (optional) + The frame to start at (default is first) + stop : int (optional) + The frame to end at (default is last) + step : int (optional) + The step size through the trajectory in frames (default is + every frame) + + Example + ------- + First create the :class:`InterRDF_s` object, by supplying one Universe + and one list of pairs of AtomGroups then use the :meth:`run` method :: + + from MDAnalysisTests.datafiles import GRO_MEMPROT, XTC_MEMPROT + u = mda.Universe(GRO_MEMPROT, XTC_MEMPROT) + + s1 = u.select_atoms('name ZND and resid 289') + s2 = u.select_atoms('(name OD1 or name OD2) and resid 51 and sphzone 5.0 (resid 289)') + s3 = u.select_atoms('name ZND and (resid 291 or resid 292)') + s4 = u.select_atoms('(name OD1 or name OD2) and sphzone 5.0 (resid 291)') + ags = [[s1, s2], [s3, s4]] + + rdf = InterRDF_s(u, ags) + rdf.run() + + Results are available through the :attr:`bins` and :attr:`rdf` + attributes:: + + plt.plot(rdf.bins, rdf.rdf[0][0][0]) + + (Which plots the rdf between the first atom in s1 and the first atom in s2) + + To generate cdf, use the 'cdf' method + + cdf = rdf.get_cdf() + + Results are available through the :attr:'cdf' attributes:: + + plt.plot(rdf.bins, rdf.cdf[0][0][0]) + + (Which plots the cdf between the first atom in s1 and the first atom in s2) + + .. versionadded:: 0.19.0 + + """ + def __init__(self, u, ags, + nbins=75, range=(0.0, 15.0), density=True, **kwargs): + super(InterRDF_s, self).__init__(u.universe.trajectory, **kwargs) + + # List of pairs of AtomGroups + self.ags = ags + + self.u = u + self._density = density + + self.rdf_settings = {'bins': nbins, + 'range': range} + + def _prepare(self): + # Empty list to store the RDF + count_list = [] + count, edges = np.histogram([-1], **self.rdf_settings) + count_list = [np.zeros((ag1.n_atoms, ag2.n_atoms, len(count)), dtype=np.float64) + for ag1, ag2 in self.ags] + + self.count = count_list + self.edges = edges + self.bins = 0.5 * (edges[:-1] + edges[1:]) + + # Need to know average volume + self.volume = 0.0 + + + def _single_frame(self): + for i, (ag1, ag2) in enumerate(self.ags): + result=distances.distance_array(ag1.positions, ag2.positions, + box=self.u.dimensions) + for j in range(ag1.n_atoms): + for k in range(ag2.n_atoms): + count = np.histogram(result[j, k], **self.rdf_settings)[0] + self.count[i][j, k, :] += count + + self.volume += self._ts.volume + + + def _conclude(self): + # Volume in each radial shell + vol = np.power(self.edges[1:], 3) - np.power(self.edges[:-1], 3) + vol *= 4/3.0 * np.pi + + # Empty lists to restore indices, RDF + indices = [] + rdf = [] + + for i, (ag1, ag2) in enumerate(self.ags): + # Number of each selection + nA = len(ag1) + nB = len(ag2) + N = nA * nB + indices.append([ag1.indices, ag2.indices]) + + # Average number density + box_vol = self.volume / self.n_frames + density = N / box_vol + + if self._density: + rdf.append(self.count[i] / (density * vol * self.n_frames)) + else: + rdf.append(self.count[i] / (vol * self.n_frames)) + + self.rdf = rdf + self.indices = indices + + def get_cdf(self): + """Calculate the cumulative distribution functions (CDF) for all sites. + + Returns + ------- + cdf : list + list of arrays with the same structure as :attr:`rdf` + """ + # Calculate cumulative distribution function + # Empty list to restore CDF + cdf = [] + + for count in self.count: + cdf.append(np.cumsum(count, axis=2) / self.n_frames) + + # Results stored in self.cdf + # self.cdf is a list of cdf between pairs of AtomGroups in ags + self.cdf = cdf + + return cdf diff --git a/package/MDAnalysis/analysis/rdf_s.py b/package/MDAnalysis/analysis/rdf_s.py deleted file mode 100644 index cb823a84b7c..00000000000 --- a/package/MDAnalysis/analysis/rdf_s.py +++ /dev/null @@ -1,166 +0,0 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 -# -# MDAnalysis --- https://www.mdanalysis.org -# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors -# (see the file AUTHORS for the full list of names) -# -# Released under the GNU Public Licence, v2 or any higher version -# -# Please cite your use of MDAnalysis in published work: -# -# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, -# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. -# MDAnalysis: A Python package for the rapid analysis of molecular dynamics -# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th -# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. -# -# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. -# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. -# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 -# - -""" -Radial Distribution Functions --- :mod:`MDAnalysis.analysis.rdf` -================================================================ - -Tools for calculating pair distribution functions ("radial -distribution functions" or "RDF"). - -.. Not Implemented yet: -.. - Structure factor? -.. - Coordination number - -""" -from __future__ import division, absolute_import -import numpy as np - -from ..lib.util import blocks_of -from ..lib import distances -from .base import AnalysisBase -from six.moves import zip, range - - -class InterRDF_s(AnalysisBase): - """Intermolecular pair distribution function - - InterRDF_s(u, g1, g2, nbins=75, range=(0.0, 15.0)) - - Arguments - --------- - u : Universe - A Universe contains atoms in ags - ags : list - A list AtomGroup pairs - nbins : int (optional) - Number of bins in the histogram [75] - range : tuple or list (optional) - The size of the RDF [0.0, 15.0] - start : int (optional) - The frame to start at (default is first) - stop : int (optional) - The frame to end at (default is last) - step : int (optional) - The step size through the trajectory in frames (default is - every frame) - - Example - ------- - First create the :class:`InterRDF_s` object, by supplying one Universe - and two AtomGroup selection lists then use the :meth:`run` method :: - - rdf = InterRDF_s(u, ags) - rdf.run() - - Results are available through the :attr:`bins` and :attr:`rdf_s` - attributes:: - - plt.plot(rdf.bins, rdf.rdf_s[0]) - - To generate cdf, use the 'cdf_s' mehthod - - rdf.cdf_s() - - Results are available through the :attr:'cdf_s' attributes:: - - plt.plot(rdf.bins, rdf.cdf_s[0]) - - .. versionadded:: 0.18.0 - - """ - def __init__(self, u, ags, - nbins=75, range=(0.0, 15.0), density=True, **kwargs): - super(InterRDF_s, self).__init__(u.universe.trajectory, **kwargs) - - # List of AtomGroups - self.ags = ags - - self.u = u - self._density = density - - self.rdf_settings = {'bins': nbins, - 'range': range} - - def _prepare(self): - # Empty list to store the RDF - count_list = [] - count, edges = np.histogram([-1], **self.rdf_settings) - count_list = [np.zeros((ag1.n_atoms, ag2.n_atoms, len(count)), dtype=np.float64) - for ag1, ag2 in self.ags] - - self.count = count_list - self.edges = edges - self.bins = 0.5 * (edges[:-1] + edges[1:]) - - # Need to know average volume - self.volume = 0.0 - - - def _single_frame(self): - for i, (ag1, ag2) in enumerate(self.ags): - result=distances.distance_array(ag1.positions, ag2.positions, - box=self.u.dimensions) - for j in range(ag1.n_atoms): - for k in range(ag2.n_atoms): - count = np.histogram(result[j, k], **self.rdf_settings)[0] - self.count[i][j, k, :] += count - - self.volume += self._ts.volume - - - def _conclude(self): - # Volume in each radial shell - vol = np.power(self.edges[1:], 3) - np.power(self.edges[:-1], 3) - vol *= 4/3.0 * np.pi - - # Empty lists to restore indices, RDF - indices = [] - rdf_s = [] - - for i, (ag1, ag2) in enumerate(self.ags): - # Number of each selection - nA = len(ag1) - nB = len(ag2) - N = nA * nB - indices.append([ag1.indices, ag2.indices]) - - # Average number density - box_vol = self.volume / self.n_frames - density = N / box_vol - - if self._density: - rdf_s.append(self.count[i] / (density * vol * self.n_frames)) - else: - rdf_s.append(self.count[i] / (vol * self.n_frames)) - - self.rdf_s = rdf_s - self.indices = indices - - def cdf_s(self): - # Empty list to restore CDF - cdf_s = [] - - for count in self.count: - cdf_s.append(np.cumsum(count, axis=2) / self.n_frames) - - self.cdf_s = cdf_s diff --git a/testsuite/MDAnalysisTests/analysis/test_rdf_s.py b/testsuite/MDAnalysisTests/analysis/test_rdf_s.py index 053d6d26b36..0e038270cf8 100644 --- a/testsuite/MDAnalysisTests/analysis/test_rdf_s.py +++ b/testsuite/MDAnalysisTests/analysis/test_rdf_s.py @@ -2,7 +2,7 @@ # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 # # MDAnalysis --- https://www.mdanalysis.org -# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# Copyright (c) 2006-2018 The MDAnalysis Development Team and contributors # (see the file AUTHORS for the full list of names) # # Released under the GNU Public Licence, v2 or any higher version @@ -27,7 +27,7 @@ from numpy.testing import assert_almost_equal import MDAnalysis as mda -from MDAnalysis.analysis.rdf_s import InterRDF_s +from MDAnalysis.analysis.rdf import InterRDF_s from MDAnalysisTests.datafiles import GRO_MEMPROT, XTC_MEMPROT @@ -43,24 +43,24 @@ def sels(u): s2 = u.select_atoms('(name OD1 or name OD2) and resid 51 and sphzone 5.0 (resid 289)') s3 = u.select_atoms('name ZND and (resid 291 or resid 292)') s4 = u.select_atoms('(name OD1 or name OD2) and sphzone 5.0 (resid 291)') - ag = [[s1, s2], [s3, s4]] - return ag + ags = [[s1, s2], [s3, s4]] + return ags @pytest.fixture(scope='module') def rdf(u,sels): return InterRDF_s(u, sels).run() def test_nbins(u): - ag = sels(u) - rdf = InterRDF_s(u, ag, nbins=412).run() + ags = sels(u) + rdf = InterRDF_s(u, ags, nbins=412).run() assert len(rdf.bins) == 412 def test_range(u): - ag = sels(u) + ags = sels(u) rmin, rmax = 1.0, 13.0 - rdf = InterRDF_s(u, ag, range=(rmin, rmax)).run() + rdf = InterRDF_s(u, ags, range=(rmin, rmax)).run() assert rdf.edges[0] == rmin assert rdf.edges[-1] == rmax @@ -69,7 +69,11 @@ def test_range(u): def test_count_size(rdf): # ZND vs OD1 & OD2 # should see 2 elements in rdf.count - # + # 1 element in rdf.count[0] + # 2 elements in rdf.count[0][0] + # 2 elements in rdf.count[1] + # 2 elements in rdf.count[1][0] + # 2 elements in rdf.count[1][1] assert len(rdf.count) == 2 assert len(rdf.count[0]) == 1 assert len(rdf.count[0][0]) == 2 @@ -91,8 +95,8 @@ def test_double_run(rdf): assert len(rdf.count[1][1][0][rdf.count[1][1][0] == 3]) == 1 def test_cdf(rdf): - rdf.cdf_s() - assert rdf.cdf_s[0][0][0][-1] == rdf.count[0][0][0].sum()/rdf.n_frames + rdf.get_cdf() + assert rdf.cdf[0][0][0][-1] == rdf.count[0][0][0].sum()/rdf.n_frames @pytest.mark.parametrize("density, value", [ @@ -101,4 +105,4 @@ def test_cdf(rdf): def test_density(u, sels, density, value): rdf = InterRDF_s(u, sels, density=density).run() - assert_almost_equal(max(rdf.rdf_s[0][0][0]), value) + assert_almost_equal(max(rdf.rdf[0][0][0]), value) From a88b57616b4780cb9df9d1d8aa14cb721bc72ff9 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Thu, 24 May 2018 04:08:26 -0700 Subject: [PATCH 065/455] improved docs and fixed linter complaints for RDF --- package/MDAnalysis/analysis/rdf.py | 123 +++++++++++++----- .../documentation_pages/analysis/rdf.rst | 2 +- .../MDAnalysisTests/analysis/test_rdf_s.py | 9 +- 3 files changed, 93 insertions(+), 41 deletions(-) diff --git a/package/MDAnalysis/analysis/rdf.py b/package/MDAnalysis/analysis/rdf.py index 76d7cf78d78..23d7cf667b3 100644 --- a/package/MDAnalysis/analysis/rdf.py +++ b/package/MDAnalysis/analysis/rdf.py @@ -20,31 +20,84 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -""" -Radial Distribution Functions --- :mod:`MDAnalysis.analysis.rdf` +r"""Radial Distribution Functions --- :mod:`MDAnalysis.analysis.rdf` ================================================================ -This module contains two classes to calculate pair distribution functions - ("radial distribution functions" or "RDF"). +This module contains two classes to calculate radial +`pair distribution functions`_ (`radial distribution functions`_ or "RDF"). +The RDF :math:`g_{ab}(r)` between types of particles :math:`a` and :math:`b` is -:class:`InterRDF` is a tool to calculate average radial distribution functions -between two groups of atoms. Suppose we have two atom group A and B. A contains -atom A1, A2, and B contains B1, B2. Give A and B to class:`InterRDF`, the output -will be the average of RDFs bewteen A1 and B1, A1 and B2, A2 and B1, A2 and B2. +.. math:: + + g_{ab}(r) = (N_{a} N_{b})^{-1} \sum_{i=1}^{N_a} \sum_{j=1}^{N_b} + \langle \delta(|\mathbf{r}_i - \mathbf{r}_j| - r) \rangle + +which is normalized so that the RDF becomes 1 for large separations in a +homogenous system. The RDF effectively counts the average number of :math:`b` +neighbours in a shell at distance :math:`r` around a :math:`a` particle and +represents it as a density. + +The radial cumulative distribution function is + +.. math:: + + G_{ab}(r) = \int_0^r \!\!dr' 4\pi r'^2 g_{ab}(r') + +and the average number of :math:`b` particles within radius :math:`r` -:class:`InterRDF_s` is a tool to calculate site-specific radial distribution -functions. Give the same A and B to class:`InterRDF_s`, the output will be -a list of RDFs between A1 and B1, A1 and B2, A2 and B1, A2 and B2, which are the -site-specific radial distribution functions. +.. math:: + N_{ab}(r) = \rho G_{ab}(r) -Classes: -------- +(with the appropriate density :math:`\rho`). The latter function can be used to +compute, for instance, coordination numbers such as the number of neighbors in +the first solvation shell :math:`N(r_1)` where :math:`r_1` is the position of +the first minimum in :math:`g(r)`. + + +.. _`pair distribution functions`: + https://en.wikipedia.org/wiki/Pair_distribution_function +.. _`radial distribution functions`: + https://en.wikipedia.org/wiki/Radial_distribution_function + + +Average radial distribution function +------------------------------------ + +:class:`InterRDF` is a tool to calculate average radial distribution functions +between two groups of atoms. Suppose we have two AtomGroups ``A`` and +``B``. ``A`` contains atom ``A1``, ``A2``, and ``B`` contains ``B1``, +``B2``. Give ``A`` and ``B`` to class:`InterRDF`, the output will be the +average of RDFs between ``A1`` and ``B1``, ``A1`` and ``B2``, ``A2`` and +``B1``, ``A2`` and ``B2``. A typical application is to calculate the RDF of +solvent with itself or with another solute. .. autoclass:: InterRDF + :members: + :inherited-members: + + +Site-specific radial distribution function +------------------------------------------ + +:class:`InterRDF_s` calculates site-specific radial distribution +functions. Instead of two groups of atoms it takes as input a list of pairs of +AtomGroup, ``[[A, B], [C, D], ...]``. Give the same ``A`` and ``B`` to +:class:`InterRDF_s`, the output will be a list of RDFs between ``A1`` and +``B1``, ``A1`` and ``B2``, ``A2`` and ``B1``, ``A2`` and ``B2`` (and similarly +for ``C`` and ``D``). These site-specific radial distribution functions are +typically calculated if one is interested in the solvation shells of a ligand +in a binding site or the solvation of specific residues in a protein. A common +use case is to choose ``A`` and ``C`` to be AtomGroups that only contain a +single atom and ``W`` all solvent molecules: ``InterRDF_s(u, [[A, W], [B, +W]])`` will then produce the RDF of solvent around atom ``A[0]`` and around +atom ``B[0]``. + + .. autoclass:: InterRDF_s + :members: + :inherited-members: -------- .. Not Implemented yet: .. - Structure factor? @@ -183,25 +236,16 @@ def _conclude(self): self.rdf = rdf - -""" -Site-specific Radial Distribution Functions --- :mod:`MDAnalysis.analysis.rdf_s` -================================================================ - -Tools for calculating site-specific pair distribution functions ("radial -distribution functions" or "RDF"). - -""" - class InterRDF_s(AnalysisBase): """Site-specific intermolecular pair distribution function Arguments --------- u : Universe - A Universe contains atoms in ags + a Universe that contains atoms in `ags` ags : list - A list of pairs of AtomGroups + a list of pairs of :class:`~MDAnalysis.core.groups.AtomGroup` + instances nbins : int (optional) Number of bins in the histogram [75] range : tuple or list (optional) @@ -216,8 +260,10 @@ class InterRDF_s(AnalysisBase): Example ------- - First create the :class:`InterRDF_s` object, by supplying one Universe - and one list of pairs of AtomGroups then use the :meth:`run` method :: + + First create the :class:`InterRDF_s` object, by supplying one Universe and + one list of pairs of AtomGroups, then use the :meth:`~InterRDF_s.run` + method:: from MDAnalysisTests.datafiles import GRO_MEMPROT, XTC_MEMPROT u = mda.Universe(GRO_MEMPROT, XTC_MEMPROT) @@ -231,22 +277,25 @@ class InterRDF_s(AnalysisBase): rdf = InterRDF_s(u, ags) rdf.run() - Results are available through the :attr:`bins` and :attr:`rdf` - attributes:: + Results are available through the :attr:`bins` and :attr:`rdf` attributes:: plt.plot(rdf.bins, rdf.rdf[0][0][0]) - (Which plots the rdf between the first atom in s1 and the first atom in s2) + (Which plots the rdf between the first atom in ``s1`` and the first atom in + ``s2``) - To generate cdf, use the 'cdf' method + To generate the *cumulative distribution function* (cdf), use the + :meth:`~InterRDF_s.get_cdf` method :: cdf = rdf.get_cdf() - Results are available through the :attr:'cdf' attributes:: + Results are available through the :attr:'cdf' attribute:: plt.plot(rdf.bins, rdf.cdf[0][0][0]) - (Which plots the cdf between the first atom in s1 and the first atom in s2) + (Which plots the cdf between the first atom in ``s1`` and the first atom in + ``s2``) + .. versionadded:: 0.19.0 @@ -322,10 +371,14 @@ def _conclude(self): def get_cdf(self): """Calculate the cumulative distribution functions (CDF) for all sites. + Note that this is the actual count within a given radius, i.e., + :math:`N(r)`. + Returns ------- cdf : list list of arrays with the same structure as :attr:`rdf` + """ # Calculate cumulative distribution function # Empty list to restore CDF diff --git a/package/doc/sphinx/source/documentation_pages/analysis/rdf.rst b/package/doc/sphinx/source/documentation_pages/analysis/rdf.rst index da861b4e9da..e460824b2dc 100644 --- a/package/doc/sphinx/source/documentation_pages/analysis/rdf.rst +++ b/package/doc/sphinx/source/documentation_pages/analysis/rdf.rst @@ -1,3 +1,3 @@ .. automodule:: MDAnalysis.analysis.rdf - :members: + diff --git a/testsuite/MDAnalysisTests/analysis/test_rdf_s.py b/testsuite/MDAnalysisTests/analysis/test_rdf_s.py index 0e038270cf8..743acf0c513 100644 --- a/testsuite/MDAnalysisTests/analysis/test_rdf_s.py +++ b/testsuite/MDAnalysisTests/analysis/test_rdf_s.py @@ -19,8 +19,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -from __future__ import absolute_import -from six.moves import zip +from __future__ import absolute_import, division import pytest @@ -47,7 +46,7 @@ def sels(u): return ags @pytest.fixture(scope='module') -def rdf(u,sels): +def rdf(u, sels): return InterRDF_s(u, sels).run() def test_nbins(u): @@ -100,8 +99,8 @@ def test_cdf(rdf): @pytest.mark.parametrize("density, value", [ - (True, 13275.775528444701), - (False, 0.021915460340071267)]) + (True, 13275.775528444701), + (False, 0.021915460340071267)]) def test_density(u, sels, density, value): rdf = InterRDF_s(u, sels, density=density).run() From 2d35dad96a1f20ab08ff4254a5b42071e5ce27d6 Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Fri, 25 May 2018 12:21:10 -0600 Subject: [PATCH 066/455] TST: clean up extraneous writer creation in LAMMPS test_Writer() unit test. --- testsuite/MDAnalysisTests/coordinates/test_lammps.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_lammps.py b/testsuite/MDAnalysisTests/coordinates/test_lammps.py index 5fdad691f8b..6e2c89941db 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_lammps.py +++ b/testsuite/MDAnalysisTests/coordinates/test_lammps.py @@ -279,11 +279,13 @@ def test_Writer_is_LAMMPS(self, u, tmpdir): def test_Writer(self, u, tmpdir, n_frames=3): ext = os.path.splitext(self.trajectory)[1] outfile = str(tmpdir.join('lammps-writer-test' + ext)) - W = mda.Writer(outfile, n_atoms=u.atoms.n_atoms, - format=self.format) - with u.trajectory.OtherWriter(outfile) as w: + + with mda.Writer(outfile, + n_atoms=u.atoms.n_atoms, + format=self.format) as w: for ts in u.trajectory[:n_frames]: w.write(ts) + short = mda.Universe(self.topology, outfile) assert_equal(short.trajectory.n_frames, n_frames, err_msg="number of frames mismatch") From 347f60ffeccaf51b584add39d25704ea0ebd8c88 Mon Sep 17 00:00:00 2001 From: Tyler Date: Wed, 23 May 2018 22:05:05 -0600 Subject: [PATCH 067/455] TST: skip gsd-based tests on Windows. --- testsuite/MDAnalysisTests/coordinates/test_gsd.py | 9 +++++++++ testsuite/MDAnalysisTests/topology/test_gsd.py | 3 +++ 2 files changed, 12 insertions(+) diff --git a/testsuite/MDAnalysisTests/coordinates/test_gsd.py b/testsuite/MDAnalysisTests/coordinates/test_gsd.py index 320769e9abc..568b0d3e629 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_gsd.py +++ b/testsuite/MDAnalysisTests/coordinates/test_gsd.py @@ -27,12 +27,15 @@ from MDAnalysisTests.datafiles import GSD import MDAnalysis as mda +import os @pytest.fixture def GSD_U(): return mda.Universe(GSD) +@pytest.mark.skipif(os.name == 'nt', + reason="gsd not windows compatible") def test_gsd_positions(GSD_U): # first frame first particle ts = GSD_U.trajectory[0] @@ -43,14 +46,20 @@ def test_gsd_positions(GSD_U): assert_almost_equal(GSD_U.atoms.positions[0], [ -5.58348083, -9.98546982, -10.17657185]) +@pytest.mark.skipif(os.name == 'nt', + reason="gsd not windows compatible") def test_gsd_n_frames(GSD_U): assert len(GSD_U.trajectory) == 2 +@pytest.mark.skipif(os.name == 'nt', + reason="gsd not windows compatible") def test_gsd_dimensions(GSD_U): ts = GSD_U.trajectory[0] assert_almost_equal(ts.dimensions, [ 21.60000038,21.60000038,21.60000038,90.,90.,90.]) +@pytest.mark.skipif(os.name == 'nt', + reason="gsd not windows compatible") def test_gsd_data_step(GSD_U): assert GSD_U.trajectory[0].data['step'] == 0 assert GSD_U.trajectory[1].data['step'] == 500 diff --git a/testsuite/MDAnalysisTests/topology/test_gsd.py b/testsuite/MDAnalysisTests/topology/test_gsd.py index 833ad2586f9..eb667059bbe 100644 --- a/testsuite/MDAnalysisTests/topology/test_gsd.py +++ b/testsuite/MDAnalysisTests/topology/test_gsd.py @@ -28,8 +28,11 @@ from MDAnalysisTests.topology.base import ParserBase from MDAnalysisTests.datafiles import GSD from numpy.testing import assert_equal +import os +@pytest.mark.skipif(os.name == 'nt', + reason="gsd not windows compatible") class TestGSDParser(ParserBase): parser = mda.topology.GSDParser.GSDParser ref_filename = GSD From 9675f920f440e88c540fbf91c98b162737604a1f Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Wed, 30 May 2018 21:21:23 -0600 Subject: [PATCH 068/455] BUG: libdcd now properly handles missing input file on Windows. --- package/MDAnalysis/lib/formats/libdcd.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package/MDAnalysis/lib/formats/libdcd.pyx b/package/MDAnalysis/lib/formats/libdcd.pyx index afbb57c812a..812d6803c1e 100644 --- a/package/MDAnalysis/lib/formats/libdcd.pyx +++ b/package/MDAnalysis/lib/formats/libdcd.pyx @@ -292,6 +292,8 @@ cdef class DCDFile: self.close() if mode == 'r': + if not path.isfile(self.fname): + raise IOError("DCD file does not exist") fio_mode = FIO_READ elif mode == 'w': fio_mode = FIO_WRITE From a13863448109860f0c97e8df99d20061e415542e Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 30 May 2018 18:05:47 +0200 Subject: [PATCH 069/455] fixed *Group.pack_into_box() for groups with duplicates; cached uniqueness properties of *Groups; added *Group.isunique property --- package/MDAnalysis/core/groups.py | 363 ++++++++++++++++++------------ 1 file changed, 218 insertions(+), 145 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index e73a4ef9bbc..1c2cccbae16 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -105,6 +105,7 @@ from .. import _ANCHOR_UNIVERSES from ..lib import util +from ..lib.util import cached from ..lib import distances from ..lib import transformations from ..selections import get_writer as get_selection_writer_for @@ -601,6 +602,35 @@ def dimensions(self): def dimensions(self, dimensions): self.universe.trajectory.ts.dimensions = dimensions + @property + @cached('isunique') + def isunique(self): + """Boolean indicating whether all members in the group are unique, i.e., + the group contains no duplicates. + + Examples + -------- + + >>> ag = u.atoms[[2, 1, 2, 2, 1, 0]] + >>> ag + + >>> ag.isunique + False + >>> ag2 = ag.unique + >>> ag2 + + >>> ag2.isunique + True + + .. versionadded:: 0.19.0 + """ + if len(self) <= 1: + return True + # Check indices for uniqueness: + s_ix = np.sort(self._ix) + mask = s_ix[1:] != s_ix[:-1] + return mask[mask.argmin()] # faster than mask.min() + def center(self, weights, pbc=None, compound='group'): """Weighted center of (compounds of) the group @@ -1030,27 +1060,36 @@ def pack_into_box(self, box=None, inplace=True): .. versionadded:: 0.8 """ - atomgroup = self.atoms.unique - if box is None: # Try and auto detect box dimensions - box = atomgroup.dimensions # Can accept any box + # Try and auto detect box dimensions: + if box is None: + box = self.dimensions - if box.shape == (3, 3): - # for a vector representation, diagonal cannot be zero - if (box.diagonal() == 0.0).any(): + # For a vector representation, the diagonal must not be zero, for a + # [x, y, z, alpha, beta, gamma] representation, no element must be zero: + if (box.shape == (3, 3) and (box.diagonal() == 0.0).any()) \ + or (box == 0).any(): raise ValueError("One or more box dimensions is zero." - " You can specify a boxsize with 'box ='") + " You can specify a box with 'box ='") + # no matter what kind of group we have, we need to work on its atoms: + ag = self.atoms + # If self is unique, so are its atoms. Thus, if the group is unique, we + # can use its atoms as is. + if self.isunique: + packed_coords = distances.apply_PBC(ag.positions, box) + if inplace: + ag.universe.coord.positions[ag.ix] = packed_coords + return ag.universe.coord.positions[ag.ix] + return packed_coords else: - if (box == 0).any(): # Check that a box dimension isn't zero - raise ValueError("One or more box dimensions is zero." - " You can specify a boxsize with 'box='") - - coords = atomgroup.universe.coord.positions[atomgroup.indices] - if not inplace: - return distances.apply_PBC(coords, box) - - atomgroup.universe.coord.positions[atomgroup.indices] = distances.apply_PBC(coords, box) - - return atomgroup.universe.coord.positions[atomgroup.indices] + unique_ag = ag.unique + unique_ix = unique_ag.ix + restore_mask = ag._unique_restore_mask + coords = ag.universe.coord.positions[unique_ix] + packed_coords = distances.apply_PBC(coords, box) + if inplace: + ag.universe.coord.positions[unique_ix] = packed_coords + return ag.universe.coord.positions[unique_ix[restore_mask]] + return packed_coords[restore_mask] def wrap(self, compound="atoms", center="com", box=None): """Shift the contents of this Group back into the unit cell. @@ -1510,30 +1549,29 @@ def is_strict_superset(self, other): class AtomGroup(GroupBase): """An ordered array of atoms. - Can be initiated from an iterable of Atoms:: + Can be initiated from an iterable of :class:`Atom`s:: ag = AtomGroup([Atom1, Atom2, Atom3]) - Or from providing a list of indices and the Universe which is should belong - to:: + Or from providing a list of indices and the Universe it should belong to:: ag = AtomGroup([72, 14, 25], u) - Alternatively an :class:`AtomGroup` is generated by indexing/slicing another - AtomGroup, such as the Group of all atoms in the :class:`Universe` at - :attr:`MDAnalysis.core.universe.Universe.atoms`. + Alternatively, an :class:`AtomGroup` is generated by indexing/slicing + another :class:`AtomGroup`, such as the group of all atoms in the + :class:`Universe` at :attr:`MDAnalysis.core.universe.Universe.atoms`. - An AtomGroup can be indexed and sliced like a list:: + An :class:`AtomGroup` can be indexed and sliced like a list:: ag[0], ag[-1] will return the first and the last :class:`Atom` in the group whereas the - slice :: + slice:: ag[0:6:2] - returns an AtomGroup of every second element, corresponding to indices 0, - 2, and 4. + returns an :class:`AtomGroup` of every second element, corresponding to + indices 0, 2, and 4. It also supports "advanced slicing" when the argument is a :class:`numpy.ndarray` or a :class:`list`:: @@ -1541,37 +1579,38 @@ class AtomGroup(GroupBase): aslice = [0, 3, -1, 10, 3] ag[aslice] - will return a new AtomGroup of atoms with those indices in the old - AtomGroup. + will return a new :class:`AtomGroup` of atoms with those indices in the old + :class:`AtomGroup`. - Finally, AtomGroups can be created from a selection. See + Finally, :class:`AtomGroup`s can be created from a selection. See :meth:`select_atoms`. .. note:: - AtomGroups originating from a selection are sorted and - duplicate elements are removed. This is not true for AtomGroups - produced by slicing. Thus slicing can be used when the order of + :class:`AtomGroup`s originating from a selection are sorted and + duplicate elements are removed. This is not true for :class:`AtomGroup`s + produced by slicing. Thus, slicing can be used when the order of atoms is crucial (for instance, in order to define angles or dihedrals). - AtomGroups can be compared and combined using group operators. For - instance, AtomGroups can be concatenated using `+` or :meth:`concatenate`:: + :class:`AtomGroup`s can be compared and combined using group operators. For + instance, :class:`AtomGroup`s can be concatenated using `+` or + :meth:`concatenate`:: ag_concat = ag1 + ag2 # or ag_concat = ag1.concatenate(ag2) When groups are concatenated, the order of the atoms is conserved. If atoms appear several times in one of the groups, the duplicates are kept in the resulting group. On the contrary to :meth:`concatenate`, :meth:`union` - treats the AtomGroups as sets, duplicates are removed from the resulting - group, and atoms are ordered. The `|` operator is synomymous to + treats the :class:`AtomGroup`s as sets, duplicates are removed from the + resulting group, and atoms are ordered. The `|` operator is synomymous to :meth:`union`:: ag_union = ag1 | ag2 # or ag_union = ag1.union(ag2) The opposite operation to :meth:`concatenate` is :meth:`subtract`. This method creates a new group with all the atoms of the group that are not in - a given other group; the order of the atoms is kept, so as duplicates. + a given other group; the order of the atoms is kept, and so are duplicates. :meth:`difference` is the set version of :meth:`subtract`. The resulting group is sorted and deduplicated. @@ -1613,8 +1652,7 @@ class AtomGroup(GroupBase): | | | ``t`` but not both | +-------------------------------+------------+----------------------------+ - The following methods keep the order of the atoms, and keep duplicated - atoms. + The following methods keep the order of the atoms as well as duplicates. +-------------------------------+------------+----------------------------+ | Operation | Equivalent | Result | @@ -1637,7 +1675,7 @@ class AtomGroup(GroupBase): The `in` operator allows to test if an :class:`Atom` is in the AtomGroup. - AtomGroup instances are always bound to a + :class:`AtomGroup` instances are always bound to a :class:`MDAnalysis.core.universe.Universe`. They cannot exist in isolation. @@ -1670,9 +1708,9 @@ class AtomGroup(GroupBase): .. deprecated:: 0.16.2 - *Instant selectors* of AtomGroup will be removed in the 1.0 release. - See :ref:`Instant selectors ` for details and alternatives. - + *Instant selectors* of :class:`AtomGroup` will be removed in the 1.0 + release. See :ref:`Instant selectors ` for details + and alternatives. """ def __getitem__(self, item): # DEPRECATED in 0.16.2 @@ -1710,20 +1748,23 @@ def __reduce__(self): @property def atoms(self): - """Get another AtomGroup identical to this one.""" - return self.universe.atoms[self.ix] + """The :class:`AtomGroup` itself + """ + return self @property def n_atoms(self): - """Number of atoms in AtomGroup. + """Number of atoms in the :class:`AtomGroup`. - Equivalent to ``len(self)``.""" + Equivalent to ``len(self)``. + """ return len(self) @property def residues(self): - """Get sorted :class:`ResidueGroup` of the (unique) residues - represented in the AtomGroup.""" + """Get sorted :class:`ResidueGroup` of the unique residues + present in the AtomGroup. + """ return self.universe.residues[np.unique(self.resindices)] @residues.setter @@ -1765,7 +1806,8 @@ def n_residues(self): @property def segments(self): """Get sorted :class:`SegmentGroup` of the (unique) segments - represented in the AtomGroup.""" + present in the :class:`AtomGroup`. + """ return self.universe.segments[np.unique(self.segindices)] @segments.setter @@ -1778,13 +1820,35 @@ def n_segments(self): """Number of unique segments represented in the AtomGroup. Equivalent to ``len(self.segments)``. - """ return len(self.segments) @property + @cached('unique_restore_mask') + def _unique_restore_mask(self): + # The _unique_restore_mask property's cache is populated whenever the + # AtomGroup.unique property of a *non-unique* AtomGroup is accessed. + # If _unique_restore_mask is not cached, it is *definitely* used in the + # wrong place, so we raise an exception here. In principle, the + # exception should be an AttributeError, but the error message would + # then be replaced by the __getattr__() error message. To prevent the + # message from being overridden, we raise a RuntimeError instead. + if self.isunique: + raise RuntimeError("{cls}._unique_restore_mask is not available " + "if the {cls} is unique." + "".format(cls=self.__class__.__name__)) + raise RuntimeError("{cls}._unique_restore_mask is only available " + "after accessing {cls}.unique." + "".format(cls=self.__class__.__name__)) + + @_unique_restore_mask.setter + def _unique_restore_mask(self, mask): + self._cache['unique_restore_mask'] = mask + + @property + @cached('unique') def unique(self): - """Return an AtomGroup containing sorted and unique atoms only. + """Return an :class:`AtomGroup` containing sorted and unique atoms only. Examples -------- @@ -1802,7 +1866,16 @@ def unique(self): .. versionadded:: 0.16.0 """ - return self.universe.atoms[np.unique(self.ix)] + if self.isunique: + return self + unique_ix, restore_mask = np.unique(self.ix, return_inverse=True) + _unique = self.universe.atoms[unique_ix] + self._unique_restore_mask = restore_mask + # Since we know that _unique is a unique AtomGroup, we set its + # uniqueness caches from here: + _unique._cache['isunique'] = True + _unique._cache['unique'] = _unique + return _unique @property def positions(self): @@ -1912,7 +1985,8 @@ def select_atoms(self, sel, *othersel, **selgroups): Raises ------ - `TypeError` if the arbitrary atomgroups passed are not of type `MDAnalysis.core.groups.AtomGroup` + `TypeError` if the arbitrary atomgroups passed are not of type + `MDAnalysis.core.groups.AtomGroup` Examples -------- @@ -1952,12 +2026,11 @@ def select_atoms(self, sel, *othersel, **selgroups): ----- If exact ordering of atoms is required (for instance, for - :meth:`~AtomGroup.angle` or :meth:`~AtomGroup.dihedral` - calculations) then one supplies selections *separately* in the - required order. Also, when multiple :class:`AtomGroup` - instances are concatenated with the ``+`` operator then the - order of :class:`Atom` instances is preserved and duplicates - are not removed. + :meth:`~AtomGroup.angle` or :meth:`~AtomGroup.dihedral` calculations) + then one supplies selections *separately* in the required order. Also, + when multiple :class:`AtomGroup` instances are concatenated with the + ``+`` operator, then the order of :class:`Atom` instances is preserved + and duplicates are *not* removed. See Also @@ -2223,7 +2296,6 @@ def guess_bonds(self, vdwradii=None): .. versionadded:: 0.10.0 - """ from ..topology.core import guess_bonds, guess_angles, guess_dihedrals from .topologyattrs import Bonds, Angles, Dihedrals @@ -2360,7 +2432,6 @@ def write(self, filename=None, file_format="PDB", .. versionchanged:: 0.9.0 Merged with write_selection. This method can now write both selections out. - """ # check that AtomGroup actually has any atoms (Issue #434) if len(self.atoms) == 0: @@ -2425,8 +2496,8 @@ class ResidueGroup(GroupBase): .. deprecated:: 0.16.2 *Instant selectors* of Segments will be removed in the 1.0 release. - See :ref:`Instant selectors ` for details and alternatives. - + See :ref:`Instant selectors ` for details and + alternatives. """ @property @@ -2436,7 +2507,6 @@ def atoms(self): The atoms are ordered locally by residue in the :class:`ResidueGroup`. No duplicates are removed. - """ return self.universe.atoms[np.concatenate(self.indices)] @@ -2446,29 +2516,27 @@ def n_atoms(self): duplicate residues. Equivalent to ``len(self.atoms)``. - """ return len(self.atoms) @property def residues(self): - """Get another :class:`ResidueGroup` identical to this one. - + """The :class:`ResidueGroup` itself. """ - return self.universe.residues[self.ix] + return self @property def n_residues(self): - """Number of residues in ResidueGroup. Equivalent to ``len(self)``. - + """Number of residues in the :class:`ResidueGroup`. + + Equivalent to ``len(self)``. """ return len(self) @property def segments(self): - """Get sorted SegmentGroup of the (unique) segments represented in the - ResidueGroup. - + """Get sorted :class:`SegmentGroup` of the unique segments present in + the :class:`ResidueGroup`. """ return self.universe.segments[np.unique(self.segindices)] @@ -2483,8 +2551,8 @@ def segments(self, new): try: s_ix = [s.segindex for s in new] except AttributeError: - raise TypeError("Can only set ResidueGroup residues to Segment " - "or ResidueGroup not {}".format( + raise TypeError("Can only set ResidueGroup segments to Segment " + "or SegmentGroup, not {}".format( ', '.join(type(r) for r in new if not isinstance(r, Segment)) )) @@ -2501,16 +2569,17 @@ def segments(self, new): @property def n_segments(self): - """Number of unique segments represented in the ResidueGroup. + """Number of unique segments present in the ResidueGroup. Equivalent to ``len(self.segments)``. - """ return len(self.segments) @property + @cached('unique') def unique(self): - """Return a ResidueGroup containing sorted and unique residues only. + """Return a :class:`ResidueGroup` containing sorted and unique residues + only. Examples -------- @@ -2528,7 +2597,14 @@ def unique(self): .. versionadded:: 0.16.0 """ - return self.universe.residues[np.unique(self.ix)] + if self.isunique: + return self + _unique = self.universe.residues[np.unique(self.ix)] + # Since we know that _unique is a unique ResidueGroup, we set its + # uniqueness caches from here: + _unique._cache['isunique'] = True + _unique._cache['unique'] = _unique + return _unique class SegmentGroup(GroupBase): @@ -2544,67 +2620,67 @@ class SegmentGroup(GroupBase): .. deprecated:: 0.16.2 *Instant selectors* of Segments will be removed in the 1.0 release. - See :ref:`Instant selectors ` for details and alternatives. - + See :ref:`Instant selectors ` for details and + alternatives. """ @property def atoms(self): - """Get an AtomGroup of atoms represented in this SegmentGroup. + """Get an :class:`AtomGroup` of atoms present in this + :class:`SegmentGroup`. The atoms are ordered locally by residue, which are further ordered by - segment in the SegmentGroup. No duplicates are removed. - + segment in the :class:`SegmentGroup`. Duplicate atoms are *not* removed. """ return self.universe.atoms[np.concatenate(self.indices)] @property def n_atoms(self): - """Number of atoms represented in SegmentGroup, including duplicate - segments. + """Number of atoms present in the :class:`SegmentGroup`, including + duplicate segments (and thus, duplicate atoms). Equivalent to ``len(self.atoms)``. - """ return len(self.atoms) @property def residues(self): - """Get a ResidueGroup of residues represented in this SegmentGroup. - - The residues are ordered locally by segment in the SegmentGroup. - No duplicates are removed. + """Get a :class:`ResidueGroup` of residues present in this + :class:`SegmentGroup`. + The residues are ordered locally by segment in the + :class:`SegmentGroup`. Duplicates are *not* removed. """ return self.universe.residues[np.concatenate(self.resindices)] @property def n_residues(self): - """Number of residues represented in SegmentGroup, including duplicate - segments. + """Number of residues present in this :class:`SegmentGroup`, including + duplicate segments (and thus, residues). Equivalent to ``len(self.residues)``. - """ return len(self.residues) @property def segments(self): - """Get another SegmentGroup identical to this one. - + """The :class:`SegmentGroup` itself. """ - return self.universe.segments[self.ix] + return self @property def n_segments(self): - """Number of segments in SegmentGroup. Equivalent to ``len(self)``. - + """Number of segments in the :class:`SegmentGroup`. + + Equivalent to ``len(self)``. """ return len(self) @property + @cached('unique') def unique(self): - """Return a SegmentGroup containing sorted and unique segments only. + """Return a :class:`SegmentGroup` containing sorted and unique segments + only. Examples -------- @@ -2621,9 +2697,15 @@ def unique(self): array([0, 1, 2]) .. versionadded:: 0.16.0 - """ - return self.universe.segments[np.unique(self.ix)] + if self.isunique: + return self + _unique = self.universe.segments[np.unique(self.ix)] + # Since we know that _unique is a unique SegmentGroup, we set its + # uniqueness caches from here: + _unique._cache['isunique'] = True + _unique._cache['unique'] = _unique + return _unique @functools.total_ordering @@ -2667,7 +2749,6 @@ def __add__(self, other): ------- Group Group with elements of `self` and `other` concatenated - """ o_ix = other.ix_array @@ -2687,7 +2768,6 @@ def __radd__(self, other): ------- self Group with elements of `self` reproduced - """ if other == 0: return self.level.plural(self.ix_array, self.universe) @@ -2704,10 +2784,9 @@ def universe(self): def ix(self): """Unique index of this component. - If this component is an Atom, this is the index of the atom. - If it is a Residue, this is the index of the residue. - If it is a Segment, this is the index of the segment. - + If this component is an :class:`Atom`, this is the index of the atom. + If it is a :class:`Residue`, this is the index of the residue. + If it is a :class:`Segment`, this is the index of the segment. """ return self._ix @@ -2727,10 +2806,9 @@ def ix_array(self): class Atom(ComponentBase): """Atom base class. - This class is used by a Universe for generating its Topology-specific Atom - class. All the TopologyAttr components are obtained from ComponentBase, so - this class only includes ad-hoc methods specific to Atoms. - + This class is used by a Universe for generating its Topology-specific + :class:`Atom` class. All the TopologyAttr components are obtained from + ComponentBase, so this class only includes ad-hoc methods specific to atoms. """ def __getattr__(self, attr): """Try and catch known attributes and give better error message""" @@ -2763,8 +2841,8 @@ def residue(self): @residue.setter def residue(self, new): if not isinstance(new, Residue): - raise TypeError( - "Can only set Atom residue to Residue, not {}".format(type(new))) + raise TypeError("Can only set Atom residue to Residue, not {}" + "".format(type(new))) self.universe._topology.tt.move_atom(self.ix, new.resindex) @property @@ -2782,9 +2860,9 @@ def position(self): The position can be changed by assigning an array of length (3,). - .. note:: changing the position is not reflected in any files; reading any - frame from the trajectory will replace the change with that - from the file + .. note:: changing the position is not reflected in any files; reading + any frame from the trajectory will replace the change with + that from the file """ return self.universe.trajectory.ts.positions[self.ix].copy() @@ -2798,13 +2876,12 @@ def velocity(self): The velocity can be changed by assigning an array of shape (3,). - .. note:: changing the velocity is not reflected in any files; reading any - frame from the trajectory will replace the change with that - from the file + .. note:: changing the velocity is not reflected in any files; reading + any frame from the trajectory will replace the change with + that from the file A :exc:`~MDAnalysis.NoDataError` is raised if the trajectory does not contain velocities. - """ ts = self.universe.trajectory.ts try: @@ -2832,7 +2909,6 @@ def force(self): A :exc:`~MDAnalysis.NoDataError` is raised if the trajectory does not contain forces. - """ ts = self.universe.trajectory.ts try: @@ -2855,8 +2931,7 @@ class Residue(ComponentBase): This class is used by a Universe for generating its Topology-specific Residue class. All the TopologyAttr components are obtained from ComponentBase, so this class only includes ad-hoc methods specific to - Residues. - + residues. """ def __repr__(self): me = '` for details and alternatives. - + See :ref:`Instant selectors ` for details and + alternatives. """ def __repr__(self): me = ' will be removed in 1.0. " - "Use Segment.residues[N-1] instead.", + warnings.warn("Instant selectors Segment.r will be removed in " + "1.0. Use Segment.residues[N-1] instead.", DeprecationWarning) return rg # Resname accesss @@ -2956,7 +3032,6 @@ class UpdatingAtomGroup(AtomGroup): re-applied), and only then is the attribute returned. .. versionadded:: 0.16.0 - """ # WARNING: This class has __getattribute__ and __getattr__ methods (the # latter inherited from AtomGroup). Because of this bugs introduced in the @@ -2974,7 +3049,6 @@ def __init__(self, base_group, selections, strings): group on which *selections* are to be applied. selections : a tuple of :class:`~MDAnalysis.core.selection.Selection` instances selections ready to be applied to *base_group*. - """ # Because we're implementing __getattribute__, which needs _u for # its check, no self.attribute access can be made before this line @@ -2995,7 +3069,6 @@ def update_selection(self): This method is triggered automatically when accessing attributes, if the last update occurred under a different trajectory frame. - """ bg = self._base_group sels = self._selections @@ -3005,7 +3078,8 @@ def update_selection(self): sels[0].apply(bg)).ix else: ix = np.array([], dtype=np.intp) - # Run back through AtomGroup init with this information to remake ourselves + # Run back through AtomGroup init with this information to remake + # ourselves super(UpdatingAtomGroup, self).__init__(ix, self.universe) self.is_uptodate = True @@ -3022,7 +3096,6 @@ def is_uptodate(self): ------- bool `True` if the group's selection is up-to-date, `False` otherwise. - """ try: return self.universe.trajectory.frame == self._lastupdate @@ -3048,7 +3121,6 @@ def _ensure_updated(self): ------- bool `True` if the group was already up-to-date, `False` otherwise. - """ status = self.is_uptodate if not status: @@ -3070,7 +3142,8 @@ def __reduce__(self): # - recreate UAG as created through select_atoms (basegroup and selstrs) # even if base_group is a UAG this will work through recursion return (_unpickle_uag, - (self._base_group.__reduce__(), self._selections, self._selection_strings)) + (self._base_group.__reduce__(), self._selections, + self._selection_strings)) def __repr__(self): basestr = super(UpdatingAtomGroup, self).__repr__() @@ -3102,17 +3175,17 @@ def __repr__(self): SegmentGroup.level = SEGMENTLEVEL def requires(*attrs): - """Decorator to check if all AtomGroup arguments have certain attributes + """Decorator to check if all :class:`AtomGroup` arguments have certain + attributes Example ------- - When used to wrap a function, will check all AtomGroup arguments for the - listed requirements + When used to wrap a function, will check all :class:`AtomGroup` arguments + for the listed requirements @requires('masses', 'charges') def mass_times_charge(atomgroup): return atomgroup.masses * atomgroup.charges - """ def require_dec(func): @functools.wraps(func) From bbabc5cc2f421fab95d270549b6fab358b60b1b5 Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 30 May 2018 18:28:48 +0200 Subject: [PATCH 070/455] fixed whitespace errors in core/groups.py and updated changelog --- package/CHANGELOG | 6 ++++++ package/MDAnalysis/core/groups.py | 28 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index b04e990ec39..cc1b0fd8a11 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -24,6 +24,8 @@ Enhancements * added compound kwarg to center, centroid, center_of_geometry, center_of_mass (PR #1903) * Added rdf.InterRDF_s to calculate site-specific pair distribution functions (PR #1815) + * Increased performance of (repeated) calls to AtomGroup.pack_into_box() + (PR #????) Fixes * Fixed order of indices in Angle/Dihedral/Improper repr @@ -33,10 +35,14 @@ Fixes * Adding new TopologyAttrs with values defined always coerces this into a numpy array (Issue #1876) * Groups passed to select_atoms() are now type checked (Issue #1852) + * Fixed inconsistent handling of groups with/without duplicates in + pack_into_box() (Issue #1911) Changes * TopologyAttrs are now statically typed (Issue #1876) * updated meta data for new PyPi (#1837) + * AtomGroup.atoms, ResidueGroup.residues, and SegmentGroup.segments now return + themselves instead of a new object to increase performance (PR #????) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 1c2cccbae16..6c242b69e24 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -1184,17 +1184,17 @@ def groupby(self, topattrs): Returns ------- dict - Unique values of the multiple combinations of topology attributes + Unique values of the multiple combinations of topology attributes as keys, Groups as values. Example - ------- - To group atoms with the same mass together: - + ------- + To group atoms with the same mass together: + >>> ag.groupby('masses') {12.010999999999999: , 14.007: , - 15.999000000000001: } + 15.999000000000001: } To group atoms with the same residue name and mass together: @@ -1205,24 +1205,24 @@ def groupby(self, topattrs): ('ALA', 15.999): }, ('ARG', 1.008): , ...} - + >>> ag.groupby(['resnames', 'masses'])('ALA', 15.999) - + .. versionadded:: 0.16.0 .. versionchanged:: 0.18.0 The function accepts multiple attributes """ - + res = dict() - + if isinstance(topattrs, (string_types, bytes)): attr=topattrs if isinstance(topattrs, bytes): attr = topattrs.decode('utf-8') ta = getattr(self, attr) - + return {i: self[ta == i] for i in set(ta)} - + else: attr = topattrs[0] ta = getattr(self, attr) @@ -1231,7 +1231,7 @@ def groupby(self, topattrs): res[i] = self[ta == i] else: res[i] = self[ta == i].groupby(topattrs[1:]) - + return util.flatten_dict(res) @@ -2528,7 +2528,7 @@ def residues(self): @property def n_residues(self): """Number of residues in the :class:`ResidueGroup`. - + Equivalent to ``len(self)``. """ return len(self) @@ -2671,7 +2671,7 @@ def segments(self): @property def n_segments(self): """Number of segments in the :class:`SegmentGroup`. - + Equivalent to ``len(self)``. """ return len(self) From 0dd926e4607c88060771561210ef494e16fe48de Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 30 May 2018 19:31:16 +0200 Subject: [PATCH 071/455] added PR number to changelog --- package/CHANGELOG | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index cc1b0fd8a11..a3e2d9bb447 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -25,7 +25,7 @@ Enhancements * Added rdf.InterRDF_s to calculate site-specific pair distribution functions (PR #1815) * Increased performance of (repeated) calls to AtomGroup.pack_into_box() - (PR #????) + (PR #1922) Fixes * Fixed order of indices in Angle/Dihedral/Improper repr @@ -42,7 +42,7 @@ Changes * TopologyAttrs are now statically typed (Issue #1876) * updated meta data for new PyPi (#1837) * AtomGroup.atoms, ResidueGroup.residues, and SegmentGroup.segments now return - themselves instead of a new object to increase performance (PR #????) + themselves instead of a new object to increase performance (PR #1922) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, From 45126ae83f2e9735a1161c2caa9a942c9f885006 Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 5 Jun 2018 02:17:05 +0200 Subject: [PATCH 072/455] updated *Group.isunique and added explanatory comments; polished docstrings in MDAnalysis/core/groups.py --- package/MDAnalysis/core/groups.py | 764 +++++++++++++++++------------- 1 file changed, 439 insertions(+), 325 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 6c242b69e24..7a34d80b740 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -25,18 +25,18 @@ Core objects: Containers --- :mod:`MDAnalysis.core.groups` ========================================================== -The :class:`~MDAnalysis.core.universe.Universe` instance contains all -the particles in the system (which MDAnalysis calls -:class:`Atom`). Groups of atoms are handled as :class:`AtomGroup` -instances. The :class:`AtomGroup` is probably the most important -object in MDAnalysis because virtually everything can be accessed -through it. `AtomGroup` instances can be easily created (e.g., from a -:meth:`AtomGroup.select_atoms` selection or just by slicing). +The :class:`~MDAnalysis.core.universe.Universe` instance contains all the +particles in the system (which MDAnalysis calls :class:`Atom`). Groups of +:class:`atoms` are handled as :class:`AtomGroup` instances. The +:class:`AtomGroup` is probably the most important object in MDAnalysis because +virtually everything can be accessed through it. :class:`AtomGroup` instances +can be easily created (e.g., from a :meth:`AtomGroup.select_atoms` selection or +simply by slicing). -For convenience, chemically meaningful groups of atoms such as a -:class:`Residue` or a :class:`Segment` (typically a whole molecule or -all of the solvent) also exist as containers, as well as groups of -these units ((:class:`ResidueGroup`, :class:`SegmentGroup`). +For convenience, chemically meaningful groups of :class:`Atoms` such as a +:class:`Residue` or a :class:`Segment` (typically a whole molecule or all of the +solvent) also exist as containers, as well as groups of these units +(:class:`ResidueGroup`, :class:`SegmentGroup`). Classes @@ -73,9 +73,8 @@ Levels ------ -Each of the above classes has a level attribute. This can be used to -verify that two objects are of the same level, or to access a particular -class:: +Each of the above classes has a *level* attribute. This can be used to verify +that two objects are of the same level, or to access a particular class:: u = mda.Universe() @@ -87,7 +86,6 @@ ag.level.singular # Returns Atom class at.level.plural # Returns AtomGroup class - """ from __future__ import absolute_import from six.moves import zip @@ -136,14 +134,14 @@ def _unpickle_uag(basepickle, selections, selstrs): def make_classes(): - """Make a fresh copy of all Classes + """Make a fresh copy of all classes Returns ------- Two dictionaries. One with a set of :class:`_TopologyAttrContainer` classes - to serve as bases for universe-specific MDA container classes. Another with - the final merged versions of those classes. The classes themselves are used - as hashing keys. + to serve as bases for :class:`~MDAnalysis.core.universe.Universe`\ -specific + MDA container classes. Another with the final merged versions of those + classes. The classes themselves are used as hashing keys. """ bases = {} @@ -174,14 +172,15 @@ class _TopologyAttrContainer(object): :class:`_TopologyAttrContainer` is a convenience class to encapsulate the functions that deal with: - * the import and namespace transplant of :class:`TopologyAttr` objects; + * the import and namespace transplant of + :class:`~MDAnalysis.core.topologyattrs.TopologyAttr` objects; * the copying (subclassing) of itself to create distinct bases for the different container classes (:class:`AtomGroup`, :class:`ResidueGroup`, :class:`SegmentGroup`, :class:`Atom`, :class:`Residue`, :class:`Segment`, and subclasses thereof); * the mixing (subclassing and co-inheritance) with the container classes. The mixed subclasses become the final container classes specific to each - :class:`Universe`. + :class:`~MDAnalysis.core.universe.Universe`. """ @classmethod def _subclass(cls, is_group): @@ -191,10 +190,12 @@ def _subclass(cls, is_group): ---------- is_group : bool The :attr:`_is_group` of the returned class will be set to - *is_group*. This is used to distinguish between Groups (AtomGroup - etc.) and Components (Atom etc.) in internal methods when - considering actions such as addition between objects, adding - TopologyAttributes to them. + `is_group`. This is used to distinguish between Groups + (:class:`AtomGroup` etc.) and Components (:class:`Atom` etc.) in + internal methods when considering actions such as addition of + objects or adding + :class:`TopologyAttributes` + to them. Returns ------- @@ -225,7 +226,7 @@ def _mix(cls, other): The new class will have an attribute `_derived_class` added, pointing to itself. This pointer instructs which class to use when - slicing/adding instances of the new class. At initialization time the + slicing/adding instances of the new class. At initialization time, the new class may choose to point `_derived_class` to another class (as is done in the initialization of :class:`UpdatingAtomGroup`). @@ -246,11 +247,11 @@ def _mix(cls, other): @classmethod def _add_prop(cls, attr): - """Add attr into the namespace for this class + """Add *attr* into the namespace for this class Parameters ---------- - attr : A TopologyAttr object + attr : A :class:`TopologyAttr` object """ def getter(self): return attr.__getitem__(self) @@ -285,8 +286,10 @@ class _MutableBase(object): Base class that merges appropriate :class:`_TopologyAttrContainer` classes. Implements :meth:`__new__`. In it the instantiating class is fetched from - :attr:`Universe._classes`. If there is a cache miss, a merged class is made - with a base from :attr:`Universe._class_bases` and cached. + :attr:`~MDAnalysis.core.universe.Universe._classes`. If there is a cache + miss, a merged class is made + with a base from :attr:`~MDAnalysis.core.universe.Universe._class_bases` + and cached. The classes themselves are used as the cache dictionary keys for simplcity in cache retrieval. @@ -366,7 +369,8 @@ def wrapped(self, other): class GroupBase(_MutableBase): - """Base class from which a Universe's Group class is built. + """Base class from which a :class:`<~MDAnalysis.core.universe.Universe`\ 's + Group class is built. Instances of :class:`GroupBase` provide the following operations that conserve element repetitions and order: @@ -541,7 +545,8 @@ def __eq__(self, other): Two groups are equal if they contain the same indices in the same order. Groups that are not at the same level or that belong - to different universe cannot be compared. + to different :class:`Universes` + cannot be compared. """ o_ix = other.ix return np.array_equal(self.ix, o_ix) @@ -564,6 +569,9 @@ def __xor__(self, other): @property def universe(self): + """The underlying :class:`~MDAnalysis.core.universe.Universe` the group + belongs to. + """ return self._u @property @@ -584,12 +592,12 @@ def ix(self): def ix_array(self): """Unique indices of the components in the Group. - For a Group, ix_array is the same as ix. This method gives a - consistent API between components and groups. + For a Group, :attr:`ix_array` is the same as :attr:`ix`. This method + gives a consistent API between components and groups. See Also -------- - ix + :attr:`ix` """ return self._ix @@ -605,8 +613,8 @@ def dimensions(self, dimensions): @property @cached('isunique') def isunique(self): - """Boolean indicating whether all members in the group are unique, i.e., - the group contains no duplicates. + """Boolean indicating whether all components of the group are unique, + i.e., the group contains no duplicates. Examples -------- @@ -622,21 +630,28 @@ def isunique(self): >>> ag2.isunique True + .. versionadded:: 0.19.0 """ if len(self) <= 1: return True - # Check indices for uniqueness: + # Fast check for uniqueness + # 1. get sorted array of component indices: s_ix = np.sort(self._ix) - mask = s_ix[1:] != s_ix[:-1] - return mask[mask.argmin()] # faster than mask.min() + # 2. If the group's components are unique, no pair of adjacent values in + # the sorted indices array are equal. We therefore compute a boolean + # mask indicating equality of adjacent sorted indices: + mask = s_ix[1:] == s_ix[:-1] + # 3. The group is unique if all elements in the mask are False. We could + # return ``not np.any(mask)`` here but using the following is faster: + return not np.count_nonzero(mask) def center(self, weights, pbc=None, compound='group'): """Weighted center of (compounds of) the group - Computes the weighted center of atoms in the group. - Weighted centers per residue or per segment can be obtained by setting - the `compound` parameter accordingly. + Computes the weighted center of :class:`Atoms` in the group. + Weighted centers per :class:`Residue` or per :class:`Segment` can be + obtained by setting the `compound` parameter accordingly. Parameters ---------- @@ -644,39 +659,39 @@ def center(self, weights, pbc=None, compound='group'): Weights to be used. Setting `weights=None` is equivalent to passing identical weights for all atoms of the group. pbc : bool or None, optional - If ``True`` and `compound` is 'group', move all atoms to the primary - unit cell before calculation. If ``True`` and `compound` is - 'segments' or 'residues', the center of each compound will be - calculated without moving any atoms to keep the compounds intact. - Instead, the resulting position vectors will be moved to the primary - unit cell after calculation. + If ``True`` and `compound` is ``'group'``, move all atoms to the + primary unit cell before calculation. If ``True`` and `compound` is + ``'segments'`` or ``'residues'``, the center of each compound will + be calculated without moving any :class:`Atoms` to keep the + compounds intact. Instead, the resulting position vectors will be + moved to the primary unit cell after calculation. compound : {'group', 'segments', 'residues'}, optional - If 'group', the weighted center of all atoms in the group will be - returned as a single position vector. Else, the weighted centers of - each segment or residue will be returned as an array of position - vectors, i.e. a 2d array. Note that, in any case, *only* the - positions of atoms *belonging to the group* will be taken into - account. + If ``'group'``, the weighted center of all atoms in the group will + be returned as a single position vector. Else, the weighted centers + of each :class:`Segment` or :class:`Residue` will be returned as an + array of position vectors, i.e. a 2d array. Note that, in any case, + *only* the positions of :class:`Atoms` *belonging to the + group* will be taken into account. Returns ------- center : numpy.ndarray Position vector(s) of the weighted center(s) of the group. - If `compound` was set to 'group', the output will be a single + If `compound` was set to ``'group'``, the output will be a single position vector. - If `compound` was set to 'segments' or 'residues', the output will be - a 2d array of shape ``(n, 3)`` where ``n`` is the number of - compounds. + If `compound` was set to ``'segments'`` or ``'residues'``, the + output will be a 2d array of shape ``(n, 3)`` where ``n`` is the + number of compounds. Examples -------- - To find the center of charge of a given AtomGroup:: + To find the center of charge of a given :class:`AtomGroup`:: >>> sel = u.select_atoms('prop mass > 4.0') >>> sel.center(sel.charges) - To find the centers of mass per residue of all CA atoms:: + To find the centers of mass per residue of all CA :class:`Atoms`:: >>> sel = u.select_atoms('name CA') >>> sel.center(sel.masses, compound='residues') @@ -686,6 +701,7 @@ def center(self, weights, pbc=None, compound='group'): If the :class:`MDAnalysis.core.flags` flag *use_pbc* is set to ``True`` then the `pbc` keyword is used by default. + .. versionchanged:: 0.19.0 Added `compound` parameter """ @@ -743,36 +759,37 @@ def center(self, weights, pbc=None, compound='group'): def center_of_geometry(self, pbc=None, compound='group'): """Center of geometry (also known as centroid) of the group. - Computes the center of geometry (a.k.a. centroid) of atoms in the group. - Centers of geometry per residue or per segment can be obtained by - setting the `compound` parameter accordingly. + Computes the center of geometry (a.k.a. centroid) of + :class:`Atoms` in the group. Centers of geometry per + :class:`Residue` or per :class:`Segment` can be obtained by setting the + `compound` parameter accordingly. Parameters ---------- pbc : bool or None, optional - If ``True`` and `compound` is 'group', move all atoms to the primary - unit cell before calculation. If ``True`` and `compound` is - 'segments' or 'residues', the center of each compound will be - calculated without moving any atoms to keep the compounds intact. - Instead, the resulting position vectors will be moved to the primary - unit cell after calculation. + If ``True`` and `compound` is ``'group'``, move all atoms to the + primary unit cell before calculation. If ``True`` and `compound` is + ``'segments'`` or ``'residues'``, the center of each compound will + be calculated without moving any :class:`Atoms` to keep the + compounds intact. Instead, the resulting position vectors will be + moved to the primary unit cell after calculation. compound : {'group', 'segments', 'residues'}, optional - If 'group', the center of geometry of all atoms in the group will be - returned as a single position vector. Else, the centers of geometry - of each segment or residue will be returned as an array of position - vectors, i.e. a 2d array. Note that, in any case, *only* the - positions of atoms *belonging to the group* will be taken into - account. + If ``'group'``, the center of geometry of all :class:`Atoms` + in the group will be returned as a single position vector. Else, the + centers of geometry of each :class:`Segment` or :class:`Residue` + will be returned as an array of position vectors, i.e. a 2d array. + Note that, in any case, *only* the positions of :class:`Atoms` + *belonging to the group* will be taken into account. Returns ------- center : numpy.ndarray Position vector(s) of the geometric center(s) of the group. - If `compound` was set to 'group', the output will be a single + If `compound` was set to ``'group'``, the output will be a single position vector. - If `compound` was set to 'segments' or 'residues', the output will be - a 2d array of shape ``(n, 3)`` where ``n`` is the number of - compounds. + If `compound` was set to ``'segments'`` or ``'residues'``, the + output will be a 2d array of shape ``(n, 3)`` where ``n`` is the + number of compounds. Notes ----- @@ -798,14 +815,14 @@ def bbox(self, **kwargs): Parameters ---------- pbc : bool, optional - If ``True``, move all atoms within the primary unit cell before - calculation. [``False``] + If ``True``, move all :class:`Atoms` to the primary unit cell + before calculation. [``False``] Returns ------- - corners : array + corners : numpy.ndarray 2x3 array giving corners of bounding box as - [[xmin, ymin, zmin], [xmax, ymax, zmax]]. + ``[[xmin, ymin, zmin], [xmax, ymax, zmax]]``. Note ---- @@ -829,20 +846,21 @@ def bbox(self, **kwargs): def bsphere(self, **kwargs): """Return the bounding sphere of the selection. - The sphere is calculated relative to the centre of geometry. + The sphere is calculated relative to the + :meth:`center of geometry`. Parameters ---------- pbc : bool, optional - If ``True``, move all atoms within the primary unit cell before + If ``True``, move all atoms to the primary unit cell before calculation. [``False``] Returns ------- R : float - Radius of bounding sphere. - center : array - Coordinates of sphere center as ``[xcen,ycen,zcen]``. + Radius of the bounding sphere. + center : numpy.ndarray + Coordinates of the sphere center as ``[xcen, ycen, zcen]``. Note ---- @@ -870,11 +888,13 @@ def bsphere(self, **kwargs): def transform(self, M): r"""Apply homogenous transformation matrix `M` to the coordinates. + :class:`Atom` coordinates are rotated and translated in-place. + Parameters ---------- - M : array - 4x4 matrix, with the rotation in ``R = M[:3,:3]`` and the - translation in ``t = M[:3,3]``. + M : array_like + 4x4 matrix with the rotation in ``R = M[:3, :3]`` and the + translation in ``t = M[:3, 3]``. Returns ------- @@ -886,14 +906,15 @@ def transform(self, M): Notes ----- - The rotation :math:`\mathsf{R}` is applied before the translation - :math:`\mathbf{t}`: + The rotation :math:`\mathsf{R}` is about the origin and is applied + before the translation :math:`\mathbf{t}`: .. math:: \mathbf{x}' = \mathsf{R}\mathbf{x} + \mathbf{t} """ + M = np.asarray(M) R = M[:3, :3] t = M[:3, 3] return self.rotate(R, [0, 0, 0]).translate(t) @@ -901,7 +922,7 @@ def transform(self, M): def translate(self, t): r"""Apply translation vector `t` to the selection's coordinates. - Atom coordinates are translated in-place. + :class:`Atom` coordinates are translated in-place. Parameters ---------- @@ -942,22 +963,24 @@ def rotate(self, R, point=(0, 0, 0)): \mathbf{x}' = \mathsf{R}\mathbf{x} + :class:`Atom` coordinates are rotated in-place. + Parameters ---------- R : array_like - 3x3 rotation matrix to use for applying rotation. + 3x3 rotation matrix point : array_like, optional Center of rotation Returns ------- - self : AtomGroup + self Notes ----- - By default rotates around center of origin ``point=(0, 0, 0)``. To - rotate around center of geometry of the atomgroup use ``ag.rotate(R, - point=ag.centroid)``. + By default, rotates about the origin ``point=(0, 0, 0)``. To rotate + a group ``g`` around its center of geometry, use + ``g.rotate(R, point=g.center_of_geometry())``. See Also -------- @@ -969,13 +992,15 @@ def rotate(self, R, point=(0, 0, 0)): point = np.asarray(point) # changes the coordinates (in place) - if not np.allclose(point, np.zeros(3)): - self.translate(-point) - x = self.atoms.unique.universe.trajectory.ts.positions - idx = self.atoms.unique.indices + atomgroup = self.atoms.unique + require_translation = bool(np.count_nonzero(point)) + if require_translation: + atomgroup.translate(-point) + x = atomgroup.universe.trajectory.ts.positions + idx = atomgroup.indices x[idx] = np.dot(x[idx], R.T) - if not np.allclose(point, np.zeros(3)): - self.translate(point) + if require_translation: + atomgroup.translate(point) return self @@ -994,7 +1019,7 @@ def rotateby(self, angle, axis, point=None): Returns ------- - self : AtomGroup + self Notes ----- @@ -1010,17 +1035,21 @@ def rotateby(self, angle, axis, point=None): See Also -------- - MDAnalysis.lib.transformations.rotation_matrix : calculate :math:`\mathsf{R}` + MDAnalysis.lib.transformations.rotation_matrix : + calculate :math:`\mathsf{R}` """ alpha = np.radians(angle) axis = np.asarray(axis) - point = np.asarray(point) if point is not None else self.centroid() + if point is None: + point = self.center_of_geometry() + point = np.asarray(point) M = transformations.rotation_matrix(alpha, axis, point=point) return self.transform(M) def pack_into_box(self, box=None, inplace=True): - r"""Shift all atoms in this group to be within the primary unit cell. + r"""Shift all :class:`Atoms` in this group to the primary unit + cell. Parameters ---------- @@ -1035,7 +1064,7 @@ def pack_into_box(self, box=None, inplace=True): Returns ------- - coords : array + coords : numpy.ndarray Shifted atom coordinates. Notes @@ -1051,14 +1080,18 @@ def pack_into_box(self, box=None, inplace=True): The default is to take unit cell information from the underlying :class:`~MDAnalysis.coordinates.base.Timestep` instance. The optional argument `box` can be used to provide alternative unit cell information - (in the MDAnalysis standard format ``[Lx, Ly, Lz, alpha, beta, - gamma]``). + (in the MDAnalysis standard format + ``[Lx, Ly, Lz, alpha, beta, gamma]``). Works with either orthogonal or triclinic box types. + .. note:: + :meth:`AtomGroup.pack_into_box` is currently faster than + :meth:`ResidueGroup.pack_into_box` or + :meth:`SegmentGroup.pack_into_box`. - .. versionadded:: 0.8 + .. versionadded:: 0.8 """ # Try and auto detect box dimensions: if box is None: @@ -1092,10 +1125,10 @@ def pack_into_box(self, box=None, inplace=True): return packed_coords[restore_mask] def wrap(self, compound="atoms", center="com", box=None): - """Shift the contents of this Group back into the unit cell. + """Shift the contents of this group back into the unit cell. This is a more powerful version of :meth:`pack_into_box`, allowing - groups of atoms to be kept together through the process. + groups of :class:`Atoms` to be kept together through the process. Parameters ---------- @@ -1103,7 +1136,7 @@ def wrap(self, compound="atoms", center="com", box=None): The group which will be kept together through the shifting process. center : {'com', 'cog'} How to define the center of a given group of atoms. - box : array + box : array_like Box dimensions, can be either orthogonal or triclinic information. Cell dimensions must be in an identical to format to those returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`, @@ -1115,19 +1148,21 @@ def wrap(self, compound="atoms", center="com", box=None): When specifying a `compound`, the translation is calculated based on each compound. The same translation is applied to all atoms within this compound, meaning it will not be broken by the shift. - This might however mean that all atoms from the compound are not + This might however mean that not all atoms from the compound are inside the unit cell, but rather the center of the compound is. `center` allows the definition of the center of each group to be - specified. This can be either 'com' for center of mass, or 'cog' for - center of geometry. + specified. This can be either ``'com'`` for center of mass, or ``'cog'`` + for center of geometry. `box` allows a unit cell to be given for the transformation. If not - specified, the dimensions information from the current Timestep will - be used. + specified, the :attr:`~MDAnalysis.coordinates.base.Timestep.dimensions` + information from the current + :class:`~MDAnalysis.coordinates.base.Timestep` will be used. .. note:: - wrap with all default keywords is identical to :meth:`pack_into_box` + :meth:`wrap` with all default keywords is identical to + :meth:`pack_into_box` .. versionadded:: 0.9.2 @@ -1177,7 +1212,7 @@ def groupby(self, topattrs): Parameters ---------- topattrs: str or list - One or more topology attribute to group components by. + One or more topology attributes to group components by. Single arguments are passed as a string. Multiple arguments are passed as a list. @@ -1209,6 +1244,7 @@ def groupby(self, topattrs): >>> ag.groupby(['resnames', 'masses'])('ALA', 15.999) + .. versionadded:: 0.16.0 .. versionchanged:: 0.18.0 The function accepts multiple attributes """ @@ -1265,6 +1301,7 @@ def concatenate(self, other): >>> ag3[-3:].names array(['N', 'N', 'N'], dtype=object) + .. versionadded:: 0.16.0 """ o_ix = other.ix_array @@ -1304,6 +1341,7 @@ def union(self, other): -------- concatenate, intersection + .. versionadded:: 0.16 """ o_ix = other.ix_array @@ -1342,6 +1380,7 @@ def intersection(self, other): -------- union + .. versionadded:: 0.16 """ o_ix = other.ix_array @@ -1382,6 +1421,7 @@ def subtract(self, other): -------- concatenate, difference + .. versionadded:: 0.16 """ o_ix = other.ix_array @@ -1411,6 +1451,7 @@ def difference(self, other): -------- subtract, symmetric_difference + .. versionadded:: 0.16 """ o_ix = other.ix_array @@ -1447,6 +1488,7 @@ def symmetric_difference(self, other): -------- difference + .. versionadded:: 0.16 """ o_ix = other.ix_array @@ -1462,8 +1504,9 @@ def isdisjoint(self, other): Returns ------- - Bool - True if the two Groups do not have common elements + bool + ``True`` if the two Groups do not have common elements + .. versionadded:: 0.16 """ @@ -1482,8 +1525,9 @@ def issubset(self, other): Returns ------- - Bool - True if this Group is a subset of the other one + bool + ``True`` if this Group is a subset of the other one + .. versionadded:: 0.16 """ @@ -1501,8 +1545,9 @@ def is_strict_subset(self, other): Returns ------- - Bool - True if this Group is a strict subset of the other one + bool + ``True`` if this Group is a strict subset of the other one + .. versionadded:: 0.16 """ @@ -1519,8 +1564,9 @@ def issuperset(self, other): Returns ------- - Bool - True if this Group is a subset of the other one + bool + ``True`` if this Group is a subset of the other one + .. versionadded:: 0.16 """ @@ -1538,8 +1584,9 @@ def is_strict_superset(self, other): Returns ------- - Bool - True if this Group is a strict superset of the other one + bool + ``True`` if this Group is a strict superset of the other one + .. versionadded:: 0.16 """ @@ -1549,17 +1596,19 @@ def is_strict_superset(self, other): class AtomGroup(GroupBase): """An ordered array of atoms. - Can be initiated from an iterable of :class:`Atom`s:: + Can be initiated from an iterable of :class:`Atoms`:: ag = AtomGroup([Atom1, Atom2, Atom3]) - Or from providing a list of indices and the Universe it should belong to:: + Or from providing a list of indices and the + :class:`~MDAnalysis.core.universe.Universe` it should belong to:: ag = AtomGroup([72, 14, 25], u) Alternatively, an :class:`AtomGroup` is generated by indexing/slicing - another :class:`AtomGroup`, such as the group of all atoms in the - :class:`Universe` at :attr:`MDAnalysis.core.universe.Universe.atoms`. + another :class:`AtomGroup`, such as the group of all :class:`Atoms` in + the :class:`~MDAnalysis.core.universe.Universe` at + :attr:`MDAnalysis.core.universe.Universe.atoms`. An :class:`AtomGroup` can be indexed and sliced like a list:: @@ -1579,43 +1628,44 @@ class AtomGroup(GroupBase): aslice = [0, 3, -1, 10, 3] ag[aslice] - will return a new :class:`AtomGroup` of atoms with those indices in the old - :class:`AtomGroup`. + will return a new :class:`AtomGroup` of :class:`Atoms` with those + indices in the old :class:`AtomGroup`. - Finally, :class:`AtomGroup`s can be created from a selection. See - :meth:`select_atoms`. + Finally, :class:`AtomGroups` can be created from a selection. + See :meth:`select_atoms`. .. note:: - :class:`AtomGroup`s originating from a selection are sorted and - duplicate elements are removed. This is not true for :class:`AtomGroup`s - produced by slicing. Thus, slicing can be used when the order of - atoms is crucial (for instance, in order to define angles or - dihedrals). + :class:`AtomGroups` originating from a selection are sorted + and duplicate elements are removed. This is not true for + :class:`AtomGroups` produced by slicing. Thus, slicing can be + used when the order of atoms is crucial (for instance, in order to + define angles or dihedrals). - :class:`AtomGroup`s can be compared and combined using group operators. For - instance, :class:`AtomGroup`s can be concatenated using `+` or - :meth:`concatenate`:: + :class:`AtomGroups` can be compared and combined using group + operators. For instance, :class:`AtomGroups` can be concatenated using `+` + or :meth:`concatenate`:: ag_concat = ag1 + ag2 # or ag_concat = ag1.concatenate(ag2) - When groups are concatenated, the order of the atoms is conserved. If atoms - appear several times in one of the groups, the duplicates are kept in the - resulting group. On the contrary to :meth:`concatenate`, :meth:`union` - treats the :class:`AtomGroup`s as sets, duplicates are removed from the - resulting group, and atoms are ordered. The `|` operator is synomymous to + When groups are concatenated, the order of the :class:`Atoms` is + conserved. If :class:`Atoms` appear several times in one of the + groups, the duplicates are kept in the resulting group. On the contrary to + :meth:`concatenate`, :meth:`union` treats the :class:`AtomGroups` + as sets so that duplicates are removed from the resulting group, and + :class:`Atoms` are ordered. The `|` operator is synomymous to :meth:`union`:: ag_union = ag1 | ag2 # or ag_union = ag1.union(ag2) The opposite operation to :meth:`concatenate` is :meth:`subtract`. This - method creates a new group with all the atoms of the group that are not in - a given other group; the order of the atoms is kept, and so are duplicates. - :meth:`difference` is the set version of :meth:`subtract`. The resulting - group is sorted and deduplicated. + method creates a new group with all the :class:`Atoms` of the group + that are not in a given other group; the order of the :class:`Atoms` + is kept, and so are duplicates. :meth:`difference` is the set version of + :meth:`subtract`. The resulting group is sorted and deduplicated. All set methods are listed in the table below. These methods treat the - groups as sorted and deduplicated sets of atoms. + groups as sorted and deduplicated sets of :class:`Atoms`. +-------------------------------+------------+----------------------------+ | Operation | Equivalent | Result | @@ -1673,33 +1723,33 @@ class AtomGroup(GroupBase): | | | in ``t`` | +-------------------------------+------------+----------------------------+ - The `in` operator allows to test if an :class:`Atom` is in the AtomGroup. + The `in` operator allows to test if an :class:`Atom` is in the + :class:`AtomGroup`. :class:`AtomGroup` instances are always bound to a :class:`MDAnalysis.core.universe.Universe`. They cannot exist in isolation. - .. rubric:: Deprecated functionality *Instant selectors* will be removed in the 1.0 release. See issue `#1377 `_ for more details. - Atoms can also be accessed in a Pythonic fashion by using the atom name as - an attribute. For instance, :: + :class:`Atoms` can also be accessed in a Pythonic fashion by using the + :class:`Atom` name as an attribute. For instance, :: ag.CA - will provide a :class:`AtomGroup` of all CA atoms in the + will provide a :class:`AtomGroup` of all CA :class:`Atoms` in the group. These *instant selector* attributes are auto-generated for each atom name encountered in the group. Notes ----- - The name-attribute instant selector access to atoms is mainly - meant for quick interactive work. Thus it either returns a - single :class:`Atom` if there is only one matching atom, *or* a - new :class:`AtomGroup` for multiple matches. This makes it - difficult to use the feature consistently in scripts. + The name-attribute instant selector access to :class:`Atoms` is mainly + meant for quick interactive work. Thus it either returns a single + :class:`Atom` if there is only one matching :class:`Atom`, *or* a + new :class:`AtomGroup` for multiple matches. This makes it difficult to use + the feature consistently in scripts. See Also @@ -1762,8 +1812,8 @@ def n_atoms(self): @property def residues(self): - """Get sorted :class:`ResidueGroup` of the unique residues - present in the AtomGroup. + """A sorted :class:`ResidueGroup` of the unique + :class:`Residues` present in the :class:`AtomGroup`. """ return self.universe.residues[np.unique(self.resindices)] @@ -1796,7 +1846,8 @@ def residues(self, new): @property def n_residues(self): - """Number of unique residues represented in the AtomGroup. + """Number of unique :class:`Residues` present in the + :class:`AtomGroup`. Equivalent to ``len(self.residues)``. @@ -1805,8 +1856,8 @@ def n_residues(self): @property def segments(self): - """Get sorted :class:`SegmentGroup` of the (unique) segments - present in the :class:`AtomGroup`. + """A sorted :class:`SegmentGroup` of the unique segments present in the + :class:`AtomGroup`. """ return self.universe.segments[np.unique(self.segindices)] @@ -1817,7 +1868,7 @@ def segments(self, new): @property def n_segments(self): - """Number of unique segments represented in the AtomGroup. + """Number of unique segments present in the :class:`AtomGroup`. Equivalent to ``len(self.segments)``. """ @@ -1834,12 +1885,14 @@ def _unique_restore_mask(self): # then be replaced by the __getattr__() error message. To prevent the # message from being overridden, we raise a RuntimeError instead. if self.isunique: - raise RuntimeError("{cls}._unique_restore_mask is not available " - "if the {cls} is unique." - "".format(cls=self.__class__.__name__)) - raise RuntimeError("{cls}._unique_restore_mask is only available " - "after accessing {cls}.unique." - "".format(cls=self.__class__.__name__)) + msg = ("{cls}._unique_restore_mask is not available if the {cls} " + "is unique. ".format(self.__class__.__name__)) + else: + msg = ("{cls}._unique_restore_mask is only available after " + "accessing {cls}.unique. ".format(self.__class__.__name__)) + msg += ("If you see this error message in an unmodified release " + "version of MDAnalysis, this is almost certainly a bug!") + raise RuntimeError(msg) @_unique_restore_mask.setter def _unique_restore_mask(self, mask): @@ -1848,7 +1901,10 @@ def _unique_restore_mask(self, mask): @property @cached('unique') def unique(self): - """Return an :class:`AtomGroup` containing sorted and unique atoms only. + """An :class:`AtomGroup` containing sorted and unique + :class:`Atoms` only. + + If the :class:`AtomGroup` is unique, this is the group itself. Examples -------- @@ -1863,6 +1919,9 @@ def unique(self): >>> ag2.ix array([0, 1, 2]) + >>> ag2.unique is ag2 + True + .. versionadded:: 0.16.0 """ @@ -1879,20 +1938,34 @@ def unique(self): @property def positions(self): - """Coordinates of the atoms in the AtomGroup. + """Coordinates of the :class:`Atoms` in the :class:`AtomGroup`. + + A :class:`numpy.ndarray` with + :attr:`~numpy.ndarray.shape`\ ``=(``\ :attr:`~AtomGroup.n_atoms`\ ``, 3)`` + and :attr:`~numpy.ndarray.dtype`\ ``=numpy.float32``. The positions can be changed by assigning an array of the appropriate - shape, i.e. either Nx3 to assign individual coordinates or 3, to assign - the *same* coordinate to all atoms (e.g. ``ag.positions = - array([0,0,0])`` will move all particles to the origin). - - .. note:: Changing the position is not reflected in any files; - reading any frame from the trajectory will replace - the change with that from the file *except* if the - trajectory is held in memory, e.g., when the - :class:`~MDAnalysis.core.universe.Universe.transfer_to_memory` + shape, i.e., either ``(``\ :attr:`~AtomGroup.n_atoms`\ ``, 3)`` to + assign individual coordinates, or ``(3,)`` to assign the *same* + coordinate to all :class:`Atoms` (e.g., + ``ag.positions = array([0,0,0])`` will move all :class:`Atoms` + to the origin). + + .. note:: Changing positions is not reflected in any files; reading any + frame from the + :attr:`~MDAnalysis.core.universe.Universe.trajectory` will + replace the change with that from the file *except* if the + :attr:`~MDAnalysis.core.universe.Universe.trajectory` is held + in memory, e.g., when the + :meth:`~MDAnalysis.core.universe.Universe.transfer_to_memory` method was used. + Raises + ------ + ~MDAnalysis.exceptions.NoDataError + If the underlying :class:`~MDAnalysis.coordinates.base.Timestep` + does not contain + :attr:`~MDAnalysis.coordinates.base.Timestep.positions`. """ return self.universe.trajectory.ts.positions[self.ix] @@ -1903,17 +1976,24 @@ def positions(self, values): @property def velocities(self): - """Velocities of the atoms in the AtomGroup. + """Velocities of the :class:`Atoms` in the :class:`AtomGroup`. - The velocities can be changed by assigning an array of the appropriate - shape, i.e. either Nx3 to assign individual velocities or 3 to assign - the *same* velocity to all atoms (e.g. ``ag.velocity = array([0,0,0])`` - will give all particles zero velocity). + A :class:`numpy.ndarray` with + :attr:`~numpy.ndarray.shape`\ ``=(``\ :attr:`~AtomGroup.n_atoms`\ ``, 3)`` + and :attr:`~numpy.ndarray.dtype`\ ``=numpy.float32``. - Raises a :exc:`NoDataError` if the underlying - :class:`~MDAnalysis.coordinates.base.Timestep` does not contain - :attr:`~MDAnalysis.coordinates.base.Timestep.velocities`. + The velocities can be changed by assigning an array of the appropriate + shape, i.e. either ``(``\ :attr:`~AtomGroup.n_atoms`\ ``, 3)`` to assign + individual velocities or ``(3,)`` to assign the *same* velocity to all + :class:`Atoms` (e.g. ``ag.velocities = array([0,0,0])`` will give + all :class:`Atoms` zero :attr:`~Atom.velocity`). + Raises + ------ + ~MDAnalysis.exceptions.NoDataError + If the underlying :class:`~MDAnalysis.coordinates.base.Timestep` + does not contain + :attr:`~MDAnalysis.coordinates.base.Timestep.velocities`. """ ts = self.universe.trajectory.ts try: @@ -1931,13 +2011,23 @@ def velocities(self, values): @property def forces(self): - """Forces on each atom in the AtomGroup. + """Forces on each :class:`Atom` in the :class:`AtomGroup`. - The velocities can be changed by assigning an array of the appropriate - shape, i.e. either Nx3 to assign individual velocities or 3 to assign - the *same* velocity to all atoms (e.g. ``ag.velocity = array([0,0,0])`` - will give all particles zero velocity). + A :class:`numpy.ndarray` with + :attr:`~numpy.ndarray.shape`\ ``=(``\ :attr:`~AtomGroup.n_atoms`\ ``, 3)`` + and :attr:`~numpy.ndarray.dtype`\ ``=numpy.float32``. + + The forces can be changed by assigning an array of the appropriate + shape, i.e. either ``(``\ :attr:`~AtomGroup.n_atoms`\ ``, 3)`` to assign + individual forces or ``(3,)`` to assign the *same* force to all + :class:`Atoms` (e.g. ``ag.forces = array([0,0,0])`` will give all + :class:`Atoms` a zero :attr:`~Atom.force`). + Raises + ------ + ~MDAnalysis.exceptions.NoDataError + If the :class:`~MDAnalysis.coordinates.base.Timestep` does not + contain :attr:`~MDAnalysis.coordinates.base.Timestep.forces`. """ ts = self.universe.trajectory.ts try: @@ -1962,8 +2052,8 @@ def ts(self): If :attr:`~AtomGroup.ts` is modified then these modifications will be present until the frame number changes (which - typically happens when the underlying trajectory frame - changes). + typically happens when the underlying + :attr:`~MDAnalysis.core.universe.Universe.trajectory` frame changes). It is not possible to assign a new :class:`~MDAnalysis.coordinates.base.Timestep` to the @@ -1976,17 +2066,17 @@ def ts(self): # As with universe.select_atoms, needing to fish out specific kwargs # (namely, 'updating') doesn't allow a very clean signature. def select_atoms(self, sel, *othersel, **selgroups): - """Select atoms using a selection string. + """Select :class:`Atoms` using a selection string. - Returns an :class:`AtomGroup` with atoms sorted according to - their index in the topology (this is to ensure that there - are not any duplicates, which can happen with complicated - selections). + Returns an :class:`AtomGroup` with :class:`Atoms` sorted according + to their index in the topology (this is to ensure that there are no + duplicates, which can happen with complicated selections). Raises ------ - `TypeError` if the arbitrary atomgroups passed are not of type - `MDAnalysis.core.groups.AtomGroup` + TypeError + If the arbitrary groups passed are not of type + :class:`MDAnalysis.core.groups.AtomGroup` Examples -------- @@ -2159,8 +2249,9 @@ def select_atoms(self, sel, *othersel, **selgroups): selects all atoms within a range of (1-based) inclusive indices, e.g. ``bynum 1`` selects the first atom in the universe; ``bynum 5:10`` selects atoms 5 through 10 inclusive. All atoms - in the :class:`MDAnalysis.Universe` are consecutively numbered, - and the index runs from 1 up to the total number of atoms. + in the :class:`~MDAnalysis.core.universe.Universe` are + consecutively numbered, and the index runs from 1 up to the + total number of atoms. **Preexisting selections** @@ -2174,7 +2265,7 @@ def select_atoms(self, sel, *othersel, **selgroups): included in the parsing just by comparison of atom indices. This means that it is up to the user to make sure the `group-name` group was defined in an appropriate - :class:`Universe`. + :class:`~MDAnalysis.core.universe.Universe`. global *selection* by default, when issuing @@ -2189,7 +2280,8 @@ def select_atoms(self, sel, *othersel, **selgroups): ``global`` absent, the result would be an empty selection since the ``protein`` subselection would itself be empty. When issuing :meth:`~MDAnalysis.core.groups.AtomGroup.select_atoms` from a - :class:`~MDAnalysis.core.universe.Universe`, ``global`` is ignored. + :class:`~MDAnalysis.core.universe.Universe`, ``global`` is + ignored. **Dynamic selections** If :meth:`~MDAnalysis.core.groups.AtomGroup.select_atoms` is @@ -2210,23 +2302,17 @@ def select_atoms(self, sel, *othersel, **selgroups): longer update across frames. - .. versionchanged:: 0.7.4 - Added *resnum* selection. - .. versionchanged:: 0.8.1 - Added *group* and *fullgroup* selections. - .. deprecated:: 0.11 - The use of ``fullgroup`` has been deprecated in favor of the equivalent - ``global group``. - .. versionchanged:: 0.13.0 - Added *bonded* selection - .. versionchanged:: 0.16.0 - Resid selection now takes icodes into account where present. - .. versionchanged:: 0.16.0 - Updating selections now possible by setting the ``updating`` argument. - .. versionchanged:: 0.17.0 - Added *moltype* and *molnum* selections. - .. versionchanged:: 0.18.1 - Added strict type checking for passed groups + .. versionchanged:: 0.7.4 Added *resnum* selection. + .. versionchanged:: 0.8.1 Added *group* and *fullgroup* selections. + .. deprecated:: 0.11 The use of *fullgroup* has been deprecated in favor + of the equivalent *global group* selections. + .. versionchanged:: 0.13.0 Added *bonded* selection. + .. versionchanged:: 0.16.0 Resid selection now takes icodes into account + where present. + .. versionchanged:: 0.16.0 Updating selections now possible by setting + the `updating` argument. + .. versionchanged:: 0.17.0 Added *moltype* and *molnum* selections. + .. versionchanged:: 0.18.1 Added strict type checking for passed groups. """ updating = selgroups.pop('updating', False) sel_strs = (sel,) + othersel @@ -2248,7 +2334,8 @@ def select_atoms(self, sel, *othersel, **selgroups): return atomgrp def split(self, level): - """Split AtomGroup into a list of atomgroups by `level`. + """Split :class:`AtomGroup` into a :class:`list` of + :class:`AtomGroups` by `level`. Parameters ---------- @@ -2256,8 +2343,7 @@ def split(self, level): .. versionadded:: 0.9.0 - .. versionchanged:: 0.17.0 - Added the 'molecule' level. + .. versionchanged:: 0.17.0 Added the 'molecule' level. """ accessors = {'segment': 'segindices', 'residue': 'resindices', @@ -2282,12 +2368,13 @@ def split(self, level): np.unique(levelindices)] def guess_bonds(self, vdwradii=None): - """Guess bonds that exist within this AtomGroup and add to Universe + """Guess bonds that exist within this :class:`AtomGroup` and add them to + the underlying :attr:`~AtomGroup.universe`. Parameters ---------- vdwradii : dict, optional - Dict relating atom type: vdw radii + Dict relating atom types: vdw radii See Also @@ -2324,15 +2411,13 @@ def get_TopAttr(u, name, cls): @property def bond(self): - """This AtomGroup represented as a Bond object - - Returns - ------- - A :class:`MDAnalysis.core.topologyobjects.Bond` object + """This :class:`AtomGroup` represented as a + :class:`MDAnalysis.core.topologyobjects.Bond` object Raises ------ - `ValueError` if the AtomGroup is not length 2 + ValueError + If the :class:`AtomGroup` is not length 2 .. versionadded:: 0.11.0 @@ -2344,15 +2429,13 @@ def bond(self): @property def angle(self): - """This AtomGroup represented as an Angle object - - Returns - ------- - A :class:`MDAnalysis.core.topologyobjects.Angle` object + """This :class:`AtomGroup` represented as an + :class:`MDAnalysis.core.topologyobjects.Angle` object Raises ------ - `ValueError` if the AtomGroup is not length 3 + ValueError + If the :class:`AtomGroup` is not length 3 .. versionadded:: 0.11.0 @@ -2364,15 +2447,13 @@ def angle(self): @property def dihedral(self): - """This AtomGroup represented as a Dihedral object - - Returns - ------- - A :class:`MDAnalysis.core.topologyobjects.Dihedral` object + """This :class:`AtomGroup` represented as a + :class:`~MDAnalysis.core.topologyobjects.Dihedral` object Raises ------ - `ValueError` if the AtomGroup is not length 4 + ValueError + If the :class:`AtomGroup` is not length 4 .. versionadded:: 0.11.0 @@ -2384,15 +2465,13 @@ def dihedral(self): @property def improper(self): - """This AtomGroup represented as an ImproperDihedral object - - Returns - ------- - A :class:`MDAnalysis.core.topologyobjects.ImproperDihedral` object + """This :class:`AtomGroup` represented as an + :class:`MDAnalysis.core.topologyobjects.ImproperDihedral` object Raises ------ - `ValueError` if the AtomGroup is not length 4 + ValueError + If the :class:`AtomGroup` is not length 4 .. versionadded:: 0.11.0 @@ -2429,9 +2508,8 @@ def write(self, filename=None, file_format="PDB", Default os ``"conect"``. - .. versionchanged:: 0.9.0 - Merged with write_selection. This method can now write both - selections out. + .. versionchanged:: 0.9.0 Merged with write_selection. This method can + now write both selections out. """ # check that AtomGroup actually has any atoms (Issue #434) if len(self.atoms) == 0: @@ -2485,11 +2563,11 @@ def write(self, filename=None, file_format="PDB", class ResidueGroup(GroupBase): """ResidueGroup base class. - This class is used by a :class:`Universe` for generating its - Topology-specific :class:`ResidueGroup` class. All the - :class:`TopologyAttr` components are obtained from - :class:`GroupBase`, so this class only includes ad-hoc methods - specific to ResidueGroups. + This class is used by a :class:`~MDAnalysis.core.universe.Universe` for + generating its Topology-specific :class:`ResidueGroup` class. All the + :class:`~MDAnalysis.core.topologyattrs.TopologyAttr` components are obtained + from :class:`GroupBase`, so this class only includes ad-hoc methods + specific to :class:`ResidueGroups`. ResidueGroups can be compared and combined using group operators. See the list of these operators on :class:`GroupBase`. @@ -2502,18 +2580,18 @@ class ResidueGroup(GroupBase): @property def atoms(self): - """Get an :class:`AtomGroup` of atoms represented in this + """A :class:`AtomGroup` of :class:`Atoms` presented in this :class:`ResidueGroup`. - The atoms are ordered locally by residue in the - :class:`ResidueGroup`. No duplicates are removed. + The :class:`Atoms` are ordered locally by :class:`Residue` in the + :class:`ResidueGroup`. Duplicates are *not* removed. """ return self.universe.atoms[np.concatenate(self.indices)] @property def n_atoms(self): - """Number of atoms represented in :class:`ResidueGroup`, including - duplicate residues. + """Number of :class:`Atoms` present in this :class:`ResidueGroup`, + including duplicate residues (and thus, duplicate atoms). Equivalent to ``len(self.atoms)``. """ @@ -2578,8 +2656,10 @@ def n_segments(self): @property @cached('unique') def unique(self): - """Return a :class:`ResidueGroup` containing sorted and unique residues - only. + """Return a :class:`ResidueGroup` containing sorted and unique + :class:`Residues` only. + + If the :class:`ResidueGroup` is unique, this is the group itself. Examples -------- @@ -2594,6 +2674,9 @@ def unique(self): >>> rg2.ix array([0, 1, 2]) + >>> rg2.unique is rg2 + True + .. versionadded:: 0.16.0 """ @@ -2608,15 +2691,16 @@ def unique(self): class SegmentGroup(GroupBase): - """SegmentGroup base class. + """:class:`SegmentGroup` base class. - This class is used by a Universe for generating its Topology-specific - SegmentGroup class. All the TopologyAttr components are obtained from - GroupBase, so this class only includes ad-hoc methods specific to - SegmentGroups. + This class is used by a :class:`~MDAnalysis.core.universe.Universe` for + generating its Topology-specific :class:`SegmentGroup` class. All the + :class:`~MDAnalysis.core.topologyattrs.TopologyAttr` components are obtained + from :class:`GroupBase`, so this class only includes ad-hoc methods specific + to :class:`SegmentGroups`. - SegmentGroups can be compared and combined using group operators. See the - list of these operators on :class:`GroupBase`. + :class:`SegmentGroups` can be compared and combined using + group operators. See the list of these operators on :class:`GroupBase`. .. deprecated:: 0.16.2 *Instant selectors* of Segments will be removed in the 1.0 release. @@ -2626,11 +2710,12 @@ class SegmentGroup(GroupBase): @property def atoms(self): - """Get an :class:`AtomGroup` of atoms present in this + """An :class:`AtomGroup` of :class:`Atoms` present in this :class:`SegmentGroup`. - The atoms are ordered locally by residue, which are further ordered by - segment in the :class:`SegmentGroup`. Duplicate atoms are *not* removed. + The :class:`Atoms` are ordered locally by :class:`Residue`, which + are further ordered by :class:`Segment` in the :class:`SegmentGroup`. + Duplicates are *not* removed. """ return self.universe.atoms[np.concatenate(self.indices)] @@ -2645,11 +2730,12 @@ def n_atoms(self): @property def residues(self): - """Get a :class:`ResidueGroup` of residues present in this + """A :class:`ResidueGroup` of :class:`Residues` present in this :class:`SegmentGroup`. - The residues are ordered locally by segment in the - :class:`SegmentGroup`. Duplicates are *not* removed. + The :class:`Residues` are ordered locally by + :class:`Segment` in the :class:`SegmentGroup`. Duplicates are *not* + removed. """ return self.universe.residues[np.concatenate(self.resindices)] @@ -2679,8 +2765,10 @@ def n_segments(self): @property @cached('unique') def unique(self): - """Return a :class:`SegmentGroup` containing sorted and unique segments - only. + """Return a :class:`SegmentGroup` containing sorted and unique + :class:`Segments` only. + + If the :class:`SegmentGroup` is unique, this is the group itself. Examples -------- @@ -2695,6 +2783,9 @@ def unique(self): >>> sg2.ix array([0, 1, 2]) + >>> sg2.unique is sg2 + True + .. versionadded:: 0.16.0 """ @@ -2710,7 +2801,8 @@ def unique(self): @functools.total_ordering class ComponentBase(_MutableBase): - """Base class from which a Universe's Component class is built. + """Base class from which a :class:`~MDAnalysis.core.universe.Universe`\ 's + Component class is built. Components are the individual objects that are found in Groups. """ @@ -2784,9 +2876,10 @@ def universe(self): def ix(self): """Unique index of this component. - If this component is an :class:`Atom`, this is the index of the atom. - If it is a :class:`Residue`, this is the index of the residue. - If it is a :class:`Segment`, this is the index of the segment. + If this component is an :class:`Atom`, this is the index of the + :class:`Atom`. + If it is a :class:`Residue`, this is the index of the :class:`Residue`. + If it is a :class:`Segment`, this is the index of the :class:`Segment`. """ return self._ix @@ -2804,11 +2897,13 @@ def ix_array(self): class Atom(ComponentBase): - """Atom base class. + """:class:`Atom` base class. - This class is used by a Universe for generating its Topology-specific - :class:`Atom` class. All the TopologyAttr components are obtained from - ComponentBase, so this class only includes ad-hoc methods specific to atoms. + This class is used by a :class:`~MDAnalysis.core.universe.Universe` for + generating its Topology-specific :class:`Atom` class. All the + :class:`~MDAnalysis.core.topologyattrs.TopologyAttr` components are obtained + from :class:`ComponentBase`, so this class only includes ad-hoc methods + specific to :class:`Atoms`. """ def __getattr__(self, attr): """Try and catch known attributes and give better error message""" @@ -2863,6 +2958,13 @@ def position(self): .. note:: changing the position is not reflected in any files; reading any frame from the trajectory will replace the change with that from the file + + Raises + ------ + ~MDAnalysis.exceptions.NoDataError + If the underlying :class:`~MDAnalysis.coordinates.base.Timestep` + does not contain + :attr:`~MDAnalysis.coordinates.base.Timestep.positions`. """ return self.universe.trajectory.ts.positions[self.ix].copy() @@ -2874,14 +2976,18 @@ def position(self, values): def velocity(self): """Velocity of the atom. - The velocity can be changed by assigning an array of shape (3,). + The velocity can be changed by assigning an array of shape ``(3,)``. .. note:: changing the velocity is not reflected in any files; reading any frame from the trajectory will replace the change with that from the file - A :exc:`~MDAnalysis.NoDataError` is raised if the trajectory - does not contain velocities. + Raises + ------ + ~MDAnalysis.exceptions.NoDataError + If the underlying :class:`~MDAnalysis.coordinates.base.Timestep` + does not contain + :attr:`~MDAnalysis.coordinates.base.Timestep.velocities`. """ ts = self.universe.trajectory.ts try: @@ -2901,14 +3007,18 @@ def velocity(self, values): def force(self): """Force on the atom. - The force can be changed by assigning an array of shape (3,). + The force can be changed by assigning an array of shape ``(3,)``. .. note:: changing the force is not reflected in any files; reading any frame from the trajectory will replace the change with that from the file - A :exc:`~MDAnalysis.NoDataError` is raised if the trajectory - does not contain forces. + Raises + ------ + ~MDAnalysis.exceptions.NoDataError + If the underlying :class:`~MDAnalysis.coordinates.base.Timestep` + does not contain + :attr:`~MDAnalysis.coordinates.base.Timestep.forces`. """ ts = self.universe.trajectory.ts try: @@ -2926,12 +3036,13 @@ def force(self, values): class Residue(ComponentBase): - """Residue base class. + """:class:`Residue` base class. - This class is used by a Universe for generating its Topology-specific - Residue class. All the TopologyAttr components are obtained from - ComponentBase, so this class only includes ad-hoc methods specific to - residues. + This class is used by a :class:`~MDAnalysis.core.universe.Universe` for + generating its Topology-specific :class:`Residue` class. All the + :class:`~MDAnalysis.core.topologyattrs.TopologyAttr` components are obtained + from :class:`ComponentBase`, so this class only includes ad-hoc methods + specific to :class:`Residues`. """ def __repr__(self): me = '`. .. deprecated:: 0.16.2 - *Instant selectors* of Segments will be removed in the 1.0 release. - See :ref:`Instant selectors ` for details and - alternatives. + *Instant selectors* of :class:`Segments` will be removed in the + 1.0 release. See :ref:`Instant selectors ` for + details and alternatives. """ def __repr__(self): me = ' Date: Tue, 5 Jun 2018 03:15:49 +0200 Subject: [PATCH 073/455] fixed error message in AtomGroup._unique_restore_mask --- package/MDAnalysis/core/groups.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 7a34d80b740..fca36d87273 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -1885,11 +1885,11 @@ def _unique_restore_mask(self): # then be replaced by the __getattr__() error message. To prevent the # message from being overridden, we raise a RuntimeError instead. if self.isunique: - msg = ("{cls}._unique_restore_mask is not available if the {cls} " - "is unique. ".format(self.__class__.__name__)) + msg = ("{0}._unique_restore_mask is not available if the {0} is " + "unique. ".format(self.__class__.__name__)) else: - msg = ("{cls}._unique_restore_mask is only available after " - "accessing {cls}.unique. ".format(self.__class__.__name__)) + msg = ("{0}._unique_restore_mask is only available after " + "accessing {0}.unique. ".format(self.__class__.__name__)) msg += ("If you see this error message in an unmodified release " "version of MDAnalysis, this is almost certainly a bug!") raise RuntimeError(msg) From 553416e590a91973b6fb58171dcfab487b61a439 Mon Sep 17 00:00:00 2001 From: zeman Date: Sat, 9 Jun 2018 23:07:48 +0200 Subject: [PATCH 074/455] added *Group.copy() methods, duplicate warnings, and tests; updated changelog --- package/CHANGELOG | 7 + package/MDAnalysis/core/groups.py | 142 +++++++- package/MDAnalysis/core/topologyattrs.py | 10 +- package/MDAnalysis/exceptions.py | 14 + package/MDAnalysis/lib/util.py | 99 +++++- .../MDAnalysisTests/core/test_atomgroup.py | 174 ++++++++-- testsuite/MDAnalysisTests/core/test_groups.py | 325 +++++++++++++++--- .../core/test_updating_atomgroup.py | 12 + testsuite/MDAnalysisTests/lib/test_util.py | 210 ++++++++++- 9 files changed, 889 insertions(+), 104 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index a3e2d9bb447..77303ca79bc 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -26,6 +26,9 @@ Enhancements functions (PR #1815) * Increased performance of (repeated) calls to AtomGroup.pack_into_box() (PR #1922) + * Added boolean property *Group.isunique (PR #1922) + * Added *Group.copy() methods returning an identical copy of the respective + group (PR #1922) Fixes * Fixed order of indices in Angle/Dihedral/Improper repr @@ -43,6 +46,10 @@ Changes * updated meta data for new PyPi (#1837) * AtomGroup.atoms, ResidueGroup.residues, and SegmentGroup.segments now return themselves instead of a new object to increase performance (PR #1922) + * *Group.unique now returns a new object only if the respective group contains + duplicates. Otherwise, the group itself is returned. Repeated access of + *Group.unique will always return the same object unless the group is + updated or modified. (PR #1922) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index fca36d87273..f66874f3a55 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -30,7 +30,7 @@ :class:`atoms` are handled as :class:`AtomGroup` instances. The :class:`AtomGroup` is probably the most important object in MDAnalysis because virtually everything can be accessed through it. :class:`AtomGroup` instances -can be easily created (e.g., from a :meth:`AtomGroup.select_atoms` selection or +can be easily created (e.g., from an :meth:`AtomGroup.select_atoms` selection or simply by slicing). For convenience, chemically meaningful groups of :class:`Atoms` such as a @@ -103,7 +103,7 @@ from .. import _ANCHOR_UNIVERSES from ..lib import util -from ..lib.util import cached +from ..lib.util import cached, warn_if_not_unique from ..lib import distances from ..lib import transformations from ..selections import get_writer as get_selection_writer_for @@ -247,7 +247,7 @@ def _mix(cls, other): @classmethod def _add_prop(cls, attr): - """Add *attr* into the namespace for this class + """Add `attr` into the namespace for this class Parameters ---------- @@ -646,6 +646,7 @@ def isunique(self): # return ``not np.any(mask)`` here but using the following is faster: return not np.count_nonzero(mask) + @warn_if_not_unique def center(self, weights, pbc=None, compound='group'): """Weighted center of (compounds of) the group @@ -756,6 +757,7 @@ def center(self, weights, pbc=None, compound='group'): centers = distances.apply_PBC(centers, atoms.dimensions) return centers + @warn_if_not_unique def center_of_geometry(self, pbc=None, compound='group'): """Center of geometry (also known as centroid) of the group. @@ -871,7 +873,7 @@ def bsphere(self, **kwargs): .. versionadded:: 0.7.3 .. versionchanged:: 0.8 Added *pbc* keyword """ - atomgroup = self.atoms + atomgroup = self.atoms.unique pbc = kwargs.pop('pbc', flags['use_pbc']) if pbc: @@ -1206,6 +1208,22 @@ def wrap(self, compound="atoms", center="com", box=None): if not all(s == 0.0): o.atoms.translate(s) + def copy(self): + """Get another group identical to this one. + + + .. versionadded:: 0.19.0 + """ + group = self[:] + # Try to fill the copied group's uniqueness caches: + try: + group._cache['isunique'] = self._cache['isunique'] + if group._cache['isunique']: + group._cache['unique'] = group + except KeyError: + pass + return group + def groupby(self, topattrs): """Group together items in this group according to values of *topattr* @@ -1270,7 +1288,6 @@ def groupby(self, topattrs): return util.flatten_dict(res) - @_only_same_level def concatenate(self, other): """Concatenate with another Group or Component of the same level. @@ -1643,8 +1660,8 @@ class AtomGroup(GroupBase): define angles or dihedrals). :class:`AtomGroups` can be compared and combined using group - operators. For instance, :class:`AtomGroups` can be concatenated using `+` - or :meth:`concatenate`:: + operators. For instance, :class:`AtomGroups` can be concatenated + using `+` or :meth:`concatenate`:: ag_concat = ag1 + ag2 # or ag_concat = ag1.concatenate(ag2) @@ -1739,7 +1756,7 @@ class AtomGroup(GroupBase): ag.CA - will provide a :class:`AtomGroup` of all CA :class:`Atoms` in the + will provide an :class:`AtomGroup` of all CA :class:`Atoms` in the group. These *instant selector* attributes are auto-generated for each atom name encountered in the group. @@ -1815,7 +1832,10 @@ def residues(self): """A sorted :class:`ResidueGroup` of the unique :class:`Residues` present in the :class:`AtomGroup`. """ - return self.universe.residues[np.unique(self.resindices)] + rg = self.universe.residues[np.unique(self.resindices)] + rg._cache['isunique'] = True + rg._cache['unique'] = rg + return rg @residues.setter def residues(self, new): @@ -1859,7 +1879,10 @@ def segments(self): """A sorted :class:`SegmentGroup` of the unique segments present in the :class:`AtomGroup`. """ - return self.universe.segments[np.unique(self.segindices)] + sg = self.universe.segments[np.unique(self.segindices)] + sg._cache['isunique'] = True + sg._cache['unique'] = sg + return sg @segments.setter def segments(self, new): @@ -1924,6 +1947,9 @@ def unique(self): .. versionadded:: 0.16.0 + .. versionchanged:: 0.19.0 If the :class:`AtomGroup` is already unique, + :attr:`AtomGroup.unique` now returns the group itself instead of a + copy. """ if self.isunique: return self @@ -2580,13 +2606,24 @@ class ResidueGroup(GroupBase): @property def atoms(self): - """A :class:`AtomGroup` of :class:`Atoms` presented in this + """An :class:`AtomGroup` of :class:`Atoms` present in this :class:`ResidueGroup`. The :class:`Atoms` are ordered locally by :class:`Residue` in the :class:`ResidueGroup`. Duplicates are *not* removed. """ - return self.universe.atoms[np.concatenate(self.indices)] + ag = self.universe.atoms[np.concatenate(self.indices)] + # If the ResidueGroup is known to be unique, this also holds for the + # atoms therein, since atoms can only belong to one residue at a time. + # On the contrary, if the ResidueGroup is not unique, this does not + # imply non-unique atoms, since residues might be empty. + try: + if self._cache['isunique']: + ag._cache['isunique'] = True + ag._cache['unique'] = ag + except KeyError: + pass + return ag @property def n_atoms(self): @@ -2616,7 +2653,10 @@ def segments(self): """Get sorted :class:`SegmentGroup` of the unique segments present in the :class:`ResidueGroup`. """ - return self.universe.segments[np.unique(self.segindices)] + sg = self.universe.segments[np.unique(self.segindices)] + sg._cache['isunique'] = True + sg._cache['unique'] = sg + return sg @segments.setter def segments(self, new): @@ -2679,6 +2719,9 @@ def unique(self): .. versionadded:: 0.16.0 + .. versionchanged:: 0.19.0 If the :class:`ResidueGroup` is already + unique, :attr:`ResidueGroup.unique` now returns the group itself + instead of a copy. """ if self.isunique: return self @@ -2717,7 +2760,18 @@ def atoms(self): are further ordered by :class:`Segment` in the :class:`SegmentGroup`. Duplicates are *not* removed. """ - return self.universe.atoms[np.concatenate(self.indices)] + ag = self.universe.atoms[np.concatenate(self.indices)] + # If the SegmentGroup is known to be unique, this also holds for the + # residues therein, and thus, also for the atoms in those residues. + # On the contrary, if the SegmentGroup is not unique, this does not + # imply non-unique atoms, since segments or residues might be empty. + try: + if self._cache['isunique']: + ag._cache['isunique'] = True + ag._cache['unique'] = ag + except KeyError: + pass + return ag @property def n_atoms(self): @@ -2737,7 +2791,18 @@ def residues(self): :class:`Segment` in the :class:`SegmentGroup`. Duplicates are *not* removed. """ - return self.universe.residues[np.concatenate(self.resindices)] + rg = self.universe.residues[np.concatenate(self.resindices)] + # If the SegmentGroup is known to be unique, this also holds for the + # residues therein. On the contrary, if the SegmentGroup is not unique, + # this does not imply non-unique residues, since segments might be + # empty. + try: + if self._cache['isunique']: + rg._cache['isunique'] = True + rg._cache['unique'] = rg + except KeyError: + pass + return rg @property def n_residues(self): @@ -2788,6 +2853,9 @@ def unique(self): .. versionadded:: 0.16.0 + .. versionchanged:: 0.19.0 If the :class:`SegmentGroup` is already + unique, :attr:`SegmentGroup.unique` now returns the group itself + instead of a copy. """ if self.isunique: return self @@ -3055,10 +3123,18 @@ def __repr__(self): @property def atoms(self): - return self.universe.atoms[self.universe._topology.indices[self][0]] + """An :class:`AtomGroup` of :class:`Atoms` present in this + :class:`Residue`. + """ + ag = self.universe.atoms[self.universe._topology.indices[self][0]] + ag._cache['isunique'] = True + ag._cache['unique'] = ag + return ag @property def segment(self): + """The :class:`Segment` this :class:`Residue` belongs to. + """ return self.universe.segments[self.universe._topology.segindices[self]] @segment.setter @@ -3091,12 +3167,23 @@ def __repr__(self): @property def atoms(self): - return self.universe.atoms[self.universe._topology.indices[self][0]] + """An :class:`AtomGroup` of :class:`Atoms` present in this + :class:`Segment`. + """ + ag = self.universe.atoms[self.universe._topology.indices[self][0]] + ag._cache['isunique'] = True + ag._cache['unique'] = ag + return ag @property def residues(self): - u = self.universe - return u.residues[u._topology.resindices[self][0]] + """A :class:`ResidueGroup` of :class:`Residues` present in this + :class:`Segment`. + """ + rg = self.universe.residues[self.universe._topology.resindices[self][0]] + rg._cache['isunique'] = True + rg._cache['unique'] = rg + return rg def __getattr__(self, attr): # DEPRECATED in 0.16.2 @@ -3274,6 +3361,23 @@ def __repr__(self): return "{}, with selection{} {} on {}>".format(basestr[:-1], "s"[len(self._selection_strings)==1:], sels, basegrp) + @property + def atoms(self): + """Get a *static* :class:`AtomGroup` identical to the group of currently + selected :class:`Atoms` in the :class:`UpdatingAtomGroup`. + """ + return self[:] + + def copy(self): + """Get another :class:`UpdatingAtomGroup` identical to this one. + + + .. versionadded:: 0.19.0 + """ + return UpdatingAtomGroup(self._base_group, self._selections, + self._selection_strings) + + # Define relationships between these classes # with Level objects _Level = namedtuple('Level', ['name', 'singular', 'plural']) diff --git a/package/MDAnalysis/core/topologyattrs.py b/package/MDAnalysis/core/topologyattrs.py index 1a1c24db117..2c59566bec6 100644 --- a/package/MDAnalysis/core/topologyattrs.py +++ b/package/MDAnalysis/core/topologyattrs.py @@ -48,7 +48,7 @@ from numpy.lib.utils import deprecate from . import flags -from ..lib.util import cached, convert_aa_code, iterable +from ..lib.util import cached, convert_aa_code, iterable, warn_if_not_unique from ..lib import transformations, mdamath from ..exceptions import NoDataError, SelectionError from .topologyobjects import TopologyGroup @@ -780,6 +780,7 @@ def get_segments(self, sg): return masses + @warn_if_not_unique def center_of_mass(group, pbc=None, compound='group'): """Center of mass of (compounds of) the group. @@ -830,6 +831,7 @@ def center_of_mass(group, pbc=None, compound='group'): transplants[GroupBase].append( ('center_of_mass', center_of_mass)) + @warn_if_not_unique def total_mass(group): """Total mass of the Group. @@ -839,6 +841,7 @@ def total_mass(group): transplants[GroupBase].append( ('total_mass', total_mass)) + @warn_if_not_unique def moment_of_inertia(group, **kwargs): """Tensor moment of inertia relative to center of mass as 3x3 numpy array. @@ -897,6 +900,7 @@ def moment_of_inertia(group, **kwargs): transplants[GroupBase].append( ('moment_of_inertia', moment_of_inertia)) + @warn_if_not_unique def radius_of_gyration(group, **kwargs): """Radius of gyration. @@ -933,6 +937,7 @@ def radius_of_gyration(group, **kwargs): transplants[GroupBase].append( ('radius_of_gyration', radius_of_gyration)) + @warn_if_not_unique def shape_parameter(group, **kwargs): """Shape parameter. @@ -986,6 +991,7 @@ def shape_parameter(group, **kwargs): transplants[GroupBase].append( ('shape_parameter', shape_parameter)) + @warn_if_not_unique def asphericity(group, pbc=None): """Asphericity. @@ -1046,6 +1052,7 @@ def asphericity(group, pbc=None): transplants[GroupBase].append( ('asphericity', asphericity)) + @warn_if_not_unique def principal_axes(group, pbc=None): """Calculate the principal axes from the moment of inertia. @@ -1157,6 +1164,7 @@ def get_segments(self, sg): return charges + @warn_if_not_unique def total_charge(group): """Total charge of the Group. diff --git a/package/MDAnalysis/exceptions.py b/package/MDAnalysis/exceptions.py index a84dd5a441e..06e9ddba714 100644 --- a/package/MDAnalysis/exceptions.py +++ b/package/MDAnalysis/exceptions.py @@ -71,3 +71,17 @@ class StreamWarning(Warning): :class:`~MDAnalysis.lib.util.NamedStream`). This does not work everywhere in MDAnalysis (yet). """ + + +class DuplicateWarning(UserWarning): + """Warning indicating possible problems arising from an + :class:`~MDAnalysis.core.groups.AtomGroup` / + :class:`~MDAnalysis.core.groups.ResidueGroup` / + :class:`~MDAnalysis.core.groups.SegmentGroup` containing duplicate + :class:`Atoms` / + :class:`Residues` / + :class:`Segments`\ . + + + .. versionadded:: 0.19.0 + """ \ No newline at end of file diff --git a/package/MDAnalysis/lib/util.py b/package/MDAnalysis/lib/util.py index a155fe06850..c5c9a72f574 100644 --- a/package/MDAnalysis/lib/util.py +++ b/package/MDAnalysis/lib/util.py @@ -175,8 +175,9 @@ import numpy as np import functools from numpy.testing import assert_equal +import inspect -from ..exceptions import StreamWarning +from ..exceptions import StreamWarning, DuplicateWarning # Python 3.0, 3.1 do not have the builtin callable() @@ -1693,8 +1694,9 @@ def flatten_dict(d, parent_key=tuple()): Note ----- - Based on https://stackoverflow.com/a/6027615/ by user https://stackoverflow.com/users/1897/imran - + Based on https://stackoverflow.com/a/6027615/ + by user https://stackoverflow.com/users/1897/imran + .. versionadded:: 0.18.0 """ @@ -1709,3 +1711,94 @@ def flatten_dict(d, parent_key=tuple()): else: items.append((new_key, v)) return dict(items) + + +def static_variables(**kwargs): + """Decorator equipping functions or methods with static variables. + + Static variables are declared and initialized by supplying keyword arguments + and initial values to the decorator. + + Example + ------- + + >>> @static(msg='foo calls', calls=0) + >>> def foo(): + >>> foo.calls += 1 + >>> print("{}: {}".format(foo.msg, foo.calls)) + >>> + >>> foo() + foo calls: 1 + >>> foo() + foo calls: 2 + + + .. note:: Based on https://stackoverflow.com/a/279586 + by user `Claudiu` + + .. versionadded:: 0.19.0 + """ + def static_decorator(func): + for kwarg in kwargs: + setattr(func, kwarg, kwargs[kwarg]) + return func + return static_decorator + + +# In a lot of Atom/Residue/SegmentGroup methods such as center_of_geometry() and +# the like, results are biased if the calling group is not unique, i.e., if it +# contains duplicates. +# We therefore raise a `DuplicateWarning` whenever an affected method is called +# from a non-unique group. Since several of the affected methods involve calls +# to other affected methods, simply raising a warning in every affected method +# would potentially lead to a massive amount of warnings. This is exactly where +# the `warn_if_unique` decorator below comes into play. It ensures that a +# warning is only raised once for a method using this decorator, and suppresses +# all such warnings that would potentially be raised in methods called by that +# method. Of course, as it is generally the case with Python warnings, this is +# *not threadsafe*. + +@static_variables(warned=False) +def warn_if_not_unique(groupmethod): + """Decorator triggering a :class:`DuplicateWarning` if the underlying group + is not unique. + + Assures that during execution of the decorated method, only the first of + potentially multiple warnings concerning the uniqueness of groups is shown. + + .. versionadded:: 0.19.0 + """ + @wraps(groupmethod) + def wrapper(group, *args, **kwargs): + # Proceed as usual if the calling group is unique or a DuplicateWarning + # has already been thrown: + if group.isunique or warn_if_not_unique.warned: + return groupmethod(group, *args, **kwargs) + # Otherwise, throw a DuplicateWarning and execute the method. + method_name = ".".join((group.__class__.__name__, groupmethod.__name__)) + # Try to get the group's variable name(s): + caller_locals = inspect.currentframe().f_back.f_locals.items() + group_names = [] + for name, obj in caller_locals: + try: + if obj is group: + group_names.append("'{}'".format(name)) + except: + pass + if not group_names: + group_name = "'unnamed {}'".format(group.__class__.__name__) + elif len(group_names) == 1: + group_name = group_names[0] + else: + group_name = " a.k.a. ".join(sorted(group_names)) + group_repr = repr(group) + msg = ("{}(): {} {} contains duplicates. Results might be biased!" + "".format(method_name, group_name, group_repr)) + warnings.warn(message=msg, category=DuplicateWarning, stacklevel=2) + warn_if_not_unique.warned = True + try: + result = groupmethod(group, *args, **kwargs) + finally: + warn_if_not_unique.warned = False + return result + return wrapper diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index e06d2af8094..c5e88fb4d97 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -33,6 +33,7 @@ ) import MDAnalysis as mda +from MDAnalysis.exceptions import DuplicateWarning from MDAnalysis.lib import distances, transformations from MDAnalysis.core.topologyobjects import ( Bond, @@ -56,6 +57,7 @@ def test_AtomGroupUniverse_usage_warning(self): with pytest.deprecated_call(): mda.core.AtomGroup.Universe(PSF, DCD) + class TestAtomGroupToTopology(object): """Test the conversion of AtomGroup to TopologyObjects""" @pytest.fixture() @@ -95,7 +97,7 @@ def test_VE(self, btype, u): class TestAtomGroupWriting(object): - + @pytest.fixture() def u(self): return mda.Universe(PSF, DCD) @@ -109,7 +111,6 @@ def test_write_no_args(self, u, tmpdir): name = path.splitext(path.basename(DCD))[0] assert_equal(files[0], "{}_0.pdb".format(name)) - def test_raises(self, u, tmpdir): with tmpdir.as_cwd(): with pytest.raises(ValueError): @@ -136,11 +137,10 @@ class _WriteAtoms(object): ext = None # override to test various output writers precision = 3 - @pytest.fixture() def universe(self): return mda.Universe(PSF, DCD) - + @pytest.fixture() def outfile(self, tmpdir): return str(tmpdir) + "writeatoms." + self.ext @@ -238,15 +238,15 @@ def test_flag_convert_length(self): class TestAtomGroupTransformations(object): - + @pytest.fixture() def u(self): return mda.Universe(PSF, DCD) - + @pytest.fixture() def coords(self, u): return u.atoms.positions.copy() - + @pytest.fixture() def center_of_geometry(self, u): return u.atoms.center_of_geometry() @@ -369,7 +369,7 @@ def test_transform_translation_and_rotation(self, u): class TestCenter(object): - + @pytest.fixture() def ag(self): u = make_Universe(trajectory=True) @@ -387,6 +387,15 @@ def test_center_2(self, ag): assert_almost_equal(ag.center(weights), ag.positions[:4].mean(axis=0)) + def test_center_duplicates(self, ag): + weights = np.ones(ag.n_atoms) + weights[0] = 2. + ref = ag.center(weights) + ag2 = ag + ag[0] + with pytest.warns(DuplicateWarning): + ctr = ag2.center(None) + assert_almost_equal(ctr, ref, decimal=6) + def test_center_wrong_length(self, ag): weights = np.ones(ag.n_atoms + 4) with pytest.raises(ValueError): @@ -400,10 +409,11 @@ def test_center_wrong_shape(self, ag): class TestSplit(object): + @pytest.fixture() def universe(self): return mda.Universe(PSF, DCD) - + def test_split_atoms(self, universe): ag = universe.select_atoms("resid 1:50 and not resname LYS and " "(name CA or name CB)") @@ -435,7 +445,7 @@ def test_split_segments(self, universe): assert len(sg) == len(ag.segments.segids) for g, ref_segname in zip(sg, ag.segments.segids): for atom in g: - assert_equal(atom.segid, ref_segname) + assert_equal(atom.segid, ref_segname) def test_split_VE(self, universe): ag = universe.atoms[:40] @@ -445,11 +455,11 @@ def test_split_VE(self, universe): class TestWrap(object): - + @pytest.fixture() def u(self): return mda.Universe(TRZ_psf, TRZ) - + @pytest.fixture() def ag(self, u): return u.atoms[:100] @@ -518,6 +528,7 @@ class TestAtomGroupProperties(object): - getting properties from AG matches the Atom values - setting properties from AG changes the Atom - setting the property on Atom changes AG + - _unique_restore_mask works correctly """ @staticmethod def get_new(att_type): @@ -570,6 +581,38 @@ def test_atom_check_ag(self, att, atts, ag, att_type): assert_equal(vals, other, err_msg="Change to Atoms not reflected in AtomGroup for property: {0}".format(att)) + def test_ag_unique_restore_mask(self, ag): + # assert that ag is unique: + assert ag.isunique + # assert restore mask cache is empty: + with pytest.raises(KeyError): + _ = ag._cache['unique_restore_mask'] + # access unique property: + uag = ag.unique + # assert restore mask cache is still empty since ag is unique: + with pytest.raises(KeyError): + _ = ag._cache['unique_restore_mask'] + # make sure that accessing the restore mask of the unique AtomGroup + # raises a RuntimeError: + with pytest.raises(RuntimeError): + _ = ag._unique_restore_mask + + # add duplicate atoms: + ag += ag + # assert that ag is not unique: + assert not ag.isunique + # assert cache is empty: + with pytest.raises(KeyError): + _ = ag._cache['unique_restore_mask'] + # access unique property: + uag = ag.unique + # check if caching works as expected: + assert ag._cache['unique_restore_mask'] is ag._unique_restore_mask + # assert that restore mask cache of ag.unique hasn't been set: + with pytest.raises(RuntimeError): + _ = ag.unique._unique_restore_mask + # assert restore mask can reproduce original ag: + assert ag.unique[ag._unique_restore_mask] == ag class TestOrphans(object): """Test moving Universes out of scope and having A/AG persist @@ -716,8 +759,9 @@ def test_chi1_nodep(self, PSFDCD): class TestPBCFlag(object): + prec = 3 - + @pytest.fixture() def ref_noPBC(self): return { @@ -737,7 +781,7 @@ def ref_noPBC(self): [0.40611024, 0.45112859, 0.7947059], [0.46294889, -0.85135849, 0.24671249]]) } - + @pytest.fixture() def ref_PBC(self): return { @@ -758,13 +802,12 @@ def ref_PBC(self): [-0.07520116, -0.96394227, 0.25526473], [-0.50622389, -0.18364489, -0.84262206]]) } - + @pytest.fixture() def ag(self): universe = mda.Universe(TRZ_psf, TRZ) return universe.residues[0:3] - - + def test_flag(self): # Test default setting of flag assert mda.core.flags['use_pbc'] is False @@ -840,15 +883,15 @@ class TestAtomGroup(object): There is likely lots of duplication between here and other tests. """ dih_prec = 2 - + @pytest.fixture() def universe(self): return mda.Universe(PSF, DCD) - + @pytest.fixture() def ag(self, universe): return universe.atoms - + def test_getitem_int(self, universe): assert_equal(universe.atoms[0].ix, universe.atoms.ix[0]) @@ -901,10 +944,24 @@ def test_center_of_geometry(self, ag): assert_almost_equal(ag.center_of_geometry(), [-0.04223963, 0.0141824, -0.03505163], decimal=5) + def test_center_of_geometry_duplicates(self, ag): + ag2 = ag + ag[0] + ref = ag.center_of_geometry() + with pytest.warns(DuplicateWarning) as w: + assert not np.allclose(ag2.center_of_geometry(), ref) + assert len(w) == 1 + def test_center_of_mass(self, ag): assert_almost_equal(ag.center_of_mass(), [-0.01094035, 0.05727601, -0.12885778], decimal=5) + def test_center_of_mass_duplicates(self, ag): + ag2 = ag + ag[0] + ref = ag.center_of_mass() + with pytest.warns(DuplicateWarning) as w: + assert not np.allclose(ag2.center_of_mass(), ref) + assert len(w) == 1 + @pytest.mark.parametrize('name, compound', (('resids', 'residues'), ('segids', 'segments'))) def test_center_of_geometry_compounds(self, ag, name, compound): @@ -960,12 +1017,49 @@ def test_principal_axes(self, ag): [1.20986911e-02, 9.98951474e-01, -4.41539838e-02], [-9.99925632e-01, 1.21546132e-02, 9.98264877e-04],])) + def test_principal_axes_duplicates(self, ag): + ag2 = ag + ag[0] + ref = ag.principal_axes() + with pytest.warns(DuplicateWarning) as w: + assert not np.allclose(ag2.principal_axes(), ref) + assert len(w) == 1 + + def test_moment_of_inertia_duplicates(self, universe): + ag = universe.select_atoms('segid 4AKE') + ag2 = ag + ag[0] + ref = ag.moment_of_inertia() + with pytest.warns(DuplicateWarning) as w: + assert not np.allclose(ag2.moment_of_inertia(), ref) + assert len(w) == 1 + + def test_radius_of_gyration_duplicates(self, universe): + ag = universe.select_atoms('segid 4AKE') + ag2 = ag + ag[0] + ref = ag.radius_of_gyration() + with pytest.warns(DuplicateWarning) as w: + assert not np.allclose(ag2.radius_of_gyration(), ref) + assert len(w) == 1 + def test_total_charge(self, ag): assert_almost_equal(ag.total_charge(), -4.0, decimal=4) + def test_total_charge_duplicates(self, ag): + ag2 = ag + ag[0] + ref = ag.total_charge() + ag[0].charge + with pytest.warns(DuplicateWarning) as w: + assert_almost_equal(ag2.total_charge(), ref) + assert len(w) == 1 + def test_total_mass(self, ag): assert_almost_equal(ag.total_mass(), 23582.043) + def test_total_mass_duplicates(self, ag): + ag2 = ag + ag[0] + ref = ag.total_mass() + ag[0].mass + with pytest.warns(DuplicateWarning) as w: + assert_almost_equal(ag2.total_mass(), ref) + assert len(w) == 1 + def test_indices_ndarray(self, ag): assert isinstance(ag.indices, np.ndarray) @@ -1073,20 +1167,26 @@ def test_packintobox(self, universe): Reference system doesn't have dimensions, so an arbitrary box is imposed on the system - """ u = universe u.trajectory.rewind() # just to make sure... ag = u.atoms[1000:2000:200] # Provide arbitrary box - ag.pack_into_box(box=np.array([5., 5., 5.], dtype=np.float32)) - assert_almost_equal( - ag.positions, - np.array([[3.94543672, 2.5939188, 2.73179913], - [3.21632767, 0.879035, 0.32085133], - [2.07735443, 0.99395466, 4.09301519], - [1.35541916, 2.0690732, 4.67488003], - [1.73236561, 4.90658951, 0.6880455]], dtype=np.float32)) + box = np.array([5., 5., 5.], dtype=np.float32) + # Expected folded coordinates + packed_coords = np.array([[3.94543672, 2.5939188, 2.73179913], + [3.21632767, 0.879035, 0.32085133], + [2.07735443, 0.99395466, 4.09301519], + [1.35541916, 2.0690732, 4.67488003], + [1.73236561, 4.90658951, 0.6880455]], + dtype=np.float32) + ag.pack_into_box(box=box) + assert_almost_equal(ag.positions, packed_coords) + # Check with duplicates: + ag += ag + ag.pack_into_box(box=box) + assert_almost_equal(ag.positions, + np.vstack((packed_coords, packed_coords))) def test_residues(self, universe): u = universe @@ -1212,10 +1312,26 @@ def test_shape_parameter(self, universe): s = universe.select_atoms('segid 4AKE').shape_parameter() assert_almost_equal(s, 0.00240753939086033, 6) + def test_shape_parameter_duplicates(self, universe): + ag = universe.select_atoms('segid 4AKE') + ag2 = ag + ag[0] + ref = ag.shape_parameter() + with pytest.warns(DuplicateWarning) as w: + assert not np.allclose(ag2.shape_parameter(), ref) + assert len(w) == 1 + def test_asphericity(self, universe): a = universe.select_atoms('segid 4AKE').asphericity() assert_almost_equal(a, 0.020227504542775828, 6) + def test_asphericity_duplicates(self, universe): + ag = universe.select_atoms('segid 4AKE') + ag2 = ag + ag[0] + ref = ag.asphericity() + with pytest.warns(DuplicateWarning) as w: + assert not np.allclose(ag2.asphericity(), ref) + assert len(w) == 1 + def test_positions(self, universe): ag = universe.select_atoms("bynum 12:42") pos = ag.positions + 3.14 diff --git a/testsuite/MDAnalysisTests/core/test_groups.py b/testsuite/MDAnalysisTests/core/test_groups.py index 0b5e199d45d..b1ef21daf1e 100644 --- a/testsuite/MDAnalysisTests/core/test_groups.py +++ b/testsuite/MDAnalysisTests/core/test_groups.py @@ -40,7 +40,7 @@ class TestGroupProperties(object): - """ Test attributes of all groups + """ Test attributes common to all groups """ @pytest.fixture() def u(self): @@ -54,6 +54,8 @@ def group_dict(self, u): 'segment': u.segments } + uni = make_Universe() # can't use fixtures in @pytest.mark.parametrize + def test_dimensions(self, u, group_dict): dimensions = np.arange(6) @@ -61,6 +63,79 @@ def test_dimensions(self, u, group_dict): group.dimensions = dimensions.copy() assert_array_equal(group.dimensions, dimensions) assert_equal(u.dimensions, group.dimensions) + + @pytest.mark.parametrize('group', (uni.atoms[:2], uni.residues[:2], + uni.segments[:2])) + def test_group_isunique(self, group): + assert len(group) == 2 + # Initially, cache must be empty: + with pytest.raises(KeyError): + _ = group._cache['isunique'] + # Check for correct value and type: + assert group.isunique is True + # Check if cache is set correctly: + assert group._cache['isunique'] is True + + # Add duplicate element to group: + group += group[0] + assert len(group) == 3 + # Cache must be reset since the group changed: + with pytest.raises(KeyError): + _ = group._cache['isunique'] + # Check for correct value and type: + assert group.isunique is False + # Check if cache is set correctly: + assert group._cache['isunique'] is False + + #Check empty group: + group = group[[]] + assert len(group) == 0 + # Cache must be empty: + with pytest.raises(KeyError): + _ = group._cache['isunique'] + # Check for correct value and type: + assert group.isunique is True + # Check if cache is set correctly: + assert group._cache['isunique'] is True + + @pytest.mark.parametrize('group', (uni.atoms[:2], uni.residues[:2], + uni.segments[:2])) + def test_group_unique(self, group): + # check unique group: + assert len(group) == 2 + # assert caches are empty: + with pytest.raises(KeyError): + _ = group._cache['isunique'] + with pytest.raises(KeyError): + _ = group._cache['unique'] + # assert that group.unique of the unique group references itself: + assert group.unique is group + # check if caches have been set: + assert group._cache['isunique'] is True + assert group._cache['unique'] is group + # add duplicate element to group: + group += group[0] + assert len(group) == 3 + # assert caches are cleared since the group changed: + with pytest.raises(KeyError): + _ = group._cache['isunique'] + with pytest.raises(KeyError): + _ = group._cache['unique'] + # assert that group.unique of the non-unique group doesn't reference + # itself: + assert group.unique is not group + # check if caches have been set correctly: + assert group._cache['isunique'] is False + assert group._cache['unique'] is group.unique + # check length and type: + assert len(group.unique) == 2 + assert type(group.unique) is type(group) + # check if caches of group.unique have been set correctly: + assert group.unique._cache['isunique'] is True + assert group.unique._cache['unique'] is group.unique + # assert that repeated access yields the same object (not a copy): + unique_group = group.unique + assert unique_group is group.unique class TestGroupSlicing(object): @@ -341,7 +416,6 @@ class TestGroupLevelTransition(object): *group_to_*group tests moves between levels _unique tests check that Upshifts only return unique higher level _listcomp tests check that Downshifts INCLUDE repeated elements - _unique tests the unique method (performs set operation on self) """ @pytest.fixture() @@ -352,46 +426,122 @@ def test_atomgroup_to_atomgroup(self, u): atm = u.atoms.atoms assert len(atm) == 125 assert isinstance(atm, groups.AtomGroup) + assert atm is u.atoms def test_atomgroup_to_residuegroup(self, u): - res = u.atoms.residues + atm = u.atoms + res = atm.residues assert len(res) == 25 assert isinstance(res, groups.ResidueGroup) + assert res == u.residues + assert res is not u.residues + assert res._cache['isunique'] is True + assert res._cache['unique'] is res def test_atomgroup_to_segmentgroup(self, u): seg = u.atoms.segments assert len(seg) == 5 assert isinstance(seg, groups.SegmentGroup) + assert seg == u.segments + assert seg is not u.segments + assert seg._cache['isunique'] is True + assert seg._cache['unique'] is seg def test_residuegroup_to_atomgroup(self, u): - atm = u.residues.atoms + res = u.residues + atm = res.atoms assert len(atm) == 125 assert isinstance(atm, groups.AtomGroup) + assert atm == u.atoms + assert atm is not u.atoms + # clear res' uniqueness caches: + if 'unique' in res._cache.keys(): + del res._cache['unique'] + if 'isunique' in res._cache.keys(): + del res._cache['isunique'] + atm = res.atoms + # assert uniqueness caches of atm are empty: + with pytest.raises(KeyError): + _ = atm._cache['isunique'] + with pytest.raises(KeyError): + _ = atm._cache['unique'] + # populate uniqueness cache of res: + assert res.isunique + atm = res.atoms + # assert uniqueness caches of atm are set: + assert atm._cache['isunique'] is True + assert atm._cache['unique'] is atm def test_residuegroup_to_residuegroup(self, u): res = u.residues.residues assert len(res) == 25 assert isinstance(res, groups.ResidueGroup) + assert res is u.residues def test_residuegroup_to_segmentgroup(self, u): seg = u.residues.segments assert len(seg) == 5 assert isinstance(seg, groups.SegmentGroup) + assert seg == u.segments + assert seg is not u.segments + assert seg._cache['isunique'] is True + assert seg._cache['unique'] is seg def test_segmentgroup_to_atomgroup(self, u): - atm = u.segments.atoms + seg = u.segments + atm = seg.atoms assert len(atm) == 125 assert isinstance(atm, groups.AtomGroup) + assert atm == u.atoms + assert atm is not u.atoms + # clear seg's uniqueness caches: + if 'unique' in seg._cache.keys(): + del seg._cache['unique'] + if 'isunique' in seg._cache.keys(): + del seg._cache['isunique'] + atm = seg.atoms + # assert uniqueness caches of atm are empty: + with pytest.raises(KeyError): + _ = atm._cache['isunique'] + with pytest.raises(KeyError): + _ = atm._cache['unique'] + # populate uniqueness cache of seg: + assert seg.isunique + atm = seg.atoms + # assert uniqueness caches of atm are set: + assert atm._cache['isunique'] is True + assert atm._cache['unique'] is atm def test_segmentgroup_to_residuegroup(self, u): - res = u.segments.residues + seg = u.segments + res = seg.residues assert len(res) == 25 assert isinstance(res, groups.ResidueGroup) + assert res == u.residues + assert res is not u.residues + # clear seg's uniqueness caches: + if 'unique' in seg._cache.keys(): + del seg._cache['unique'] + if 'isunique' in seg._cache.keys(): + del seg._cache['isunique'] + res = seg.residues + # assert uniqueness caches of res are empty: + with pytest.raises(KeyError): + _ = res._cache['isunique'] + with pytest.raises(KeyError): + _ = res._cache['unique'] + # populate uniqueness cache of seg: + assert seg.isunique + res = seg.residues + # assert uniqueness caches of res are set: + assert res._cache['isunique'] is True + assert res._cache['unique'] is res def test_segmentgroup_to_segmentgroup(self, u): seg = u.segments.segments assert len(seg) == 5 assert isinstance(seg, groups.SegmentGroup) + assert seg is u.segments def test_atom_to_residue(self, u): res = u.atoms[0].residue @@ -405,6 +555,11 @@ def test_residue_to_atomgroup(self, u): ag = u.residues[0].atoms assert isinstance(ag, groups.AtomGroup) assert len(ag) == 5 + assert ag._cache['isunique'] is True + assert ag._cache['unique'] is ag + del ag._cache['unique'] + del ag._cache['isunique'] + assert ag.isunique def test_residue_to_segment(self, u): seg = u.residues[0].segment @@ -414,62 +569,96 @@ def test_segment_to_atomgroup(self, u): ag = u.segments[0].atoms assert isinstance(ag, groups.AtomGroup) assert len(ag) == 25 + assert ag._cache['isunique'] is True + assert ag._cache['unique'] is ag + del ag._cache['unique'] + del ag._cache['isunique'] + assert ag.isunique def test_segment_to_residuegroup(self, u): rg = u.segments[0].residues assert isinstance(rg, groups.ResidueGroup) assert len(rg) == 5 + assert rg._cache['isunique'] is True + assert rg._cache['unique'] is rg + del rg._cache['unique'] + del rg._cache['isunique'] + assert rg.isunique def test_atomgroup_to_residuegroup_unique(self, u): ag = u.atoms[:5] + u.atoms[10:15] + u.atoms[:5] - - assert len(ag.residues) == 2 + rg = ag.residues + assert len(rg) == 2 + assert rg._cache['isunique'] is True + assert rg._cache['unique'] is rg def test_atomgroup_to_segmentgroup_unique(self, u): ag = u.atoms[0] + u.atoms[-1] + u.atoms[0] - - assert len(ag.segments) == 2 + sg = ag.segments + assert len(sg) == 2 + assert sg._cache['isunique'] is True + assert sg._cache['unique'] is sg def test_residuegroup_to_segmentgroup_unique(self, u): rg = u.residues[0] + u.residues[6] + u.residues[1] - - assert len(rg.segments) == 2 + sg = rg.segments + assert len(sg) == 2 + assert sg._cache['isunique'] is True + assert sg._cache['unique'] is sg def test_residuegroup_to_atomgroup_listcomp(self, u): rg = u.residues[0] + u.residues[0] + u.residues[4] - - assert len(rg.atoms) == 15 + ag = rg.atoms + assert len(ag) == 15 + # assert uniqueness caches of ag are empty: + with pytest.raises(KeyError): + _ = ag._cache['isunique'] + with pytest.raises(KeyError): + _ = ag._cache['unique'] + # populate uniqueness cache of rg: + assert not rg.isunique + ag = rg.atoms + # assert uniqueness caches of ag are still empty: + with pytest.raises(KeyError): + _ = ag._cache['isunique'] + with pytest.raises(KeyError): + _ = ag._cache['unique'] def test_segmentgroup_to_residuegroup_listcomp(self, u): sg = u.segments[0] + u.segments[0] + u.segments[1] - - assert len(sg.residues) == 15 + rg = sg.residues + assert len(rg) == 15 + # assert uniqueness caches of rg are empty: + with pytest.raises(KeyError): + _ = rg._cache['isunique'] + with pytest.raises(KeyError): + _ = rg._cache['unique'] + # populate uniqueness cache of sg: + assert not sg.isunique + rg = sg.residues + # assert uniqueness caches of rg are still empty: + with pytest.raises(KeyError): + _ = rg._cache['isunique'] + with pytest.raises(KeyError): + _ = rg._cache['unique'] def test_segmentgroup_to_atomgroup_listcomp(self, u): sg = u.segments[0] + u.segments[0] + u.segments[1] - - assert len(sg.atoms) == 75 - - def test_atomgroup_unique(self, u): - ag = u.atoms[:10] + u.atoms[:10] - - assert len(ag) == 20 - assert len(ag.unique) == 10 - assert isinstance(ag.unique, groups.AtomGroup) - - def test_residuegroup_unique(self, u): - rg = u.residues[:5] + u.residues[:5] - - assert len(rg) == 10 - assert len(rg.unique) == 5 - assert isinstance(rg.unique, groups.ResidueGroup) - - def test_segmentgroup_unique(self, u): - sg = u.segments[0] + u.segments[1] + u.segments[0] - - assert len(sg) == 3 - assert len(sg.unique) == 2 - assert isinstance(sg.unique, groups.SegmentGroup) + ag = sg.atoms + assert len(ag) == 75 + # assert uniqueness caches of ag are empty: + with pytest.raises(KeyError): + _ = ag._cache['isunique'] + with pytest.raises(KeyError): + _ = ag._cache['unique'] + # populate uniqueness cache of sg: + assert not sg.isunique + ag = sg.atoms + # assert uniqueness caches of ag are still empty: + with pytest.raises(KeyError): + _ = ag._cache['isunique'] + with pytest.raises(KeyError): + _ = ag._cache['unique'] class TestComponentComparisons(object): @@ -577,7 +766,6 @@ class TestGroupBy(object): @pytest.fixture() def u(self): return make_Universe(('segids', 'charges', 'resids')) - def test_groupby_float(self, u): gb = u.atoms.groupby('charges') @@ -588,7 +776,7 @@ def test_groupby_float(self, u): assert all(g.charges == ref) assert len(g) == 25 - @pytest.mark.parametrize('string', ['segids', b'segids', u'segids']) + @pytest.mark.parametrize('string', ['segids', b'segids', u'segids']) def test_groupby_string(self, u, string): gb = u.atoms.groupby(string) @@ -626,13 +814,13 @@ def test_groupby_int_float(self, u): for subref in [-1.5, -0.5, 0.0, 0.5, 1.5]: assert (ref, subref) in gb.keys() a = gb[(ref, subref)] - assert len(a) == 1 + assert len(a) == 1 assert all(a.resids == ref) assert all(a.charges == subref) def test_groupby_string_int(self, u): gb = u.atoms.groupby(['segids', 'resids']) - + assert len(gb) == 25 res = 1 for ref in ['SegA','SegB','SegC','SegD','SegE']: @@ -642,7 +830,7 @@ def test_groupby_string_int(self, u): assert all(a.segids == ref) assert all(a.resids == res) res += 1 - + class TestReprs(object): @pytest.fixture() @@ -786,6 +974,45 @@ def test_equal(self, groups): assert not a[0:1] == a[0], \ 'Element should not equal single element group.' + @pytest.mark.parametrize('group', (u.atoms[:2], u.residues[:2], + u.segments[:2])) + def test_copy(self, group): + # make sure uniqueness caches of group are empty: + with pytest.raises(KeyError): + _ = group._cache['isunique'] + with pytest.raises(KeyError): + _ = group._cache['unique'] + # make a copy: + cgroup = group.copy() + # check if cgroup is an identical copy of group: + assert type(cgroup) is type(group) + assert cgroup is not group + assert cgroup == group + # check if the copied group's uniqueness caches are empty: + with pytest.raises(KeyError): + _ = cgroup._cache['isunique'] + with pytest.raises(KeyError): + _ = cgroup._cache['unique'] + # populate group's uniqueness caches: + assert group.isunique + # make a copy: + cgroup = group.copy() + # check if the copied group's uniqueness caches are set correctly: + assert cgroup._cache['isunique'] is True + assert cgroup._cache['unique'] is cgroup + # add duplicate element to group: + group += group[0] + # populate group's uniqueness caches: + assert not group.isunique + # make a copy: + cgroup = group.copy() + # check if the copied group's uniqueness caches are set correctly: + assert cgroup._cache['isunique'] is False + with pytest.raises(KeyError): + _ = cgroup._cache['unique'] + # assert that duplicates are preserved: + assert cgroup == group + def test_issubset(self, groups): a, b, c, d, e = groups assert c.issubset(a) @@ -1061,12 +1288,12 @@ def test_SegmentGroup_nowarn_getitem(self, u): @pytest.fixture() def attr_universe(): return make_Universe(('names', 'resids', 'segids')) - + class TestAttributeSetting(object): @pytest.mark.parametrize('groupname', ['atoms', 'residues', 'segments']) def test_setting_group_fail(self, attr_universe, groupname): group = getattr(attr_universe, groupname) - + with pytest.raises(AttributeError): group.this = 'that' @@ -1078,7 +1305,7 @@ def test_setting_component_fails(self, attr_universe, groupname): component.this = 'that' @pytest.mark.parametrize('attr', ['name', 'resid', 'segid']) - @pytest.mark.parametrize('groupname', ['atoms', 'residues', 'segments']) + @pytest.mark.parametrize('groupname', ['atoms', 'residues', 'segments']) def test_group_set_singular(self, attr_universe, attr, groupname): # this should fail as you can't set the 'name' of a 'ResidueGroup' group = getattr(attr_universe, groupname) @@ -1120,9 +1347,9 @@ def test_segment_set_resid(self, attr_universe): def test_segment_set_segid(self, attr_universe): attr_universe.segments[0].segid = 'this' assert attr_universe.segments[0].segid == 'this' - + @pytest.mark.parametrize('attr', ['names', 'resids', 'segids']) - @pytest.mark.parametrize('groupname', ['atoms', 'residues', 'segments']) + @pytest.mark.parametrize('groupname', ['atoms', 'residues', 'segments']) def test_component_set_plural(self, attr, groupname): # this should fail as you can't set the 'Names' of an 'Atom' u = make_Universe(('names', 'resids', 'segids')) diff --git a/testsuite/MDAnalysisTests/core/test_updating_atomgroup.py b/testsuite/MDAnalysisTests/core/test_updating_atomgroup.py index dad07ad8990..48e1a647362 100644 --- a/testsuite/MDAnalysisTests/core/test_updating_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_updating_atomgroup.py @@ -114,6 +114,18 @@ def test_kwarg_check(self, u): with pytest.raises(TypeError): u.select_atoms("group updating", {"updating": True}) + def test_atoms(self, ag_updating): + ag = ag_updating.atoms + assert isinstance(ag, mda.core.groups.AtomGroup) + assert ag is not ag_updating + assert ag == ag_updating + + def test_copy(self, ag_updating): + cgroup = ag_updating.copy() + assert isinstance(cgroup, mda.core.groups.UpdatingAtomGroup) + assert cgroup is not ag_updating + assert cgroup == ag_updating + class TestUpdatingSelectionNotraj(object): @pytest.fixture() diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index c3bae60e2a8..91712f04050 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -25,6 +25,7 @@ from six.moves import range, StringIO import pytest import os +import warnings import numpy as np from numpy.testing import (assert_equal, assert_almost_equal, @@ -33,9 +34,9 @@ import MDAnalysis as mda import MDAnalysis.lib.util as util import MDAnalysis.lib.mdamath as mdamath -from MDAnalysis.lib.util import cached +from MDAnalysis.lib.util import cached, static_variables, warn_if_not_unique from MDAnalysis.core.topologyattrs import Bonds -from MDAnalysis.exceptions import NoDataError +from MDAnalysis.exceptions import NoDataError, DuplicateWarning from MDAnalysisTests.datafiles import Make_Whole @@ -1080,5 +1081,208 @@ def test_flatten_dict(self): assert k[0] in d assert k[1] in d[k[0]] assert result[k] in d[k[0]].values() + +class TestStaticVariables(object): + """Tests concerning the decorator @static_variables + """ + + def test_static_variables(self): + x = [0] + + @static_variables(foo=0, bar={'test': x}) + def myfunc(): + assert myfunc.foo is 0 + assert type(myfunc.bar) is type(dict()) + if 'test2' not in myfunc.bar: + myfunc.bar['test2'] = "a" + else: + myfunc.bar['test2'] += "a" + myfunc.bar['test'][0] += 1 + return myfunc.bar['test'] + + assert hasattr(myfunc, 'foo') + assert hasattr(myfunc, 'bar') + + y = myfunc() + assert y is x + assert x[0] is 1 + assert myfunc.bar['test'][0] is 1 + assert myfunc.bar['test2'] == "a" + + x = [0] + y = myfunc() + assert y is not x + assert myfunc.bar['test'][0] is 2 + assert myfunc.bar['test2'] == "aa" + +class TestWarnIfNotUnique(object): + """Tests concerning the decorator @warn_if_not_uniue + """ + + @pytest.fixture() + def warn_msg(self, func, group, group_name): + msg = ("{}.{}(): {} {} contains duplicates. Results might be " + "biased!".format(group.__class__.__name__, func.__name__, + group_name, group.__repr__())) + return msg + + def test_warn_if_not_unique(self, atoms): + # Check that the warn_if_not_unique decorator has a "static variable" + # warn_if_not_unique.warned: + assert hasattr(warn_if_not_unique, 'warned') + assert warn_if_not_unique.warned is False + + def test_warn_if_not_unique_once_outer(self, atoms): + + # Construct a scenario with two nested functions, each one decorated + # with @warn_if_not_unique: + + @warn_if_not_unique + def inner(group): + if not group.isunique: + # The inner function should not trigger a warning, and the state + # of warn_if_not_unique.warned should reflect that: + assert warn_if_not_unique.warned is True + return 0 + + @warn_if_not_unique + def outer(group): + return inner(group) + + # Check that no warning is raised for a unique group: + assert atoms.isunique + with pytest.warns(None) as w: + x = outer(atoms) + assert x is 0 + assert not w.list + + # Check that a warning is raised for a group with duplicates: + ag = atoms + atoms[0] + msg = self.warn_msg(outer, ag, "'ag'") + with pytest.warns(DuplicateWarning) as w: + assert warn_if_not_unique.warned is False + x = outer(ag) + # Assert that the "warned" state is restored: + assert warn_if_not_unique.warned is False + # Check correct function execution: + assert x is 0 + # Only one warning must have been raised: + assert len(w) == 1 + # For whatever reason pytest.warns(DuplicateWarning, match=msg) + # doesn't work, so we compare the recorded warning message instead: + assert w[0].message.args[0] == msg + # Make sure the warning uses the correct stacklevel and references + # this file instead of MDAnalysis/lib/util.py: + assert w[0].filename == __file__ + + def test_warned_state_restored_on_failure(self, atoms): + + # A decorated function raising an exception: + @warn_if_not_unique + def thisfails(group): + raise ValueError() + + ag = atoms + atoms[0] + msg = self.warn_msg(thisfails, ag, "'ag'") + with pytest.warns(DuplicateWarning) as w: + assert warn_if_not_unique.warned is False + with pytest.raises(ValueError): + thisfails(ag) + # Assert that the "warned" state is restored despite `thisfails` + # raising an exception: + assert warn_if_not_unique.warned is False + assert len(w) == 1 + assert w[0].message.args[0] == msg + assert w[0].filename == __file__ + + def test_warn_if_not_unique_once_inner(self, atoms): + + # Construct a scenario with two nested functions, each one decorated + # with @warn_if_not_unique, but the outer function adds a duplicate + # to the group: + + @warn_if_not_unique + def inner(group): + return 0 + + @warn_if_not_unique + def outer(group): + dupgroup = group + group[0] + return inner(dupgroup) + + # Check that even though outer() is called the warning is raised for + # inner(): + msg = self.warn_msg(inner, atoms + atoms[0], "'dupgroup'") + with pytest.warns(DuplicateWarning) as w: + assert warn_if_not_unique.warned is False + x = outer(atoms) + # Assert that the "warned" state is restored: + assert warn_if_not_unique.warned is False + # Check correct function execution: + assert x is 0 + # Only one warning must have been raised: + assert len(w) == 1 + assert w[0].message.args[0] == msg + assert w[0].filename == __file__ + + def test_warn_if_not_unique_multiple_references(self, atoms): + ag = atoms + atoms[0] + aag = ag + aaag = aag + + @warn_if_not_unique + def func(group): + return group.isunique + + # Check that the warning message contains the names of all references to + # the group in alphabetic order: + msg = self.warn_msg(func, ag, "'aaag' a.k.a. 'aag' a.k.a. 'ag'") + with pytest.warns(DuplicateWarning) as w: + x = func(ag) + # Assert that the "warned" state is restored: + assert warn_if_not_unique.warned is False + # Check correct function execution: + assert x is False + # Check warning message: + assert w[0].message.args[0] == msg + # Check correct file referenced: + assert w[0].filename == __file__ + + def test_warn_if_not_unique_unnamed(self, atoms): + + @warn_if_not_unique + def func(group): + pass + + msg = self.warn_msg(func, atoms + atoms[0], + "'unnamed {}'".format(atoms.__class__.__name__)) + with pytest.warns(DuplicateWarning) as w: + x = func(atoms + atoms[0]) + # Check warning message: + assert w[0].message.args[0] == msg + + def test_warn_if_not_unique_fails_for_non_groupmethods(self): + + @warn_if_not_unique + def func(group): + pass - + class dummy(object): + pass + + with pytest.raises(AttributeError): + func(dummy()) + + def test_filter_duplicate_with_userwarning(self, atoms): + + @warn_if_not_unique + def func(group): + pass + + with warnings.catch_warnings(record=True) as record: + warnings.resetwarnings() + warnings.filterwarnings("ignore", category=UserWarning) + with pytest.warns(None) as w: + func(atoms) + assert not w.list + assert len(record) == 0 From 20e5ecda5496392ca74109664816695416fd0d97 Mon Sep 17 00:00:00 2001 From: zeman Date: Sat, 9 Jun 2018 23:41:59 +0200 Subject: [PATCH 075/455] fixed test_warn_if_not_unique_unnamed() --- testsuite/MDAnalysisTests/lib/test_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index 91712f04050..4f1243f9deb 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -1257,7 +1257,7 @@ def func(group): msg = self.warn_msg(func, atoms + atoms[0], "'unnamed {}'".format(atoms.__class__.__name__)) with pytest.warns(DuplicateWarning) as w: - x = func(atoms + atoms[0]) + func(atoms + atoms[0]) # Check warning message: assert w[0].message.args[0] == msg From 70b9e9ffd6714229294f2913a59febb4849e33e8 Mon Sep 17 00:00:00 2001 From: zeman Date: Mon, 11 Jun 2018 11:28:45 +0200 Subject: [PATCH 076/455] made test_dres_convergence less likely to fail; removed printf() from CStochasticProximityEmbedding() in spe.c --- .../encore/dimensionality_reduction/src/spe.c | 8 +++---- .../MDAnalysisTests/analysis/test_encore.py | 23 ++++++++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/encore/dimensionality_reduction/src/spe.c b/package/MDAnalysis/analysis/encore/dimensionality_reduction/src/spe.c index bdd414e9578..7d129bcfd79 100644 --- a/package/MDAnalysis/analysis/encore/dimensionality_reduction/src/spe.c +++ b/package/MDAnalysis/analysis/encore/dimensionality_reduction/src/spe.c @@ -193,10 +193,8 @@ double CStochasticProximityEmbedding( double t = 0.0; double finalstress = 0.0; - srand(time(NULL)+getpid()*getpid()); /* random init of d */ - - + srand(time(NULL)+getpid()*getpid()); for (int i=0; i 0) - printf("Cycle %d - Residual stress: %.3f, lambda %.3f\n", i, neighbours_stress(s, d_coords, dim, nelem, rco),lam); + //if (i % stressfreq == 0 && i != 0 && stressfreq > 0) + //printf("Cycle %d - Residual stress: %.3f, lambda %.3f\n", i, neighbours_stress(s, d_coords, dim, nelem, rco),lam); } finalstress = neighbours_stress(s, d_coords, dim, nelem, rco); //printf("Calculation finished. - Residual stress: %.3f\n", finalstress); diff --git a/testsuite/MDAnalysisTests/analysis/test_encore.py b/testsuite/MDAnalysisTests/analysis/test_encore.py index f838d11b1dc..1d0d6c23a48 100644 --- a/testsuite/MDAnalysisTests/analysis/test_encore.py +++ b/testsuite/MDAnalysisTests/analysis/test_encore.py @@ -305,10 +305,27 @@ def test_ces_convergence(self, ens1): err_msg="Unexpected value for Clustering Ensemble similarity in convergence estimation") def test_dres_convergence(self, ens1): - expected_values = [ 0.3, 0.] + # Due to encore.dres_convergence() involving random numbers, the + # following assertion is allowed to fail once. This significantly + # reduces the probability of a random test failure. + expected_values = [0.3, 0.] results = encore.dres_convergence(ens1, 10) - assert_almost_equal(results[:,0], expected_values, decimal=1, - err_msg="Unexpected value for Dim. reduction Ensemble similarity in convergence estimation") + try: + assert_almost_equal(results[:,0], expected_values, decimal=1) + except AssertionError: + # Random test failure is very rare, but repeating the failed test + # just once would only assert that the test passes with 50% + # probability. To be a little safer, we raise a warning and repeat + # the test 10 times: + warnings.warn(message="Test 'test_dres_convergence' failed, " + "repeating test 10 times.", + category=RuntimeWarning) + for i in range(10): + results = encore.dres_convergence(ens1, 10) + assert_almost_equal(results[:,0], expected_values, decimal=1, + err_msg="Unexpected value for Dim. " + "reduction Ensemble similarity in " + "convergence estimation") def test_hes_error_estimation(self, ens1): expected_average = 10 From acf6d1e29f3a78fbcf01a8852d9f7a6ae4a45584 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Thu, 17 May 2018 17:19:46 +0100 Subject: [PATCH 077/455] Added a on-the-fly transformations API and a coordinate translation function (Issue #786) Transformations are applied by the readers, either by being added by the user or passed as a kwarg when instancing the universe; added tests for the modified reader classes: ProtoReader, SingleFrameReader, ChainReader and MemoryReader --- package/CHANGELOG | 4 +- package/MDAnalysis/coordinates/base.py | 95 ++++++++++++++++++- package/MDAnalysis/coordinates/chain.py | 21 +++- package/MDAnalysis/coordinates/memory.py | 21 ++++ package/MDAnalysis/core/universe.py | 11 +++ .../MDAnalysis/transformations/__init__.py | 87 +++++++++++++++++ .../MDAnalysis/transformations/translate.py | 67 +++++++++++++ testsuite/MDAnalysisTests/coordinates/base.py | 66 ++++++++++++- .../coordinates/test_chainreader.py | 47 +++++++++ .../MDAnalysisTests/coordinates/test_gro.py | 8 ++ .../coordinates/test_reader_api.py | 2 + .../MDAnalysisTests/core/test_universe.py | 16 ++++ 12 files changed, 439 insertions(+), 6 deletions(-) create mode 100644 package/MDAnalysis/transformations/__init__.py create mode 100644 package/MDAnalysis/transformations/translate.py diff --git a/package/CHANGELOG b/package/CHANGELOG index b04e990ec39..d4c5251bdb2 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,11 +14,13 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, - VOD555 + VOD555, davidercruz * 0.18.1 Enhancements + * Added a on-the-fly trajectory transformations API and a coordinate translation + function (Issue #786) * Added various duecredit stubs * Import time reduced by a factor two (PR #1881) * added compound kwarg to center, centroid, center_of_geometry, center_of_mass (PR #1903) diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index 1e20769c63d..30ae0911ae6 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -278,6 +278,7 @@ def __init__(self, n_atoms, **kwargs): # set up aux namespace for adding auxiliary data self.aux = Namespace() + @classmethod def from_timestep(cls, other, **kwargs): @@ -1170,6 +1171,7 @@ def __init__(self): # initialise list to store added auxiliary readers in # subclasses should now call super self._auxs = {} + self._transformations=[] def __len__(self): return self.n_frames @@ -1201,6 +1203,9 @@ def next(self): else: for auxname in self.aux_list: ts = self._auxs[auxname].update_ts(ts) + + ts = self._apply_transformations(ts) + return ts def __next__(self): @@ -1356,10 +1361,13 @@ def _read_frame(self, frame): # return ts def _read_frame_with_aux(self, frame): - """Move to *frame*, updating ts with trajectory and auxiliary data.""" + """Move to *frame*, updating ts with trajectory, transformations and auxiliary data.""" ts = self._read_frame(frame) for aux in self.aux_list: ts = self._auxs[aux].update_ts(ts) + + ts = self._apply_transformations(ts) + return ts def _sliced_iter(self, start, stop, step): @@ -1741,7 +1749,67 @@ def get_aux_descriptions(self, auxnames=None): auxnames = self.aux_list descriptions = [self._auxs[aux].get_description() for aux in auxnames] return descriptions - + + @property + def transformations(self): + """ Returns the list of transformations""" + return self._transformations + + @transformations.setter + def transformations(self, transformations): + if not self._transformations: + self._transformations = transformations + else: + raise ValueError("Transformations are already set") + + def add_transformations(self, *transformations): + """ Add all transformations to be applied to the trajectory. + + This function take as list of transformations as an argument. These + transformations are functions that will be called by the Reader and given + a :class:`Timestep` object as argument, which will be transformed and returned + to the Reader. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. + This list can only be modified once, and further calls of this function will + raise an exception. + + .. code-block:: python + + u = MDAnalysis.Universe(topology, coordinates) + workflow = [some_transform, another_transform, this_transform] + u.trajectory.add_transformations(*workflow) + + Parameters + ---------- + transform_list : list + list of all the transformations that will be applied to the coordinates + + See Also + -------- + :mod:`MDAnalysis.transformations` + """ + + try: + self.transformations = transformations + except ValueError: + raise ValueError("Can't add transformations again. Please create new Universe object") + else: + self.ts = self._apply_transformations(self.ts) + + + # call reader here to apply the newly added transformation on the + # current loaded frame? + + def _apply_transformations(self, ts): + """Applies all the transformations given by the user """ + + for transform in self.transformations: + ts = transform(ts) + + return ts + + class ReaderBase(ProtoReader): """Base class for trajectory readers that extends :class:`ProtoReader` with a @@ -2006,3 +2074,26 @@ def close(self): # self.filename. Explicitly setting it to the null action in case # the IOBase.close method is ever changed from that. pass + + def add_transformations(self, *transformations): + """ Adds all the transformations to be applied to the trajectory. + Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + to avoid unintended behaviour where the coordinates of each frame are transformed + multiple times when iterating over the trajectory. + + In this method, the trajectory is modified all at once and once only. + """ + super(SingleFrameReaderBase, self).add_transformations(*transformations) + for transform in self.transformations: + self.ts = transform(self.ts) + + + + def _apply_transformations(self, ts): + """ Applies the transformations to the timestep. + Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + to avoid applying the same transformations multiple times on each frame + """ + + return ts + diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index 9bbefa7ce36..c266fb40805 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -397,4 +397,23 @@ def __repr__(self): nframes=self.n_frames, natoms=self.n_atoms)) - + def add_transformations(self, *transformations): + """ Adds all the transformations to be applied to the trajectory. + Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + to avoid unintended behaviour where the coordinates of each frame are transformed + multiple times when iterating over the trajectory. + + In this method the transformations are added directly to the reader instances and, + thus, will be applied correctly. + """ + super(ChainReader, self).add_transformations(*transformations) + for r in self.readers: + r.add_transformations(*transformations) + + def _apply_transformations(self, ts): + """ Applies the transformations to the timestep. + Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + to avoid applying the same transformations multiple times on each frame + """ + + return ts diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index 6f4fbcbaf88..f308e04821d 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -480,3 +480,24 @@ def __repr__(self): nframes=self.n_frames, natoms=self.n_atoms )) + + def add_transformations(self, *transformations): + """ Adds all the transformations to be applied to the trajectory. + Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + to avoid unintended behaviour where the coordinates of each frame are transformed + multiple times when iterating over the trajectory. + + In this method, the trajectory is modified all at once and once only. + """ + super(MemoryReader, self).add_transformations(*transformations) + for i, ts in enumerate(self): + for transform in self.transformations: + ts = transform(ts) + + def _apply_transformations(self, ts): + """ Applies the transformations to the timestep. + Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + to avoid applying the same transformations multiple times on each frame + """ + + return ts diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index a71ffae184f..f31bbd01d11 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -213,6 +213,10 @@ class Universe(object): Universe to only unpickle if a compatible Universe with matching *anchor_name* is found. Even if *anchor_name* is set *is_anchor* will still be honored when unpickling. + transformations: function or list, optional + Provide a list of transformations that you wish to apply to the + trajectory upon reading. Transformations can be found in + :mod:`MDAnalysis.transformations`, or can be user-created. in_memory After reading in the trajectory, transfer it to an in-memory representations, which allow for manipulation of coordinates. @@ -321,7 +325,13 @@ def __init__(self, *args, **kwargs): if not coordinatefile: coordinatefile = None + self.load_new(coordinatefile, **kwargs) + # parse transformations + trans_arg = kwargs.pop('transformations', None) + if trans_arg: + transforms =[trans_arg] if callable(trans_arg) else trans_arg + self.trajectory.add_transformations(*transforms) # Check for guess_bonds if kwargs.pop('guess_bonds', False): @@ -333,6 +343,7 @@ def __init__(self, *args, **kwargs): self._anchor_name = kwargs.get('anchor_name', None) # Universes are anchors by default self.is_anchor = kwargs.get('is_anchor', True) + def copy(self): """Return an independent copy of this Universe""" diff --git a/package/MDAnalysis/transformations/__init__.py b/package/MDAnalysis/transformations/__init__.py new file mode 100644 index 00000000000..eaf3d0a74eb --- /dev/null +++ b/package/MDAnalysis/transformations/__init__.py @@ -0,0 +1,87 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + + +"""\ +Trajectory transformations --- :mod:`MDAnalysis.transformations` +================================================================= + +The transformations submodule contains a collection of functions to modify the +trajectory. Coordinate transformations, such as PBC corrections and molecule fitting +are often required for some analyses and visualization, and the functions in this +module allow transformations to be applied on-the-fly. +These transformation functions can be called by the user for any given +timestep of the trajectory, added as a workflow using :meth:`add_transformations` +of the :mod:`~MDAnalysis.coordinates.base` module, or upon Universe creation using +the keyword argument `transformations`. Note that in the two latter cases, the +workflow cannot be changed after being defined. + +In addition to the specific arguments that each transformation can take, they also +contain a wrapped function that takes a `Timestep` object as argument. +So, a transformation can be roughly defined as follows: + + def transformations(*args,**kwargs): + # do some things + def wrapped(ts): + # apply changes to the Timestep object + return ts + + return wrapped + + +See `MDAnalysis.transformations.translate` for a simple example. + +Currently implemented transformations are: + + - translate: translate the coordinates of a given trajectory frame by a given vector. + + + +Examples +-------- + +e.g. translate the coordinates of a frame: + + u = MDAnalysis.Universe(topology, trajectory) + new_ts = MDAnalysis.transformations.translate([1,1,1])(u.trajectory.ts) + +e.g. create a workflow and adding it to the trajectory: + + u = MDAnalysis.Universe(topology, trajectory) + workflow = [MDAnalysis.transformations.translate([1,1,1]), + MDAnalysis.transformations.translate([1,2,3])] + u.trajetory.add_transformations(*workflow) + +e.g. giving a workflow as a keyword argument when defining the universe: + + workflow = [MDAnalysis.transformations.translate([1,1,1]), + MDAnalysis.transformations.translate([1,2,3])] + u = MDAnalysis.Universe(topology, trajectory, transformations = *workflow) + + + +""" +from __future__ import absolute_import + +from .translate import translate + + diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py new file mode 100644 index 00000000000..7f2466c7297 --- /dev/null +++ b/package/MDAnalysis/transformations/translate.py @@ -0,0 +1,67 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +"""\ +Translate trajectory --- :mod:`MDAnalysis.transformations.translate` +==================================================================== + +Translate the coordinates of a given trajectory by a given vector. +This is a wrapped function so usage is as the following example: + + ts = MDAnalysis.transformations.translate(vector)(timestep) + +""" +from __future__ import absolute_import + +import numpy as np + +def translate(vector): + """ + Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` + instance by a given vector. + + Example + ------- + ts = MDAnalysis.transformations.translate([1,2,3])(ts) + + Parameters + ---------- + vector: list + coordinates of the vector to which the coordinates will be translated + ts: Timestep + frame that will be transformed + + Returns + ------- + :class:`~MDAnalysis.coordinates.base.Timestep` object + + """ + def wrapped(ts): + if len(vector)>2: + v = np.float32(vector) + ts.positions += v + else: + raise ValueError("{} vector in too short".format(vector)) + + return ts + + return wrapped diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 3ceb2070c82..7d180f4e462 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -30,6 +30,7 @@ import MDAnalysis as mda from MDAnalysis.coordinates.base import Timestep +from MDAnalysis.transformations import translate from MDAnalysis import NoDataError from MDAnalysis.lib.mdamath import triclinic_vectors @@ -208,7 +209,14 @@ def reader(ref): reader.add_auxiliary('lowf', ref.aux_lowf, dt=ref.aux_lowf_dt, initial_time=0, time_selector=None) reader.add_auxiliary('highf', ref.aux_highf, dt=ref.aux_highf_dt, initial_time=0, time_selector=None) return reader - + + @staticmethod + @pytest.fixture() + def transformed(ref): + transformed = ref.reader(ref.trajectory) + transformed.add_transformations(translate([1,1,1]), translate([0,0,0.33])) + return transformed + def test_n_atoms(self, ref, reader): assert_equal(reader.n_atoms, ref.n_atoms) @@ -338,7 +346,61 @@ def test_stop_iter(self, reader): for ts in reader[:-1]: pass assert_equal(reader.frame, 0) - + + def test_transformations_iter(self, ref, transformed): + # test one iteration and see if the transformations are applied + v1 = np.float32((1,1,1)) + v2 = np.float32((0,0,0.33)) + for i, ts in enumerate(transformed): + idealcoords = ref.iter_ts(i).positions + v1 + v2 + assert_array_almost_equal(ts.positions, idealcoords, decimal=ref.prec) + + def test_transformations_2iter(self, ref, transformed): + # Are the transformations applied and + # are the coordinates "overtransformed"? + v1 = np.float32((1,1,1)) + v2 = np.float32((0,0,0.33)) + idealcoords=[] + for i, ts in enumerate(transformed): + idealcoords.append(ref.iter_ts(i).positions + v1 + v2) + assert_array_almost_equal(ts.positions, idealcoords[i], decimal=ref.prec) + + for i, ts in enumerate(transformed): + assert_almost_equal(ts.positions, idealcoords[i], decimal=ref.prec) + + def test_transformations_slice(self, ref, transformed): + # Are the transformations applied when iterating over a slice of the trajectory? + v1 = np.float32((1,1,1)) + v2 = np.float32((0,0,0.33)) + for i,ts in enumerate(transformed[2:3:1]): + idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 + assert_array_almost_equal(ts.positions, idealcoords, decimal = ref.prec) + + + def test_transformations_switch_frame(self, ref, transformed): + # This test checks if the transformations are applied and if the coordinates + # "overtransformed" on different situations + # Are the transformations applied when we switch to a different frame? + v1 = np.float32((1,1,1)) + v2 = np.float32((0,0,0.33)) + first_ideal = ref.iter_ts(0).positions + v1 + v2 + if len(transformed)>1: + assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) + second_ideal = ref.iter_ts(1).positions + v1 + v2 + assert_array_almost_equal(transformed[1].positions, second_ideal, decimal = ref.prec) + + # What if we comeback to the previous frame? + assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) + + # How about we switch the frame to itself? + assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) + else: + assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) + + def test_add_another_transformations_raises_ValueError(self, transformed): + # After defining the transformations, the workflow cannot be changed + with pytest.raises(ValueError): + transformed.add_transformations(translate([2,2,2])) class MultiframeReaderTest(BaseReaderTest): def test_last_frame(self, ref, reader): diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 7cccf375053..39d4da9457b 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -30,6 +30,7 @@ from numpy.testing import (assert_equal, assert_almost_equal, assert_array_almost_equal) import MDAnalysis as mda +from MDAnalysis.transformations import translate from MDAnalysisTests.datafiles import (PDB, PSF, CRD, DCD, GRO, XTC, TRR, PDB_small, PDB_closed) @@ -41,6 +42,12 @@ class TestChainReader(object): def universe(self): return mda.Universe(PSF, [DCD, CRD, DCD, CRD, DCD, CRD, CRD]) + + @pytest.fixture() + def transformed(ref): + return mda.Universe(PSF, + [DCD, CRD, DCD, CRD, DCD, CRD, CRD], + transformations=[translate([10,10,10])]) def test_next_trajectory(self, universe): universe.trajectory.rewind() @@ -115,6 +122,46 @@ def test_write_dcd(self, universe, tmpdir): self.prec, err_msg="Coordinates disagree at frame {0:d}".format( ts_orig.frame)) + + def test_transform_iteration(self, universe, transformed): + vector = np.float32([10,10,10]) + # # Are the transformations applied and + # are the coordinates "overtransformed"? + # iterate once: + for ts in transformed.trajectory: + frame = ts.frame + ref = universe.trajectory[frame].positions + vector + assert_almost_equal(ts.positions, ref, decimal = 6) + # iterate again: + for ts in transformed.trajectory: + frame = ts.frame + ref = universe.trajectory[frame].positions + vector + assert_almost_equal(ts.positions, ref, decimal = 6) + + def test_transform_slice(self, universe, transformed): + vector = np.float32([10,10,10]) + # what happens when we slice the trajectory? + for ts in transformed.trajectory[5:17:3]: + frame = ts.frame + ref = universe.trajectory[frame].positions + vector + assert_almost_equal(ts.positions, ref, decimal = 6) + + def test_transform_switch(self, universe, transformed): + vector = np.float32([10,10,10]) + # grab a frame: + ref = universe.trajectory[2].positions + vector + assert_almost_equal(transformed.trajectory[2].positions, ref, decimal = 6) + # now switch to another frame + newref = universe.trajectory[10].positions + vector + assert_almost_equal(transformed.trajectory[10].positions, newref, decimal = 6) + # what happens when we comeback to the previous frame? + assert_almost_equal(transformed.trajectory[2].positions, ref, decimal = 6) + + def test_transfrom_rewind(self, universe, transformed): + vector = np.float32([10,10,10]) + ref = universe.trajectory[0].positions + vector + transformed.trajectory.rewind() + assert_almost_equal(transformed.trajectory.ts.positions, ref, decimal = 6) class TestChainReaderCommonDt(object): common_dt = 100.0 diff --git a/testsuite/MDAnalysisTests/coordinates/test_gro.py b/testsuite/MDAnalysisTests/coordinates/test_gro.py index 14e7199fab6..f0a7e5ef2fa 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_gro.py +++ b/testsuite/MDAnalysisTests/coordinates/test_gro.py @@ -23,6 +23,7 @@ import MDAnalysis as mda import numpy as np from MDAnalysis.coordinates.GRO import GROReader, GROWriter +from MDAnalysis.transformations import translate from MDAnalysisTests import make_Universe, tempdir from MDAnalysisTests.coordinates.base import ( BaseReference, BaseReaderTest, BaseWriterTest, BaseTimestepTest, @@ -290,6 +291,13 @@ def reader(ref): dt=ref.aux_highf_dt, initial_time=0, time_selector=None) return reader + + @staticmethod + @pytest.fixture(scope='class') + def transformed(ref): + transformed = ref.reader(ref.trajectory, convert_units=False) + transformed.add_transformations(translate([1,1,1]), translate([0,0,0.33])) + return transformed class TestGROWriterNoConversion(BaseWriterTest): diff --git a/testsuite/MDAnalysisTests/coordinates/test_reader_api.py b/testsuite/MDAnalysisTests/coordinates/test_reader_api.py index 840665d72d9..6f236b3e2ac 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_reader_api.py +++ b/testsuite/MDAnalysisTests/coordinates/test_reader_api.py @@ -22,6 +22,7 @@ from __future__ import absolute_import import numpy as np +from collections import OrderedDict from MDAnalysis.coordinates.base import ( Timestep, SingleFrameReaderBase, @@ -43,6 +44,7 @@ def __init__(self, filename, **kwargs): self.n_frames = 10 self.n_atoms = 10 self._auxs = {} + self._transformations = [] # ts isn't a real timestep, but just an integer # whose value represents the frame number (0 based) self.ts = Timestep(self.n_atoms) diff --git a/testsuite/MDAnalysisTests/core/test_universe.py b/testsuite/MDAnalysisTests/core/test_universe.py index d002c56e5a8..d237d03f12d 100644 --- a/testsuite/MDAnalysisTests/core/test_universe.py +++ b/testsuite/MDAnalysisTests/core/test_universe.py @@ -55,6 +55,7 @@ import MDAnalysis as mda import MDAnalysis.coordinates from MDAnalysis.topology.base import TopologyReaderBase +from MDAnalysis.transformations import translate from MDAnalysisTests import assert_nowarns @@ -303,6 +304,21 @@ def test_chainid_quick_select(): assert len(u.C.atoms) == 5 assert len(u.D.atoms) == 7 +class TestTransformations(object): + """Tests the transformations keyword + """ + def test_callable(self): + u = mda.Universe(PSF,DCD, transformations=translate([10,10,10])) + uref = mda.Universe(PSF,DCD) + ref = translate([10,10,10])(uref.trajectory.ts) + assert_almost_equal(u.trajectory.ts.positions, ref, decimal=6) + + def test_list(self): + workflow = [translate([10,10,0]), translate([0,0,10])] + u = mda.Universe(PSF,DCD, transformations=workflow) + uref = mda.Universe(PSF,DCD) + ref = translate([10,10,10])(uref.trajectory.ts) + assert_almost_equal(u.trajectory.ts.positions, ref, decimal=6) class TestGuessMasses(object): """Tests the Mass Guesser in topology.guessers From 74b9d46c5297b57c69cbb3b92c8a260ed287ed33 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sat, 9 Jun 2018 16:43:22 +0100 Subject: [PATCH 078/455] Fixed rewind issue in the SingleFrameReader where the frame would not be re-read from the input file (#1929) Added tests to the rewind method in the context of transformations --- package/CHANGELOG | 1 + package/MDAnalysis/coordinates/base.py | 56 ++++++++++++++----- package/MDAnalysis/coordinates/chain.py | 42 ++++++++++---- package/MDAnalysis/coordinates/memory.py | 44 ++++++++++++--- testsuite/MDAnalysisTests/coordinates/base.py | 22 ++++++++ 5 files changed, 133 insertions(+), 32 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index d4c5251bdb2..7aaaeb1cadc 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -28,6 +28,7 @@ Enhancements functions (PR #1815) Fixes + * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) * Fixed order of indices in Angle/Dihedral/Improper repr * coordinates.memory.MemoryReader now takes np.ndarray only (Issue #1685) * Silenced warning when duecredit is not installed (Issue #1872) diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index 30ae0911ae6..859f7a29c80 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -1795,7 +1795,7 @@ def add_transformations(self, *transformations): except ValueError: raise ValueError("Can't add transformations again. Please create new Universe object") else: - self.ts = self._apply_transformations(self.ts) + self.ts = self._apply_transformations(self.ts) # call reader here to apply the newly added transformation on the @@ -1870,6 +1870,8 @@ def copy(self): """ new = self.__class__(self.filename, n_atoms=self.n_atoms) + if self.transformations: + new.add_transformations(*self.transformations) # seek the new reader to the same frame we started with new[self.ts.frame] # then copy over the current Timestep in case it has @@ -2044,6 +2046,10 @@ def copy(self): new.ts = self.ts.copy() for auxname, auxread in self._auxs.items(): new.add_auxiliary(auxname, auxread.copy()) + # since the transformations have already been applied to the frame + # simply copy the property + new.transformations = self.transformations + return new def _read_first_frame(self): # pragma: no cover @@ -2051,7 +2057,10 @@ def _read_first_frame(self): # pragma: no cover pass def rewind(self): - pass + self._read_first_frame() + for auxname, auxread in self._auxs.items(): + self.ts = auxread.update_ts(self.ts) + super(SingleFrameReaderBase, self)._apply_transformations(self.ts) def _reopen(self): pass @@ -2076,24 +2085,45 @@ def close(self): pass def add_transformations(self, *transformations): - """ Adds all the transformations to be applied to the trajectory. - Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` - to avoid unintended behaviour where the coordinates of each frame are transformed - multiple times when iterating over the trajectory. + """ Add all transformations to be applied to the trajectory. + + This function take as list of transformations as an argument. These + transformations are functions that will be called by the Reader and given + a :class:`Timestep` object as argument, which will be transformed and returned + to the Reader. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. + This list can only be modified once, and further calls of this function will + raise an exception. + + .. code-block:: python + + u = MDAnalysis.Universe(topology, coordinates) + workflow = [some_transform, another_transform, this_transform] + u.trajectory.add_transformations(*workflow) - In this method, the trajectory is modified all at once and once only. + Parameters + ---------- + transform_list : list + list of all the transformations that will be applied to the coordinates + + See Also + -------- + :mod:`MDAnalysis.transformations` """ + #Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + #to avoid unintended behaviour where the coordinates of each frame are transformed + #multiple times when iterating over the trajectory. + #In this method, the trajectory is modified all at once and once only. + super(SingleFrameReaderBase, self).add_transformations(*transformations) for transform in self.transformations: self.ts = transform(self.ts) - - def _apply_transformations(self, ts): - """ Applies the transformations to the timestep. - Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` - to avoid applying the same transformations multiple times on each frame - """ + """ Applies the transformations to the timestep.""" + # Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + # to avoid applying the same transformations multiple times on each frame return ts diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index c266fb40805..612f3526b76 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -398,22 +398,44 @@ def __repr__(self): natoms=self.n_atoms)) def add_transformations(self, *transformations): - """ Adds all the transformations to be applied to the trajectory. - Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` - to avoid unintended behaviour where the coordinates of each frame are transformed - multiple times when iterating over the trajectory. + """ Add all transformations to be applied to the trajectory. - In this method the transformations are added directly to the reader instances and, - thus, will be applied correctly. + This function take as list of transformations as an argument. These + transformations are functions that will be called by the Reader and given + a :class:`Timestep` object as argument, which will be transformed and returned + to the Reader. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. + This list can only be modified once, and further calls of this function will + raise an exception. + + .. code-block:: python + + u = MDAnalysis.Universe(topology, coordinates) + workflow = [some_transform, another_transform, this_transform] + u.trajectory.add_transformations(*workflow) + + Parameters + ---------- + transform_list : list + list of all the transformations that will be applied to the coordinates + + See Also + -------- + :mod:`MDAnalysis.transformations` """ + #Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + #to avoid unintended behaviour where the coordinates of each frame are transformed + #multiple times when iterating over the trajectory. + #In this method, the trajectory is modified all at once and once only. + super(ChainReader, self).add_transformations(*transformations) for r in self.readers: r.add_transformations(*transformations) def _apply_transformations(self, ts): - """ Applies the transformations to the timestep. - Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` - to avoid applying the same transformations multiple times on each frame - """ + """ Applies the transformations to the timestep.""" + # Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + # to avoid applying the same transformations multiple times on each frame return ts diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index f308e04821d..ca02ee805c5 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -339,6 +339,9 @@ def copy(self): new.ts = self.ts.copy() for auxname, auxread in self._auxs.items(): new.add_auxiliary(auxname, auxread.copy()) + # since transformations are already applied to the whole trajectory + # simply copy the property + new.transformations = self.transformations return new @@ -482,22 +485,45 @@ def __repr__(self): )) def add_transformations(self, *transformations): - """ Adds all the transformations to be applied to the trajectory. - Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` - to avoid unintended behaviour where the coordinates of each frame are transformed - multiple times when iterating over the trajectory. + """ Add all transformations to be applied to the trajectory. - In this method, the trajectory is modified all at once and once only. + This function take as list of transformations as an argument. These + transformations are functions that will be called by the Reader and given + a :class:`Timestep` object as argument, which will be transformed and returned + to the Reader. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. + This list can only be modified once, and further calls of this function will + raise an exception. + + .. code-block:: python + + u = MDAnalysis.Universe(topology, coordinates) + workflow = [some_transform, another_transform, this_transform] + u.trajectory.add_transformations(*workflow) + + Parameters + ---------- + transform_list : list + list of all the transformations that will be applied to the coordinates + + See Also + -------- + :mod:`MDAnalysis.transformations` """ + #Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + #to avoid unintended behaviour where the coordinates of each frame are transformed + #multiple times when iterating over the trajectory. + #In this method, the trajectory is modified all at once and once only. + super(MemoryReader, self).add_transformations(*transformations) for i, ts in enumerate(self): for transform in self.transformations: ts = transform(ts) def _apply_transformations(self, ts): - """ Applies the transformations to the timestep. - Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` - to avoid applying the same transformations multiple times on each frame - """ + """ Applies the transformations to the timestep.""" + # Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` + # to avoid applying the same transformations multiple times on each frame return ts diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 7d180f4e462..976caca3476 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -396,6 +396,28 @@ def test_transformations_switch_frame(self, ref, transformed): assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) else: assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) + + def test_transformation_rewind(self,ref, transformed): + # this test checks if the transformations are applied after rewinding the + # trajectory + v1 = np.float32((1,1,1)) + v2 = np.float32((0,0,0.33)) + ideal_coords = ref.iter_ts(0).positions + v1 + v2 + transformed.rewind() + assert_array_almost_equal(transformed[0].positions, ideal_coords, decimal = ref.prec) + + def test_transformations_copy(self,ref,transformed): + # this test checks if transformations are carried over a copy and if the + # coordinates of the copy are equal to the original's + v1 = np.float32((1,1,1)) + v2 = np.float32((0,0,0.33)) + new = transformed.copy() + assert_equal(transformed.transformations, new.transformations, + "transformations are not equal") + for i, ts in enumerate(new): + ideal_coords = ref.iter_ts(i).positions + v1 + v2 + assert_array_almost_equal(ts.positions, ideal_coords, decimal = ref.prec) + def test_add_another_transformations_raises_ValueError(self, transformed): # After defining the transformations, the workflow cannot be changed From fe6dbb6cd9fe73011896d114a042351e438a7a66 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Wed, 13 Jun 2018 18:02:36 +0100 Subject: [PATCH 079/455] Added rotation transformation, tests, docs and update CHANGELOG --- package/CHANGELOG | 1 + .../MDAnalysis/transformations/__init__.py | 4 + package/MDAnalysis/transformations/rotate.py | 115 ++++++++++++++++++ .../transformations/test_rotate.py | 56 +++++++++ 4 files changed, 176 insertions(+) create mode 100644 package/MDAnalysis/transformations/rotate.py create mode 100644 testsuite/MDAnalysisTests/transformations/test_rotate.py diff --git a/package/CHANGELOG b/package/CHANGELOG index 7aaaeb1cadc..7b05f427682 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -19,6 +19,7 @@ The rules for this file: * 0.18.1 Enhancements + * Added a rotation coordinate transformation * Added a on-the-fly trajectory transformations API and a coordinate translation function (Issue #786) * Added various duecredit stubs diff --git a/package/MDAnalysis/transformations/__init__.py b/package/MDAnalysis/transformations/__init__.py index eaf3d0a74eb..c95103ec73b 100644 --- a/package/MDAnalysis/transformations/__init__.py +++ b/package/MDAnalysis/transformations/__init__.py @@ -53,6 +53,8 @@ def wrapped(ts): Currently implemented transformations are: - translate: translate the coordinates of a given trajectory frame by a given vector. + - rotate: rotates the coordinates by a given angle arround an axis formed by a direction + and a point @@ -83,5 +85,7 @@ def wrapped(ts): from __future__ import absolute_import from .translate import translate +from .rotate import rotate + diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py new file mode 100644 index 00000000000..9121e69f8bf --- /dev/null +++ b/package/MDAnalysis/transformations/rotate.py @@ -0,0 +1,115 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +"""\ +Rotate trajectory --- :mod:`MDAnalysis.transformations.translate` +================================================================= + +Rotates the coordinates by a given angle arround an axis formed by a direction and a +point + +""" +from __future__ import absolute_import + +import math +import numpy as np + +from ..lib.transformations import rotation_matrix +from ..core.groups import AtomGroup + +def rotate(angle, direction, center="geometry", **kwargs): + ''' + Rotates the trajectory by a given angle on a given axis. The axis is defined by + the user, combining the direction vector and a position. This position can be the center + of geometry or the center of mass of a user defined AtomGroup, or a list defining custom + coordinates. + e.g. rotate the coordinates by pi/2 on a x axis centered on a given atom group: + + .. code-block:: python + + ts = u.trajectory.ts + angle = math.pi/2 + ag = u.atoms() + rotated = MDAnalysis.transformations.rotate(angle, a)(ts) + + e.g. rotate the coordinates by a custom axis: + + .. code-block:: python + + ts = u.trajectory.ts + angle = math.pi/2 + p = [1,2,3] + d = [0,0,1] + rotated = MDAnalysis.transformations.rotate(angle, point=point, direction=d)(ts) + + Parameters + ---------- + angle: float + rotation angle in radians + direction: list + vector that will define the direction of a custom axis of rotation from the + provided point. + ag: AtomGroup, optional + use this to define the center of mass or geometry as the point from where the + rotation axis will be defined + center: str, optional + used to choose the method of centering on the given atom group. Can be 'geometry' + or 'mass' + pbc: bool or None, optional + If True, all the atoms from the given AtomGroup will be moved to the unit cell + before calculating the center + point: list, optional + list of the coordinates of the point from where a custom axis of rotation will + be defined. + ts: Timestep + frame that will be transformed + + Returns + ------- + :class:`~MDAnalysis.coordinates.base.Timestep` object + + ''' + theta = np.float32(angle) + vector = np.float32(direction) + position = kwargs.pop("position", []) + ag = kwargs.pop("ag", None) + pbc_arg = kwargs.pop("pbc", None) + if len(position)>2: + position = np.float32(position) + elif isinstance(ag, AtomGroup): + if center == "geometry": + position = ag.center_of_geometry(pbc = pbc_arg) + elif center == "mass": + position = ag.center_of_mass(pbc = pbc_arg) + else: + raise ValueError('{} is not a valid argument for center'.format(center)) + else: + raise ValueError('A position or an AtomGroup must be specified') + + def wrapper(ts): + rotation = rotation_matrix(theta, vector, position)[:3, :3] + ts.positions= np.dot(ts.positions, rotation) + + return ts + + return wrapper + \ No newline at end of file diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py new file mode 100644 index 00000000000..a8dc3efc8f3 --- /dev/null +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -0,0 +1,56 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +from __future__ import absolute_import + +import numpy as np +import pytest +import math +from numpy.testing import assert_array_almost_equal + +import MDAnalysis as mda +from MDAnalysis.transformations import rotate +from MDAnalysis.lib.transformations import rotation_matrix +from MDAnalysisTests.datafiles import GRO + +def test_translate_custom_position(): + u = mda.Universe(GRO) + vector = np.float32([1,0,0]) + pos = np.float32([0,0,0]) + matrix = rotation_matrix(math.pi/2, vector, pos)[:3, :3] + ref = u.trajectory.ts + ref.positions = np.dot(ref.positions, matrix) + transformed = rotate(math.pi/2, vector, position = pos)(ref) + assert_array_almost_equal(transformed, ref.positions, decimal=6) + +def test_translate_atomgroup(): + u = mda.Universe(GRO) + vector = np.float32([1,0,0]) + ref_pos = np.float32([52.953686, 44.179996, 29.397898]) + matrix = rotation_matrix(math.pi/2, vector, ref_pos)[:3, :3] + ref = u.trajectory.ts + ref.positions = np.dot(ref.positions, matrix) + selection = u.atoms.select_atoms('resid 1') + transformed = rotate(math.pi/2, vector, ag = selection, center='geometry')(ref) + assert_array_almost_equal(transformed, ref.positions, decimal=6) + + \ No newline at end of file From e47ed4dadeb99904a990260c5fb5ef15e4c7d9e9 Mon Sep 17 00:00:00 2001 From: ayushsuhane Date: Thu, 14 Jun 2018 18:25:39 -0700 Subject: [PATCH 080/455] Clean initial Capped distance feature --- package/MDAnalysis/lib/distances.py | 112 ++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 11ba3c1e112..b16d1a66b6c 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -389,6 +389,118 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): return distances +def capped_distance(reference, configuration, max_cutoff, min_cutoff = 0, box = None, method = None): + """Returns the indices of reference and configuration atoms within a fixed distance + + If a box is supplied, then a minimum image convention is used to evaluate + the distances. + + An optional keyword for the method is provided to allow usage of other + implemented methods. Currently pkdtree and bruteforce can be used. Depending + on the number of particles and distribution, the times may vary significantly. + + Parameters + ----------- + reference : numpy.array of type numpy.float32 + The shape of the reference array should be ``(N, 3)`` + or a (3, ) coordinate. + configuration : numpy.array of type numpy.float32 + All the attributes are similar to reference array. Essentially + second group of atoms. + max_cutoff : float32 + The maximum cutoff distance. Only the pair of indices which + have smaller distance than this cutoff distance will be returned. + min_cutoff : float32 + The lower bound of cutoff. The function will not return the + pairs of indices whose distances are less than this parameter. + box : (optional) array or None, default ``None`` + The dimensions, if provided, must be provided in the same + The unitcell dimesions for this system format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention + is applied if the box is provided. + method : 'bruteforce' or 'pkdtree' or 'None' + Based on benchmarks, checks the suitable method + and search the indices of the selections in relatively + less amount of time. 'bruteforce' can be costly with + large number of coordinates. Another option is + periodic KDTree and can be advantageous with increase in particles. + + Returns + ------- + indices : list + Combination of coordinate indices, one from each + from reference and configuration state such that + distance between them is smaller than cutoff distance + provided as ``cutoff`` in arguments. + + Note + ----- + Currently only supports brute force. Similar methods + can be defined and can be directly linked + to this function. + """ + + if box is not None: + boxtype = _box_check(box) + # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] + if (boxtype == 'tri_box'): + box = triclinic_vectors(box) + if (boxtype == 'tri_vecs_bad'): + box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) + if method is None: + method = _determine_method(reference, configuration, max_cutoff, box = box) + + if method == 'bruteforce': + pairs = _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff = min_cutoff, box = box) + #if method = 'pkdt': + # pairs = _pkdt_capped(reference, configuration, cutoff, box = None) + return pairs + + +def _determine_method(reference, configuration, cutoff, box): + """ + Switch between different methods based on the the optimized time. + All the rules to select the method based on the input can be + incorporated here. + + Returns + ------- + String of the method. supports ``bruteforce`` or ``pkdt`` as of now + + Note + ---- + Just a basic rule based on the number of particles + """ + #if (len(reference) > 1000) or (len(configuration) > 1000): + # return 'pkdt' + return 'bruteforce' + + +def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff = 0, box = None): + """ + Using naive distanc calulations, returns a list + containing the indices with one from each + reference and configuration list, such that the distance between + them is less than the specified cutoff distance + """ + pairs = [] + if reference.shape == (3,): + reference = reference[None, :] + if configuration.shape == (3,): + configuration = configuration[None, :] + + _check_array(reference, 'reference') + _check_array(configuration, 'configuration') + + for i, coords in enumerate(reference): + dist = distance_array(coords[None, :], configuration, box=box)[0] + idx = np.where((dist <= max_cutoff) & (dist > min_cutoff))[0] + for j in idx: + pairs.append((i,j)) + + return pairs + def transform_RtoS(inputcoords, box, backend="serial"): """Transform an array of coordinates from real space to S space (aka lambda space) From 2a7fe588a3fc22c6a6735106960214ad51a8d25b Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Fri, 15 Jun 2018 11:37:41 -0700 Subject: [PATCH 081/455] additional docs for changed group behavior - added docs/versionchanged for AtomGroup.atoms, ResidueGroup.residues, and SegmentGroup.segments - added extensive docs for UpdatingAtomGroup.atoms --- package/MDAnalysis/core/groups.py | 91 +++++++++++++++++-- .../MDAnalysisTests/core/test_segmentgroup.py | 1 - 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index f66874f3a55..a7b53489898 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -1112,18 +1112,18 @@ def pack_into_box(self, box=None, inplace=True): if self.isunique: packed_coords = distances.apply_PBC(ag.positions, box) if inplace: - ag.universe.coord.positions[ag.ix] = packed_coords - return ag.universe.coord.positions[ag.ix] + ag.universe.trajectory.ts.positions[ag.ix] = packed_coords + return ag.universe.trajectory.ts.positions[ag.ix] return packed_coords else: unique_ag = ag.unique unique_ix = unique_ag.ix restore_mask = ag._unique_restore_mask - coords = ag.universe.coord.positions[unique_ix] + coords = ag.universe.trajectory.ts.positions[unique_ix] packed_coords = distances.apply_PBC(coords, box) if inplace: - ag.universe.coord.positions[unique_ix] = packed_coords - return ag.universe.coord.positions[unique_ix[restore_mask]] + ag.universe.trajectory.ts.positions[unique_ix] = packed_coords + return ag.universe.trajectory.ts.positions[unique_ix[restore_mask]] return packed_coords[restore_mask] def wrap(self, compound="atoms", center="com", box=None): @@ -1815,7 +1815,18 @@ def __reduce__(self): @property def atoms(self): - """The :class:`AtomGroup` itself + """The :class:`AtomGroup` itself. + + See Also + -------- + copy : return a true copy of the :class:`AtomGroup` + + + .. versionchanged:: 0.19.0 + In previous versions, this returned a copy, but now + the :class:`AtomGroup` itself is returned. This should + not affect any code but only speed up calculations. + """ return self @@ -2637,6 +2648,17 @@ def n_atoms(self): @property def residues(self): """The :class:`ResidueGroup` itself. + + See Also + -------- + copy : return a true copy of the :class:`ResidueGroup` + + + .. versionchanged:: 0.19.0 + In previous versions, this returned a copy, but now + the :class:`ResidueGroup` itself is returned. This should + not affect any code but only speed up calculations. + """ return self @@ -2816,6 +2838,17 @@ def n_residues(self): @property def segments(self): """The :class:`SegmentGroup` itself. + + See Also + -------- + copy : return a true copy of the :class:`SegmentGroup` + + + .. versionchanged:: 0.19.0 + In previous versions, this returned a copy, but now + the :class:`SegmentGroup` itself is returned. This should + not affect any code but only speed up calculations. + """ return self @@ -3365,6 +3398,52 @@ def __repr__(self): def atoms(self): """Get a *static* :class:`AtomGroup` identical to the group of currently selected :class:`Atoms` in the :class:`UpdatingAtomGroup`. + + + By returning a *static* :class:`AtomGroup` it becomes possible to + compare the contents of the group *between* trajectory frames. See the + Example below. + + + Note + ---- + The :attr:`atoms` attribute of an :class:`UpdatingAtomGroup` behaves + differently from :attr:`AtomGroup.atoms`: the latter returns the + :class:`AtomGroup` itself whereas the former returns a + :class:`AtomGroup` and not an :class:`UpdatingAtomGroup` (for this, use + :meth:`UpdatingAtomGroup.copy`). + + + Example + ------- + The static :attr:`atoms` allows comparison of groups of atoms between + frames. For example, track water molecules that move in and out of a + solvation shell of a protein:: + + u = mda.Universe(TPR, XTC) + water_shell = u.select_atoms("name OW and around 3.5 protein", updating=True) + water_shell_prev = water_shell.atoms + + for ts in u.trajectory: + exchanged = water_shell - water_shell_prev + + print(ts.time, "waters in shell =", water_shell.n_residues) + print(ts.time, "waters that exchanged = ", exchanged.n_residues) + print(ts.time, "waters that remained bound = ", + water_shell.n_residues - exchanged.n_residues) + + water_shell_prev = water_shell.atoms + + By remembering the atoms of the current time step in + `water_shell_prev`, it becomes possible to use the :meth:`subtraction + of AtomGroups` to find the water molecules that + changed. + + + See Also + -------- + copy : return a true copy of the :class:`UpdatingAtomGroup` + """ return self[:] diff --git a/testsuite/MDAnalysisTests/core/test_segmentgroup.py b/testsuite/MDAnalysisTests/core/test_segmentgroup.py index fc45ff9c9b0..09c4588682f 100644 --- a/testsuite/MDAnalysisTests/core/test_segmentgroup.py +++ b/testsuite/MDAnalysisTests/core/test_segmentgroup.py @@ -41,7 +41,6 @@ def universe(): def g(universe): return universe.atoms.segments - def test_newSegmentGroup(universe): """test that slicing a SegmentGroup returns a new SegmentGroup (Issue 135)""" g = universe.atoms.segments From 3bb9a63c97ab0962f1d1dcfc4f953b5b431b8557 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Fri, 15 Jun 2018 18:17:24 -0700 Subject: [PATCH 082/455] fix #1942 Commit 8572d796a95e92bbdaa827325a1ae82e1664dcba broke XTC/TRR reading on macOS. This fixes this issue. Only the development version 0.18.1-dev was affected; the released 0.18.0 did NOT have this bug. --- package/MDAnalysis/lib/formats/src/xdrfile.c | 23 ++++----- testsuite/MDAnalysisTests/coordinates/base.py | 47 +++++++++++-------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/package/MDAnalysis/lib/formats/src/xdrfile.c b/package/MDAnalysis/lib/formats/src/xdrfile.c index 93586e09abd..470bd26fe76 100644 --- a/package/MDAnalysis/lib/formats/src/xdrfile.c +++ b/package/MDAnalysis/lib/formats/src/xdrfile.c @@ -46,14 +46,13 @@ #include -#ifdef __unix__ - #include -#endif - #ifdef _WIN32 - #include +# include +#else /* __unix__ */ +# include #endif + #ifdef HAVE_RPC_XDR_H # include # include @@ -2605,12 +2604,10 @@ xdrstdio_putbytes (XDR *xdrs, char *addr, unsigned int len) static off_t xdrstdio_getpos (XDR *xdrs) { - #ifdef __unix__ - return ftello((FILE *) xdrs->x_private); - #endif - #ifdef _WIN32 return _ftelli64((FILE *) xdrs->x_private); + #else /* __unix__ */ + return ftello((FILE *) xdrs->x_private); #endif } @@ -2623,13 +2620,13 @@ xdrstdio_setpos (XDR *xdrs, off_t pos, int whence) /* We return errno relying on the fact that it is never set to 0 on * success, which means that if an error occurrs it'll never be the same * as exdrOK, and xdr_seek won't be confused.*/ - #ifdef __unix__ - return fseeko((FILE *) xdrs->x_private, pos, whence) < 0 ? errno : exdrOK; - #endif - #ifdef _WIN32 return _fseeki64((FILE *) xdrs->x_private, pos, whence) < 0 ? errno : exdrOK; + #else /* __unix__ */ + return fseeko((FILE *) xdrs->x_private, pos, whence) < 0 ? errno : exdrOK; #endif + + } diff --git a/testsuite/MDAnalysisTests/coordinates/base.py b/testsuite/MDAnalysisTests/coordinates/base.py index 976caca3476..3856b37ff68 100644 --- a/testsuite/MDAnalysisTests/coordinates/base.py +++ b/testsuite/MDAnalysisTests/coordinates/base.py @@ -209,14 +209,14 @@ def reader(ref): reader.add_auxiliary('lowf', ref.aux_lowf, dt=ref.aux_lowf_dt, initial_time=0, time_selector=None) reader.add_auxiliary('highf', ref.aux_highf, dt=ref.aux_highf_dt, initial_time=0, time_selector=None) return reader - + @staticmethod @pytest.fixture() def transformed(ref): transformed = ref.reader(ref.trajectory) transformed.add_transformations(translate([1,1,1]), translate([0,0,0.33])) return transformed - + def test_n_atoms(self, ref, reader): assert_equal(reader.n_atoms, ref.n_atoms) @@ -346,15 +346,15 @@ def test_stop_iter(self, reader): for ts in reader[:-1]: pass assert_equal(reader.frame, 0) - + def test_transformations_iter(self, ref, transformed): # test one iteration and see if the transformations are applied v1 = np.float32((1,1,1)) - v2 = np.float32((0,0,0.33)) + v2 = np.float32((0,0,0.33)) for i, ts in enumerate(transformed): idealcoords = ref.iter_ts(i).positions + v1 + v2 assert_array_almost_equal(ts.positions, idealcoords, decimal=ref.prec) - + def test_transformations_2iter(self, ref, transformed): # Are the transformations applied and # are the coordinates "overtransformed"? @@ -364,10 +364,10 @@ def test_transformations_2iter(self, ref, transformed): for i, ts in enumerate(transformed): idealcoords.append(ref.iter_ts(i).positions + v1 + v2) assert_array_almost_equal(ts.positions, idealcoords[i], decimal=ref.prec) - + for i, ts in enumerate(transformed): assert_almost_equal(ts.positions, idealcoords[i], decimal=ref.prec) - + def test_transformations_slice(self, ref, transformed): # Are the transformations applied when iterating over a slice of the trajectory? v1 = np.float32((1,1,1)) @@ -375,8 +375,8 @@ def test_transformations_slice(self, ref, transformed): for i,ts in enumerate(transformed[2:3:1]): idealcoords = ref.iter_ts(ts.frame).positions + v1 + v2 assert_array_almost_equal(ts.positions, idealcoords, decimal = ref.prec) - - + + def test_transformations_switch_frame(self, ref, transformed): # This test checks if the transformations are applied and if the coordinates # "overtransformed" on different situations @@ -388,10 +388,10 @@ def test_transformations_switch_frame(self, ref, transformed): assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) second_ideal = ref.iter_ts(1).positions + v1 + v2 assert_array_almost_equal(transformed[1].positions, second_ideal, decimal = ref.prec) - + # What if we comeback to the previous frame? assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) - + # How about we switch the frame to itself? assert_array_almost_equal(transformed[0].positions, first_ideal, decimal = ref.prec) else: @@ -405,20 +405,20 @@ def test_transformation_rewind(self,ref, transformed): ideal_coords = ref.iter_ts(0).positions + v1 + v2 transformed.rewind() assert_array_almost_equal(transformed[0].positions, ideal_coords, decimal = ref.prec) - + def test_transformations_copy(self,ref,transformed): # this test checks if transformations are carried over a copy and if the # coordinates of the copy are equal to the original's v1 = np.float32((1,1,1)) v2 = np.float32((0,0,0.33)) new = transformed.copy() - assert_equal(transformed.transformations, new.transformations, + assert_equal(transformed.transformations, new.transformations, "transformations are not equal") for i, ts in enumerate(new): ideal_coords = ref.iter_ts(i).positions + v1 + v2 assert_array_almost_equal(ts.positions, ideal_coords, decimal = ref.prec) - - + + def test_add_another_transformations_raises_ValueError(self, transformed): # After defining the transformations, the workflow cannot be changed with pytest.raises(ValueError): @@ -439,6 +439,15 @@ def test_frame_jump(self, ref, reader): assert_timestep_almost_equal(ts, ref.jump_to_frame, decimal=ref.prec) + def test_frame_jump_issue1942(self, ref, reader): + """Test for issue 1942 (especially XDR on macOS)""" + reader.rewind() + try: + for ii in range(ref.n_frames + 2): + reader[0] + except StopIteration: + pytest.fail("Frame-seeking wrongly iterated (#1942)") + def test_next_gives_second_frame(self, ref, reader): reader = ref.reader(ref.trajectory) ts = reader.next() @@ -623,14 +632,14 @@ class BaseTimestepTest(object): unitcell = np.array([10., 11., 12., 90., 90., 90.]) ref_volume = 1320. # what the volume is after setting newbox uni_args = None - + @pytest.fixture() def ts(self): ts = self.Timestep(self.size) ts.frame += 1 ts.positions = self.refpos return ts - + def test_getitem(self, ts): assert_equal(ts[1], self.refpos[1]) @@ -978,13 +987,13 @@ def _check_copy_slice_slice(self, name, ts): def _check_npint_slice(self, name, ts): for integers in [np.byte, np.short, np.intc, np.int_, np.longlong, - np.intp, np.int8, np.int16, np.int32, np.int64, + np.intp, np.int8, np.int16, np.int32, np.int64, np.ubyte, np.ushort, np.uintc, np.ulonglong, np.uintp, np.uint8, np.uint16, np.uint32, np.uint64]: sl = slice(1, 2, 1) ts2 = ts.copy_slice(slice(integers(1), integers(2), integers(1))) self._check_slice(ts, ts2, sl) - + def _check_slice(self, ts1, ts2, sl): if ts1.has_positions: assert_array_almost_equal(ts1.positions[sl], ts2.positions) From 61e9ed97ce074c0e2028805626c21cd4fb0c6873 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 16 Jun 2018 12:16:22 -0500 Subject: [PATCH 083/455] removed osx and python=3.4 from allowed failures --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa447c96516..ec7592a6efc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -73,8 +73,6 @@ matrix: INSTALL_HOLE="false" allow_failures: - env: NUMPY_VERSION=dev EVENT_TYPE="cron" - - env: PYTHON_VERSION=3.4 - - os: osx before_install: # Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) From 81808d8776faf41e906ee62c72367f71997111e9 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Mon, 18 Jun 2018 12:05:08 +0100 Subject: [PATCH 084/455] changed name to rotateby; fixed typos ; dropped kwargs --- package/MDAnalysis/transformations/__init__.py | 2 +- package/MDAnalysis/transformations/rotate.py | 12 ++++-------- .../MDAnalysisTests/transformations/test_rotate.py | 10 +++++----- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/package/MDAnalysis/transformations/__init__.py b/package/MDAnalysis/transformations/__init__.py index c95103ec73b..3ca410b0e24 100644 --- a/package/MDAnalysis/transformations/__init__.py +++ b/package/MDAnalysis/transformations/__init__.py @@ -85,7 +85,7 @@ def wrapped(ts): from __future__ import absolute_import from .translate import translate -from .rotate import rotate +from .rotate import rotateby diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 9121e69f8bf..2a79ff6a51a 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -36,7 +36,7 @@ from ..lib.transformations import rotation_matrix from ..core.groups import AtomGroup -def rotate(angle, direction, center="geometry", **kwargs): +def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=[]): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a position. This position can be the center @@ -49,7 +49,7 @@ def rotate(angle, direction, center="geometry", **kwargs): ts = u.trajectory.ts angle = math.pi/2 ag = u.atoms() - rotated = MDAnalysis.transformations.rotate(angle, a)(ts) + rotated = MDAnalysis.transformations.rotate(angle, ag)(ts) e.g. rotate the coordinates by a custom axis: @@ -77,11 +77,9 @@ def rotate(angle, direction, center="geometry", **kwargs): pbc: bool or None, optional If True, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center - point: list, optional + position: list, optional list of the coordinates of the point from where a custom axis of rotation will be defined. - ts: Timestep - frame that will be transformed Returns ------- @@ -90,9 +88,7 @@ def rotate(angle, direction, center="geometry", **kwargs): ''' theta = np.float32(angle) vector = np.float32(direction) - position = kwargs.pop("position", []) - ag = kwargs.pop("ag", None) - pbc_arg = kwargs.pop("pbc", None) + pbc_arg = pbc if len(position)>2: position = np.float32(position) elif isinstance(ag, AtomGroup): diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index a8dc3efc8f3..b25c41b4a8f 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -28,21 +28,21 @@ from numpy.testing import assert_array_almost_equal import MDAnalysis as mda -from MDAnalysis.transformations import rotate +from MDAnalysis.transformations import rotateby from MDAnalysis.lib.transformations import rotation_matrix from MDAnalysisTests.datafiles import GRO -def test_translate_custom_position(): +def test_rotate_custom_position(): u = mda.Universe(GRO) vector = np.float32([1,0,0]) pos = np.float32([0,0,0]) matrix = rotation_matrix(math.pi/2, vector, pos)[:3, :3] ref = u.trajectory.ts ref.positions = np.dot(ref.positions, matrix) - transformed = rotate(math.pi/2, vector, position = pos)(ref) + transformed = rotateby(math.pi/2, vector, position = pos)(ref) assert_array_almost_equal(transformed, ref.positions, decimal=6) -def test_translate_atomgroup(): +def test_rotate_atomgroup(): u = mda.Universe(GRO) vector = np.float32([1,0,0]) ref_pos = np.float32([52.953686, 44.179996, 29.397898]) @@ -50,7 +50,7 @@ def test_translate_atomgroup(): ref = u.trajectory.ts ref.positions = np.dot(ref.positions, matrix) selection = u.atoms.select_atoms('resid 1') - transformed = rotate(math.pi/2, vector, ag = selection, center='geometry')(ref) + transformed = rotateby(math.pi/2, vector, ag = selection, center='geometry')(ref) assert_array_almost_equal(transformed, ref.positions, decimal=6) \ No newline at end of file From fc03cad6ac466355fe346a1f5e2176a08e9d5798 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 11:31:25 +0100 Subject: [PATCH 085/455] typecasting to np.float32 causes FLOP errors with rotation_matrix; tests now use make_Universe --- package/MDAnalysis/transformations/rotate.py | 10 ++-- .../transformations/test_rotate.py | 47 +++++++++++-------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 2a79ff6a51a..6c023fd3f1b 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -86,16 +86,16 @@ def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=[] :class:`~MDAnalysis.coordinates.base.Timestep` object ''' - theta = np.float32(angle) - vector = np.float32(direction) + theta = angle + vector = direction pbc_arg = pbc if len(position)>2: - position = np.float32(position) + position = position elif isinstance(ag, AtomGroup): if center == "geometry": - position = ag.center_of_geometry(pbc = pbc_arg) + position = ag.center_of_geometry(pbc=pbc_arg) elif center == "mass": - position = ag.center_of_mass(pbc = pbc_arg) + position = ag.center_of_mass(pbc=pbc_arg) else: raise ValueError('{} is not a valid argument for center'.format(center)) else: diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index b25c41b4a8f..349ceeb4bab 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -24,33 +24,42 @@ import numpy as np import pytest -import math from numpy.testing import assert_array_almost_equal import MDAnalysis as mda from MDAnalysis.transformations import rotateby from MDAnalysis.lib.transformations import rotation_matrix -from MDAnalysisTests.datafiles import GRO +from MDAnalysisTests import make_Universe -def test_rotate_custom_position(): - u = mda.Universe(GRO) - vector = np.float32([1,0,0]) - pos = np.float32([0,0,0]) - matrix = rotation_matrix(math.pi/2, vector, pos)[:3, :3] - ref = u.trajectory.ts +def rotateby_universes(): + # create the Universe objects for the tests + reference = make_Universe(trajectory=True) + transformed = make_Universe(trajectory=True) + return reference, transformed + +def test_rotateby_custom_position(): + # what happens when we use a custom position for the axis of rotation? + ref_u, trans_u = rotateby_universes() + trans = trans_u.trajectory.ts + ref = ref_u.trajectory.ts + vector = [1,0,0] + pos = [0,0,0] + matrix = rotation_matrix(np.pi / 2, vector, pos)[:3, :3] ref.positions = np.dot(ref.positions, matrix) - transformed = rotateby(math.pi/2, vector, position = pos)(ref) - assert_array_almost_equal(transformed, ref.positions, decimal=6) + transformed = rotateby(np.pi / 2, vector, position=pos)(trans) + assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) -def test_rotate_atomgroup(): - u = mda.Universe(GRO) - vector = np.float32([1,0,0]) - ref_pos = np.float32([52.953686, 44.179996, 29.397898]) - matrix = rotation_matrix(math.pi/2, vector, ref_pos)[:3, :3] - ref = u.trajectory.ts +def test_rotateby_atomgroup(): + # what happens when we rotate arround the center of geometry of a residue? + ref_u, trans_u = rotateby_universes() + trans = trans_u.trajectory.ts + ref = ref_u.trajectory.ts + center_pos = [6,7,8] + vector = [1,0,0] + matrix = rotation_matrix(np.pi, vector, center_pos)[:3, :3] ref.positions = np.dot(ref.positions, matrix) - selection = u.atoms.select_atoms('resid 1') - transformed = rotateby(math.pi/2, vector, ag = selection, center='geometry')(ref) - assert_array_almost_equal(transformed, ref.positions, decimal=6) + selection = trans_u.residues[0].atoms + transformed = rotateby(np.pi, vector, ag=selection, center='geometry')(trans) + assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) \ No newline at end of file From fbe09eab442f879a0643661ee2735af65e755f3d Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 11:34:25 +0100 Subject: [PATCH 086/455] some code cleanup --- package/MDAnalysis/transformations/rotate.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 6c023fd3f1b..b7b9828070b 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -86,8 +86,6 @@ def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=[] :class:`~MDAnalysis.coordinates.base.Timestep` object ''' - theta = angle - vector = direction pbc_arg = pbc if len(position)>2: position = position @@ -102,7 +100,7 @@ def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=[] raise ValueError('A position or an AtomGroup must be specified') def wrapper(ts): - rotation = rotation_matrix(theta, vector, position)[:3, :3] + rotation = rotation_matrix(angle, direction, position)[:3, :3] ts.positions= np.dot(ts.positions, rotation) return ts From cfe7b78e40bf4fb6c5c608b923852546966ed0e7 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 15:13:08 +0100 Subject: [PATCH 087/455] more cleanup --- package/MDAnalysis/transformations/rotate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index b7b9828070b..edb6a0b277f 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -99,11 +99,11 @@ def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=[] else: raise ValueError('A position or an AtomGroup must be specified') - def wrapper(ts): + def wrapped(ts): rotation = rotation_matrix(angle, direction, position)[:3, :3] ts.positions= np.dot(ts.positions, rotation) return ts - return wrapper + return wrapped \ No newline at end of file From 76e6b0312ca27edc870b4f93a263f2508391fe5c Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 16:58:49 +0100 Subject: [PATCH 088/455] some fixes; position now defaults to None --- package/MDAnalysis/transformations/rotate.py | 4 ++-- testsuite/MDAnalysisTests/transformations/test_rotate.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index edb6a0b277f..05a0efc29ac 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -36,7 +36,7 @@ from ..lib.transformations import rotation_matrix from ..core.groups import AtomGroup -def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=[]): +def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=None): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a position. This position can be the center @@ -87,7 +87,7 @@ def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=[] ''' pbc_arg = pbc - if len(position)>2: + if position and len(position)>2: position = position elif isinstance(ag, AtomGroup): if center == "geometry": diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 349ceeb4bab..7eb79e60807 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -31,6 +31,7 @@ from MDAnalysis.lib.transformations import rotation_matrix from MDAnalysisTests import make_Universe +@pytest.fixture() def rotateby_universes(): # create the Universe objects for the tests reference = make_Universe(trajectory=True) From 28c8072f9c0140642b65dffdb6eacfa4d6545059 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 19:03:26 +0100 Subject: [PATCH 089/455] added a box centering transformation; added tests ; updated changelog --- package/CHANGELOG | 1 + .../MDAnalysis/transformations/__init__.py | 6 +- .../MDAnalysis/transformations/translate.py | 70 +++++++++++++++++-- .../transformations/test_translate.py | 61 ++++++++++++++++ 4 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 testsuite/MDAnalysisTests/transformations/test_translate.py diff --git a/package/CHANGELOG b/package/CHANGELOG index 7aaaeb1cadc..addedc44211 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -19,6 +19,7 @@ The rules for this file: * 0.18.1 Enhancements + * Added a box centering trajectory transformation * Added a on-the-fly trajectory transformations API and a coordinate translation function (Issue #786) * Added various duecredit stubs diff --git a/package/MDAnalysis/transformations/__init__.py b/package/MDAnalysis/transformations/__init__.py index eaf3d0a74eb..b32a25c8417 100644 --- a/package/MDAnalysis/transformations/__init__.py +++ b/package/MDAnalysis/transformations/__init__.py @@ -53,6 +53,8 @@ def wrapped(ts): Currently implemented transformations are: - translate: translate the coordinates of a given trajectory frame by a given vector. + - rotate: rotates the coordinates by a given angle arround an axis formed by a direction + and a point @@ -82,6 +84,8 @@ def wrapped(ts): """ from __future__ import absolute_import -from .translate import translate +from .translate import translate, center_in_box +from .rotate import rotateby + diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 7f2466c7297..a291b2ea1cf 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -34,6 +34,9 @@ import numpy as np +from ..lib.mdamath import triclinic_vectors +from ..core.groups import AtomGroup + def translate(vector): """ Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` @@ -47,9 +50,7 @@ def translate(vector): ---------- vector: list coordinates of the vector to which the coordinates will be translated - ts: Timestep - frame that will be transformed - + Returns ------- :class:`~MDAnalysis.coordinates.base.Timestep` object @@ -60,8 +61,69 @@ def wrapped(ts): v = np.float32(vector) ts.positions += v else: - raise ValueError("{} vector in too short".format(vector)) + raise ValueError("{} vector is too short".format(vector)) + + return ts + + return wrapped + +def center_in_box(ag, center='geometry', box=None, pbc=None): + """ + Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` + instance so that the center of geometry/mass of the given :class:`~MDAnalysis.core.groups.AtomGroup` + is centered on the unit cell. + + Example + ------- + + .. code-block:: python + + ag = u.residues[1].atoms + ts = MDAnalysis.transformations.center(ag,center='mass')(ts) + + Parameters + ---------- + ag: AtomGroup + atom group to be centered on the unit cell. + center: str, optional + used to choose the method of centering on the given atom group. Can be 'geometry' + or 'mass' + box: array + Box dimensions, can be either orthogonal or triclinic information. + Cell dimensions must be in an identical to format to those returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`, + ``[lx, ly, lz, alpha, beta, gamma]``. If ``None``, uses these + timestep dimensions. + pbc: bool or None, optional + If True, all the atoms from the given AtomGroup will be moved to the unit cell + before calculating the center of mass or geometry + + Returns + ------- + :class:`~MDAnalysis.coordinates.base.Timestep` object + """ + + pbc_arg = pbc + if isinstance(ag, AtomGroup): + if center == "geometry": + ag_center = ag.center_of_geometry(pbc=pbc_arg) + elif center == "mass": + ag_center = ag.center_of_mass(pbc=pbc_arg) + else: + raise ValueError('{} is not a valid argument for center'.format(center)) + else: + raise ValueError('{} is not an AtomGroup object'.format(ag)) + + def wrapped(ts): + if box: + boxcenter = np.sum(triclinic_vectors(box), axis=0) / 2 + else: + boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 + vector = boxcenter - ag_center + translate(vector)(ts) return ts return wrapped + + \ No newline at end of file diff --git a/testsuite/MDAnalysisTests/transformations/test_translate.py b/testsuite/MDAnalysisTests/transformations/test_translate.py new file mode 100644 index 00000000000..5cd88bd3ad2 --- /dev/null +++ b/testsuite/MDAnalysisTests/transformations/test_translate.py @@ -0,0 +1,61 @@ +#-*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +from __future__ import absolute_import + +import numpy as np +import pytest +from numpy.testing import assert_array_almost_equal + +import MDAnalysis as mda +from MDAnalysis.transformations import translate, center_in_box +from MDAnalysisTests import make_Universe + +@pytest.fixture() +def translate_universes(): + # create the Universe objects for the tests + reference = make_Universe(trajectory=True) + transformed = make_Universe(trajectory=True) + transformed.trajectory.ts.dimensions = np.array([372.,373.,374.,90,90,90]) + return reference, transformed + +def test_translate(): + ref_u, trans_u = translate_universes() + ref = ref_u.trajectory.ts + vector = np.float32([1,2,3]) + ref.positions += vector + trans = translate(vector)(trans_u.trajectory.ts) + assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + + +def test_center(): + # what happens when we center the coordinates arround the center of geometry of a residue? + ref_u, trans_u = translate_universes() + ref = ref_u.trajectory.ts + ref_center = np.float32([6,7,8]) + box_center = np.float32([186.,186.5,187.]) + ref.positions += box_center - ref_center + ag = trans_u.residues[0].atoms + trans = center_in_box(ag)(trans_u.trajectory.ts) + assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + + \ No newline at end of file From 60d7195ebbc30e27ccba982fd05acf7a22c616e2 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 19:10:22 +0100 Subject: [PATCH 090/455] cleanup --- package/MDAnalysis/transformations/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/transformations/__init__.py b/package/MDAnalysis/transformations/__init__.py index b32a25c8417..76bf5e29301 100644 --- a/package/MDAnalysis/transformations/__init__.py +++ b/package/MDAnalysis/transformations/__init__.py @@ -53,8 +53,8 @@ def wrapped(ts): Currently implemented transformations are: - translate: translate the coordinates of a given trajectory frame by a given vector. - - rotate: rotates the coordinates by a given angle arround an axis formed by a direction - and a point + - center_in_box: translate the coordinates of a given trajectory frame so that a given + AtomGroup is centered in the unit cell @@ -85,7 +85,6 @@ def wrapped(ts): from __future__ import absolute_import from .translate import translate, center_in_box -from .rotate import rotateby From 1ccb38069b37e508fe51a6677139cf2539839d97 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 19:16:05 +0100 Subject: [PATCH 091/455] improved docs --- package/MDAnalysis/transformations/translate.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index a291b2ea1cf..7873a4ccbe5 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -21,13 +21,13 @@ # """\ -Translate trajectory --- :mod:`MDAnalysis.transformations.translate` -==================================================================== +Trajectory translation --- :mod:`MDAnalysis.transformations.translate` +===================================================================== Translate the coordinates of a given trajectory by a given vector. -This is a wrapped function so usage is as the following example: - - ts = MDAnalysis.transformations.translate(vector)(timestep) +The vector can either be user defined, using the function `translate` +or defined by centering an AtomGroup in the unit cell using the function +`center_in_box` """ from __future__ import absolute_import From d9134faa6aae4aecf9491610759edcd63e1e6236 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Tue, 19 Jun 2018 23:58:42 +0100 Subject: [PATCH 092/455] import division from the future --- package/MDAnalysis/transformations/translate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 7873a4ccbe5..787ef47915f 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -30,7 +30,7 @@ `center_in_box` """ -from __future__ import absolute_import +from __future__ import absolute_import, division import numpy as np From e95b5db4feace81fa8a61a1dd3fc1bb01ff8edcf Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Wed, 20 Jun 2018 19:49:48 +0100 Subject: [PATCH 093/455] clarified exceptions ; moar tests --- .../MDAnalysis/transformations/translate.py | 20 ++-- .../transformations/test_translate.py | 112 ++++++++++++++++-- 2 files changed, 112 insertions(+), 20 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 787ef47915f..51117b32526 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -71,7 +71,8 @@ def center_in_box(ag, center='geometry', box=None, pbc=None): """ Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` instance so that the center of geometry/mass of the given :class:`~MDAnalysis.core.groups.AtomGroup` - is centered on the unit cell. + is centered on the unit cell. The unit cell dimensions are taken from the input Timestep object or + can be defined using the `box` argument. Example ------- @@ -88,7 +89,7 @@ def center_in_box(ag, center='geometry', box=None, pbc=None): center: str, optional used to choose the method of centering on the given atom group. Can be 'geometry' or 'mass' - box: array + box: array, optional Box dimensions, can be either orthogonal or triclinic information. Cell dimensions must be in an identical to format to those returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`, @@ -104,15 +105,18 @@ def center_in_box(ag, center='geometry', box=None, pbc=None): """ pbc_arg = pbc - if isinstance(ag, AtomGroup): - if center == "geometry": + try: + if center == 'geometry': ag_center = ag.center_of_geometry(pbc=pbc_arg) - elif center == "mass": + elif center == 'mass': ag_center = ag.center_of_mass(pbc=pbc_arg) else: raise ValueError('{} is not a valid argument for center'.format(center)) - else: - raise ValueError('{} is not an AtomGroup object'.format(ag)) + except AttributeError: + if center == 'mass': + raise AttributeError('{} is not an AtomGroup object with masses'.format(ag)) + else: + raise ValueError('{} is not an AtomGroup object'.format(ag)) def wrapped(ts): if box: @@ -120,7 +124,7 @@ def wrapped(ts): else: boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 vector = boxcenter - ag_center - translate(vector)(ts) + ts.positions += vector return ts diff --git a/testsuite/MDAnalysisTests/transformations/test_translate.py b/testsuite/MDAnalysisTests/transformations/test_translate.py index 5cd88bd3ad2..51e05020e19 100644 --- a/testsuite/MDAnalysisTests/transformations/test_translate.py +++ b/testsuite/MDAnalysisTests/transformations/test_translate.py @@ -34,28 +34,116 @@ def translate_universes(): # create the Universe objects for the tests reference = make_Universe(trajectory=True) - transformed = make_Universe(trajectory=True) - transformed.trajectory.ts.dimensions = np.array([372.,373.,374.,90,90,90]) + transformed = make_Universe(['masses'], trajectory=True) + transformed.trajectory.ts.dimensions = np.array([372., 373., 374., 90, 90, 90]) return reference, transformed -def test_translate(): - ref_u, trans_u = translate_universes() +def test_translate_coords(translate_universes): + ref_u = translate_universes[0] + trans_u = translate_universes[1] ref = ref_u.trajectory.ts - vector = np.float32([1,2,3]) + vector = np.float32([1, 2, 3]) ref.positions += vector trans = translate(vector)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) - -def test_center(): +def test_translate_vector(translate_universes): + # what happens if the vector argument is smaller than 3? + ts = translate_universes[0].trajectory.ts + vector = [0, 1] + with pytest.raises(ValueError): + translate(vector)(ts) + # what happens if the vector argument is bigger than 3? + vector = [0, 1, 2, 3] + with pytest.raises(ValueError): + translate(vector)(ts) + +def test_center_in_box_args(translate_universes): + # this universe as a box size zero + ts = translate_universes[0].trajectory.ts + ag = translate_universes[0].residues[0].atoms + # what happens if something other than an AtomGroup is given? + bad_ag = 1 + with pytest.raises(ValueError): + center_in_box(bad_ag)(ts) + # what if the box is in the wrong format? + bad_box = [1, 2, 3] + with pytest.raises(ValueError): + center_in_box(ag, box=bad_box)(ts) + # is pbc passed to the center methods? + # if yes it should raise an exception for boxes that are zero in size + with pytest.raises(ValueError): + center_in_box(ag, pbc=True)(ts) + # what if a wrong center type name is passed? + bad_center = "charge" + with pytest.raises(ValueError): + center_in_box(ag, center=bad_center)(ts) + # if the universe has no masses and `mass` is passed as the center arg + bad_center = "mass" + with pytest.raises(AttributeError): + center_in_box(ag, center=bad_center)(ts) + +def test_center_in_box_coords_no_options(translate_universes): # what happens when we center the coordinates arround the center of geometry of a residue? - ref_u, trans_u = translate_universes() + ref_u = translate_universes[0] + trans_u = translate_universes[1] ref = ref_u.trajectory.ts - ref_center = np.float32([6,7,8]) - box_center = np.float32([186.,186.5,187.]) + ref_center = np.float32([6, 7, 8]) + box_center = np.float32([186., 186.5, 187.]) ref.positions += box_center - ref_center ag = trans_u.residues[0].atoms trans = center_in_box(ag)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) - - \ No newline at end of file + +def test_center_in_box_coords_with_pbc(translate_universes): + # what happens when we center the coordinates arround the center of geometry of a residue? + # using pbc into account for center of geometry calculation + ref_u = translate_universes[0] + ref = ref_u.trajectory.ts + trans_u = translate_universes[1] + trans_u.dimensions = [363., 364., 365., 90., 90., 90.] + ag = trans_u.residues[24].atoms + box_center = np.float32([181.5, 182., 182.5]) + ref_center = np.float32([75.6, 75.8, 76.]) + ref.positions += box_center - ref_center + trans = center_in_box(ag, pbc=True)(trans_u.trajectory.ts) + assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + +def test_center_in_box_coords_with_mass(translate_universes): + # using masses for calculating the center of the atomgroup + ref_u = translate_universes[0] + ref = ref_u.trajectory.ts + trans_u = translate_universes[1] + ag = trans_u.residues[24].atoms + box_center = np.float32([186., 186.5, 187.]) + ref_center = ag.center_of_mass() + ref.positions += box_center - ref_center + trans = center_in_box(ag, center="mass")(trans_u.trajectory.ts) + assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + +def test_center_in_box_coords_with_box(translate_universes): + # using masses for calculating the center of the atomgroup + ref_u = translate_universes[0] + ref = ref_u.trajectory.ts + trans_u = translate_universes[1] + ag = trans_u.residues[0].atoms + newbox = [1000, 1000, 1000, 90, 90, 90] + box_center = np.float32([500, 500, 500]) + ref_center = np.float32([6, 7, 8]) + ref.positions += box_center - ref_center + trans = center_in_box(ag, box=newbox)(trans_u.trajectory.ts) + assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + +def test_center_in_box_coords_all_options(translate_universes): + # what happens when we center the coordinates arround the center of geometry of a residue? + # using pbc into account for center of geometry calculation + ref_u = translate_universes[0] + ref = ref_u.trajectory.ts + trans_u = translate_universes[1] + ag = trans_u.residues[24].atoms + newbox = [1000, 1000, 1000, 90, 90, 90] + box_center = np.float32([500, 500, 500]) + ref_center = ag.center_of_mass(pbc=True) + ref.positions += box_center - ref_center + trans = center_in_box(ag, center='mass', pbc=True, box=newbox)(trans_u.trajectory.ts) + assert_array_almost_equal(trans.positions, ref.positions, decimal=6) From cff6c000e4c9b7d67c597e2d943375d952ae6d56 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Thu, 21 Jun 2018 13:46:06 +0100 Subject: [PATCH 094/455] split test on args --- .../transformations/test_translate.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/transformations/test_translate.py b/testsuite/MDAnalysisTests/transformations/test_translate.py index 51e05020e19..67ec5dcd62c 100644 --- a/testsuite/MDAnalysisTests/transformations/test_translate.py +++ b/testsuite/MDAnalysisTests/transformations/test_translate.py @@ -58,7 +58,7 @@ def test_translate_vector(translate_universes): with pytest.raises(ValueError): translate(vector)(ts) -def test_center_in_box_args(translate_universes): +def test_center_in_box_bad_ag(translate_universes): # this universe as a box size zero ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms @@ -66,18 +66,38 @@ def test_center_in_box_args(translate_universes): bad_ag = 1 with pytest.raises(ValueError): center_in_box(bad_ag)(ts) + +def test_center_in_box_bad_box(translate_universes): + # this universe as a box size zero + ts = translate_universes[0].trajectory.ts + ag = translate_universes[0].residues[0].atoms # what if the box is in the wrong format? bad_box = [1, 2, 3] with pytest.raises(ValueError): center_in_box(ag, box=bad_box)(ts) + +def test_center_in_box_bad_box(translate_universes): + # this universe as a box size zero + ts = translate_universes[0].trajectory.ts + ag = translate_universes[0].residues[0].atoms # is pbc passed to the center methods? # if yes it should raise an exception for boxes that are zero in size with pytest.raises(ValueError): center_in_box(ag, pbc=True)(ts) + +def test_center_in_box_bad_box(translate_universes): + # this universe as a box size zero + ts = translate_universes[0].trajectory.ts + ag = translate_universes[0].residues[0].atoms # what if a wrong center type name is passed? - bad_center = "charge" + bad_center = " " with pytest.raises(ValueError): center_in_box(ag, center=bad_center)(ts) + +def test_center_in_box_bad_box(translate_universes): + # this universe as a box size zero + ts = translate_universes[0].trajectory.ts + ag = translate_universes[0].residues[0].atoms # if the universe has no masses and `mass` is passed as the center arg bad_center = "mass" with pytest.raises(AttributeError): From 69be6dc5e9125a311b56566ae182fb8b3d02103e Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 21 Jun 2018 16:44:05 +0100 Subject: [PATCH 095/455] The windows size tau + t was already accounted for in _getMeanOnePoint upstream --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 72f5d14bf04..968659ba5b6 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1285,7 +1285,7 @@ def _NumPart_tau(self, selected, t, tau): """ survivors = set(selected[t]) i = 0 - while (t + i) < t + tau and (t + i) < len(selected): + while (t + i) < t + tau: next = set(selected[t + i]) survivors = survivors.intersection(next) i += 1 From 3e65d43a320ba8c0e64735d76c08129ff3e4d417 Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 21 Jun 2018 17:01:52 +0100 Subject: [PATCH 096/455] Use reverse search for number of survivors. Stop search if no survivors. --- package/MDAnalysis/analysis/waterdynamics.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 968659ba5b6..a8dd38d0e76 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1249,7 +1249,7 @@ def _getMeanOnePoint(self, selected, window_size): """ n = 0 sumDeltaP = 0.0 - for frame_no in range(len(selected) - window_size): + for frame_no in range(len(selected) - window_size - 1): delta = self._getOneDeltaPoint(selected, frame_no, window_size) sumDeltaP += delta n += 1 @@ -1278,15 +1278,15 @@ def _getOneDeltaPoint(self, selected, t, tau): def _NumPart_tau(self, selected, t, tau): """ - Compares the molecules in t selection and t+tau selection and - select only the particles that remain from t to t+tau and - at each point in between. - It returns the number of remaining particles. + Returns the number of particles that persist from t to t + tau. """ + survivors = set(selected[t]) - i = 0 - while (t + i) < t + tau: + # For optimisation, start from t + tau + for i in range(tau, 0, -1): next = set(selected[t + i]) survivors = survivors.intersection(next) - i += 1 + if len(survivors) == 0: + return 0 + return len(survivors) \ No newline at end of file From 48f66501508dfd5e6dffb1e97d3a47bef7fcb42e Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Fri, 22 Jun 2018 01:46:37 +0100 Subject: [PATCH 097/455] transformations now appear in the dev-doc --- .../MDAnalysis/transformations/__init__.py | 23 ++++--- .../MDAnalysis/transformations/translate.py | 13 ++-- .../trajectory_transformations.rst | 69 +++++++++++++++++++ .../transformations/translate.rst | 1 + package/doc/sphinx/source/index.rst | 1 + 5 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst create mode 100644 package/doc/sphinx/source/documentation_pages/transformations/translate.rst diff --git a/package/MDAnalysis/transformations/__init__.py b/package/MDAnalysis/transformations/__init__.py index eaf3d0a74eb..500bfce2621 100644 --- a/package/MDAnalysis/transformations/__init__.py +++ b/package/MDAnalysis/transformations/__init__.py @@ -22,8 +22,8 @@ """\ -Trajectory transformations --- :mod:`MDAnalysis.transformations` -================================================================= +Trajectory transformations --- :mod:`MDAnalysis.transformations` +================================================================ The transformations submodule contains a collection of functions to modify the trajectory. Coordinate transformations, such as PBC corrections and molecule fitting @@ -39,6 +39,8 @@ contain a wrapped function that takes a `Timestep` object as argument. So, a transformation can be roughly defined as follows: +.. code-block:: python + def transformations(*args,**kwargs): # do some things def wrapped(ts): @@ -48,38 +50,39 @@ def wrapped(ts): return wrapped -See `MDAnalysis.transformations.translate` for a simple example. - -Currently implemented transformations are: - - - translate: translate the coordinates of a given trajectory frame by a given vector. - +See :func:`MDAnalysis.transformations.translate` for a simple example. Examples -------- e.g. translate the coordinates of a frame: - + +.. code-block:: python + u = MDAnalysis.Universe(topology, trajectory) new_ts = MDAnalysis.transformations.translate([1,1,1])(u.trajectory.ts) e.g. create a workflow and adding it to the trajectory: +.. code-block:: python + u = MDAnalysis.Universe(topology, trajectory) workflow = [MDAnalysis.transformations.translate([1,1,1]), MDAnalysis.transformations.translate([1,2,3])] u.trajetory.add_transformations(*workflow) e.g. giving a workflow as a keyword argument when defining the universe: + +.. code-block:: python workflow = [MDAnalysis.transformations.translate([1,1,1]), MDAnalysis.transformations.translate([1,2,3])] u = MDAnalysis.Universe(topology, trajectory, transformations = *workflow) - """ + from __future__ import absolute_import from .translate import translate diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 7f2466c7297..8c8e56ba511 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -21,13 +21,13 @@ # """\ -Translate trajectory --- :mod:`MDAnalysis.transformations.translate` -==================================================================== +Translations --- :mod:`MDAnalysis.transformations.translate` +============================================================ Translate the coordinates of a given trajectory by a given vector. -This is a wrapped function so usage is as the following example: - ts = MDAnalysis.transformations.translate(vector)(timestep) +.. autofunction:: translate + """ from __future__ import absolute_import @@ -41,13 +41,16 @@ def translate(vector): Example ------- + + .. code-block:: python + ts = MDAnalysis.transformations.translate([1,2,3])(ts) Parameters ---------- vector: list coordinates of the vector to which the coordinates will be translated - ts: Timestep + ts: :class:`~MDAnalysis.coordinates.base.Timestep` frame that will be transformed Returns diff --git a/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst new file mode 100644 index 00000000000..81aa10474b6 --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst @@ -0,0 +1,69 @@ +.. Contains the formatted docstrings for the transformations located in 'mdanalysis/MDAnalysis/transformations' +.. _transformations: + +************************** +Trajectory transformations +************************** + +.. module:: MDAnalysis.transformations + +The transformations submodule contains a collection of functions to modify the +trajectory. Coordinate transformations, such as PBC corrections and molecule fitting +are often required for some analyses and visualization, and the functions in this +module allow transformations to be applied on-the-fly. +These transformation functions can be called by the user for any given +timestep of the trajectory, added as a workflow using :meth:`add_transformations` +of the :mod:`~MDAnalysis.coordinates.base` module, or upon Universe creation using +the keyword argument `transformations`. Note that in the two latter cases, the +workflow cannot be changed after being defined. + +In addition to the specific arguments that each transformation can take, they also +contain a wrapped function that takes a `Timestep` object as argument. +So, a transformation can be roughly defined as follows: + +.. code-block:: python + + def transformations(*args,**kwargs): + # do some things + def wrapped(ts): + # apply changes to the Timestep object + return ts + + return wrapped + + +See :func:`MDAnalysis.transformations.translate` for a simple example. + + +.. rubric:: Examples + +e.g. translate the coordinates of a frame: + +.. code-block:: python + + u = MDAnalysis.Universe(topology, trajectory) + new_ts = MDAnalysis.transformations.translate([1,1,1])(u.trajectory.ts) + +e.g. create a workflow and adding it to the trajectory: + +.. code-block:: python + + u = MDAnalysis.Universe(topology, trajectory) + workflow = [MDAnalysis.transformations.translate([1,1,1]), + MDAnalysis.transformations.translate([1,2,3])] + u.trajetory.add_transformations(*workflow) + +e.g. giving a workflow as a keyword argument when defining the universe: + +.. code-block:: python + + workflow = [MDAnalysis.transformations.translate([1,1,1]), + MDAnalysis.transformations.translate([1,2,3])] + u = MDAnalysis.Universe(topology, trajectory, transformations = *workflow) + + +.. rubric:: Currently implemented transformations + +.. toctree:: + + ./transformations/translate diff --git a/package/doc/sphinx/source/documentation_pages/transformations/translate.rst b/package/doc/sphinx/source/documentation_pages/transformations/translate.rst new file mode 100644 index 00000000000..78eb247cee9 --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/transformations/translate.rst @@ -0,0 +1 @@ +.. automodule:: MDAnalysis.transformations.translate \ No newline at end of file diff --git a/package/doc/sphinx/source/index.rst b/package/doc/sphinx/source/index.rst index bb3441bb698..df6cfe74f45 100644 --- a/package/doc/sphinx/source/index.rst +++ b/package/doc/sphinx/source/index.rst @@ -170,6 +170,7 @@ Thank you! ./documentation_pages/analysis_modules ./documentation_pages/topology_modules ./documentation_pages/coordinates_modules + ./documentation_pages/trajectory_transformations ./documentation_pages/selections_modules ./documentation_pages/auxiliary_modules ./documentation_pages/core_modules From 40991870390115cad6d896398c542a226c493861 Mon Sep 17 00:00:00 2001 From: p-j-smith Date: Fri, 22 Jun 2018 16:34:39 +0100 Subject: [PATCH 098/455] Optimised calculation of survival probability. Atom selections at each frame are now stored as sets rather than lists, so determining the intersection of selections is faster. Survival probability is now calculated by a single function. --- package/MDAnalysis/analysis/waterdynamics.py | 82 +++++--------------- 1 file changed, 21 insertions(+), 61 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 72f5d14bf04..5c050ebc3fc 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1218,75 +1218,35 @@ def __init__(self, universe, selection, t0, tf, dtmax): def run(self): - """Analyze trajectory and produce timeseries""" - - # select all frames to an array - selected = self._selection_serial(self.universe, self.selection) + """ + Analyze trajectory and produce timeseries of the survival probability. + """ + + # select all survivors to an array of sets + selected = [] + for ts in self.universe.trajectory[self.t0:self.tf]: + selected.append(set(self.universe.select_atoms(self.selection))) if len(selected) < self.dtmax: - print ("ERROR: Cannot select fewer frames than dtmax") + print("ERROR: Cannot select fewer frames than dtmax") return - for window_size in list(range(1, self.dtmax + 1)): - output = self._getMeanOnePoint(selected, window_size) - self.timeseries.append(output) + + for tau in list(range(1, self.dtmax + 1): + deltaP = [] + for t in range(len(selected) - tau): - def _selection_serial(self, universe, selection_str): - selected = [] - pm = ProgressMeter(self.tf-self.t0, interval=10, - verbose=True, offset=-self.t0) - for ts in universe.trajectory[self.t0:self.tf]: - selected.append(universe.select_atoms(selection_str)) - pm.echo(ts.frame) - return selected + Nt = float(len(selected[t])) + if Nt == 0: + continue - def _getMeanOnePoint(self, selected, window_size): - """ - This function gets one point of the plot P(t) vs t. It uses the - _getOneDeltaPoint() function to calculate the average. - """ - n = 0 - sumDeltaP = 0.0 - for frame_no in range(len(selected) - window_size): - delta = self._getOneDeltaPoint(selected, frame_no, window_size) - sumDeltaP += delta - n += 1 - - return sumDeltaP/n - - - def _getOneDeltaPoint(self, selected, t, tau): - """ - Gives one point to calculate the mean and - gets one point of the plot C_vect vs t. - - Ex: t=1 and tau=1 calculates - how many selected water molecules survive from the frame 1 to 2 - - Ex: t=5 and tau=3 calculates - how many selected water molecules survive from the frame 5 to 8 - """ + Ntau = len(set.intersection(*selected[t:t+tau] - Nt = len(selected[t]) - if Nt == 0: - return 0 - - # fraction of water molecules that survived - Ntau = self._NumPart_tau(selected, t, tau) - return Ntau/Nt + # store survival probability at each t + deltaP.append(Ntau / Nt) + # store mean survival probability for each tau + self.timeseries.append(np.mean(np.asarray(deltaP))) - def _NumPart_tau(self, selected, t, tau): - """ - Compares the molecules in t selection and t+tau selection and - select only the particles that remain from t to t+tau and - at each point in between. - It returns the number of remaining particles. - """ - survivors = set(selected[t]) - i = 0 - while (t + i) < t + tau and (t + i) < len(selected): - next = set(selected[t + i]) - survivors = survivors.intersection(next) - i += 1 - return len(survivors) \ No newline at end of file From 967a569665ae116d81f0eae46c3e68dc4bcd512f Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 22 Jun 2018 17:14:13 +0100 Subject: [PATCH 099/455] Syntax errors --- package/MDAnalysis/analysis/waterdynamics.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 5c050ebc3fc..f2b22b41c80 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1232,8 +1232,7 @@ def run(self): return - for tau in list(range(1, self.dtmax + 1): - + for tau in list(range(1, self.dtmax + 1)): deltaP = [] for t in range(len(selected) - tau): @@ -1242,7 +1241,7 @@ def run(self): if Nt == 0: continue - Ntau = len(set.intersection(*selected[t:t+tau] + Ntau = len(set.intersection(*selected[t:t+tau])) # store survival probability at each t deltaP.append(Ntau / Nt) From bf2faa98c5cbe1f6e153c9ae266eebef5d35dbb5 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Fri, 22 Jun 2018 23:03:03 +0100 Subject: [PATCH 100/455] replaced box with point; updated tests; fixed some typos --- .../MDAnalysis/transformations/translate.py | 19 ++++++++------- .../transformations/test_translate.py | 24 +++++++++---------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 51117b32526..dc049a85b62 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -67,7 +67,7 @@ def wrapped(ts): return wrapped -def center_in_box(ag, center='geometry', box=None, pbc=None): +def center_in_box(ag, center='geometry', point=None, pbc=None): """ Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` instance so that the center of geometry/mass of the given :class:`~MDAnalysis.core.groups.AtomGroup` @@ -89,12 +89,10 @@ def center_in_box(ag, center='geometry', box=None, pbc=None): center: str, optional used to choose the method of centering on the given atom group. Can be 'geometry' or 'mass' - box: array, optional - Box dimensions, can be either orthogonal or triclinic information. - Cell dimensions must be in an identical to format to those returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`, - ``[lx, ly, lz, alpha, beta, gamma]``. If ``None``, uses these - timestep dimensions. + point: list, optional + overrides the unit cell center - the coordinates of the Timestep are translated so + that the center of mass/geometry of the given AtomGroup is aligned to this position + instead. Defined as a list of size 3. Example: [1, 2, 3] pbc: bool or None, optional If True, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry @@ -119,8 +117,11 @@ def center_in_box(ag, center='geometry', box=None, pbc=None): raise ValueError('{} is not an AtomGroup object'.format(ag)) def wrapped(ts): - if box: - boxcenter = np.sum(triclinic_vectors(box), axis=0) / 2 + if point: + if len(point)==3: + boxcenter = np.float32(point) + else: + raise ValueError('{} is not a valid point'.format(point)) else: boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 vector = boxcenter - ag_center diff --git a/testsuite/MDAnalysisTests/transformations/test_translate.py b/testsuite/MDAnalysisTests/transformations/test_translate.py index 67ec5dcd62c..8303ae624f0 100644 --- a/testsuite/MDAnalysisTests/transformations/test_translate.py +++ b/testsuite/MDAnalysisTests/transformations/test_translate.py @@ -67,16 +67,16 @@ def test_center_in_box_bad_ag(translate_universes): with pytest.raises(ValueError): center_in_box(bad_ag)(ts) -def test_center_in_box_bad_box(translate_universes): +def test_center_in_box_bad_point(translate_universes): # this universe as a box size zero ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms # what if the box is in the wrong format? - bad_box = [1, 2, 3] + bad_point = [1] with pytest.raises(ValueError): - center_in_box(ag, box=bad_box)(ts) + center_in_box(ag, point=bad_point)(ts) -def test_center_in_box_bad_box(translate_universes): +def test_center_in_box_bad_pbc(translate_universes): # this universe as a box size zero ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms @@ -85,7 +85,7 @@ def test_center_in_box_bad_box(translate_universes): with pytest.raises(ValueError): center_in_box(ag, pbc=True)(ts) -def test_center_in_box_bad_box(translate_universes): +def test_center_in_box_bad_center(translate_universes): # this universe as a box size zero ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms @@ -94,7 +94,7 @@ def test_center_in_box_bad_box(translate_universes): with pytest.raises(ValueError): center_in_box(ag, center=bad_center)(ts) -def test_center_in_box_bad_box(translate_universes): +def test_center_in_box_no_masses(translate_universes): # this universe as a box size zero ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms @@ -147,11 +147,11 @@ def test_center_in_box_coords_with_box(translate_universes): ref = ref_u.trajectory.ts trans_u = translate_universes[1] ag = trans_u.residues[0].atoms - newbox = [1000, 1000, 1000, 90, 90, 90] - box_center = np.float32([500, 500, 500]) + newpoint = [1000, 1000, 1000] + box_center = np.float32(newpoint) ref_center = np.float32([6, 7, 8]) ref.positions += box_center - ref_center - trans = center_in_box(ag, box=newbox)(trans_u.trajectory.ts) + trans = center_in_box(ag, point=newpoint)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) def test_center_in_box_coords_all_options(translate_universes): @@ -161,9 +161,9 @@ def test_center_in_box_coords_all_options(translate_universes): ref = ref_u.trajectory.ts trans_u = translate_universes[1] ag = trans_u.residues[24].atoms - newbox = [1000, 1000, 1000, 90, 90, 90] - box_center = np.float32([500, 500, 500]) + newpoint = [1000, 1000, 1000] + box_center = np.float32(newpoint) ref_center = ag.center_of_mass(pbc=True) ref.positions += box_center - ref_center - trans = center_in_box(ag, center='mass', pbc=True, box=newbox)(trans_u.trajectory.ts) + trans = center_in_box(ag, center='mass', pbc=True, point=newpoint)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) From 1cdda248501ef2c19a57e817ce5644b2eb08ada7 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Fri, 22 Jun 2018 23:47:11 +0100 Subject: [PATCH 101/455] added more examples; fixed typos --- .../trajectory_transformations.rst | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst index 81aa10474b6..9a491d03cc5 100644 --- a/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst +++ b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst @@ -17,19 +17,48 @@ of the :mod:`~MDAnalysis.coordinates.base` module, or upon Universe creation usi the keyword argument `transformations`. Note that in the two latter cases, the workflow cannot be changed after being defined. -In addition to the specific arguments that each transformation can take, they also -contain a wrapped function that takes a `Timestep` object as argument. +A simple transformation that takes no other arguments but the `Timestep`can be defined +as the following example: + +.. code-block:: python + + def up_by_2(ts): + """ + Translate all coordinates by 2 Šup along the Z dimension. + """ + ts.positions = ts.positions + np.array([0, 0, 2], dtype=np.float32) + return ts + + +If the transformation requires other arguments besides the `Timestep`, the transformation +takes these arguments, while a wrapped function takes the `Timestep` object as +argument. So, a transformation can be roughly defined as follows: .. code-block:: python - def transformations(*args,**kwargs): - # do some things - def wrapped(ts): - # apply changes to the Timestep object - return ts - - return wrapped + def up_by_x(distance): + """ + Creates a transformation that will translate all coordinates by a given amount along the Z dimension. + """ + def wrapped(ts): + ts.positions = ts.positions + np.array([0, 0, distance], dtype=np.float32) + return ts + return wrapped + + +An alternative to using a wrapped function is using partials from :mod:`functools`. The +above function can be written as: + +.. code-block:: python + + import functools + + def up_by_x(ts, distance): + ts.positions = ts.positions + np.array([0, 0, distance], dtype=np.float32) + return ts + + up_by_2 = functools.partial(up_by_x, distance=2) See :func:`MDAnalysis.transformations.translate` for a simple example. @@ -37,7 +66,7 @@ See :func:`MDAnalysis.transformations.translate` for a simple example. .. rubric:: Examples -e.g. translate the coordinates of a frame: +Translating the coordinates of a frame: .. code-block:: python @@ -51,7 +80,7 @@ e.g. create a workflow and adding it to the trajectory: u = MDAnalysis.Universe(topology, trajectory) workflow = [MDAnalysis.transformations.translate([1,1,1]), MDAnalysis.transformations.translate([1,2,3])] - u.trajetory.add_transformations(*workflow) + u.trajcetory.add_transformations(*workflow) e.g. giving a workflow as a keyword argument when defining the universe: From de3d80e1122801f8e64865c83f674c0c2b3e6fb2 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Fri, 22 Jun 2018 17:39:42 -0700 Subject: [PATCH 102/455] fix MODEL format in PDB writing - fixes #1950 - MODEL number is now written in columns 11-14 (right aligned) instead starting in column 15; the maximum allowed number of digits is 4 (max 9999), as per PDB standard http://www.wwpdb.org/documentation/file-format-content/format33/sect9.html#MODEL - added test --- package/CHANGELOG | 1 + package/MDAnalysis/coordinates/PDB.py | 2 +- .../MDAnalysisTests/coordinates/test_pdb.py | 30 +++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 1e3f317ea3d..0520c1657f6 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -43,6 +43,7 @@ Fixes * Groups passed to select_atoms() are now type checked (Issue #1852) * Fixed inconsistent handling of groups with/without duplicates in pack_into_box() (Issue #1911) + * Fixed format of MODEL number in PDB file writing (Issue #1950) Changes * TopologyAttrs are now statically typed (Issue #1876) diff --git a/package/MDAnalysis/coordinates/PDB.py b/package/MDAnalysis/coordinates/PDB.py index 83875418fa7..4a659e7a968 100644 --- a/package/MDAnalysis/coordinates/PDB.py +++ b/package/MDAnalysis/coordinates/PDB.py @@ -466,7 +466,7 @@ class PDBWriter(base.WriterBase): 'COMPND': "COMPND {0}\n", 'HEADER': "HEADER {0}\n", 'TITLE': "TITLE {0}\n", - 'MODEL': "MODEL {0:5d}\n", + 'MODEL': "MODEL {0:>4d}\n", 'NUMMDL': "NUMMDL {0:5d}\n", 'ENDMDL': "ENDMDL\n", 'END': "END\n", diff --git a/testsuite/MDAnalysisTests/coordinates/test_pdb.py b/testsuite/MDAnalysisTests/coordinates/test_pdb.py index 355330e44c9..ca200298ff4 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pdb.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pdb.py @@ -184,7 +184,6 @@ def test_writer(self): err_msg="Writing PDB file with PDBWriter " "does not reproduce original coordinates") - def test_writer_no_resnames(self): self.u_no_resnames.atoms.write(self.outfile) u = mda.Universe(self.outfile) @@ -290,15 +289,14 @@ def test_check_coordinate_limits_max(self): u.atoms.write(self.outfile) del u - def test_check_header_title_multiframe(self): + def test_check_HEADER_TITLE_multiframe(self): """Check whether HEADER and TITLE are written just once in a multi- frame PDB file (Issue 741)""" u = mda.Universe(PSF, DCD) - pdb = mda.Writer(self.outfile, multiframe=True) protein = u.select_atoms("protein and name CA") - for ts in u.trajectory[:5]: - pdb.write(protein) - pdb.close() + with mda.Writer(self.outfile, multiframe=True) as pdb: + for ts in u.trajectory[:5]: + pdb.write(protein) with open(self.outfile) as f: got_header = 0 @@ -311,6 +309,26 @@ def test_check_header_title_multiframe(self): got_title += 1 assert got_title <= 1, "There should be only one TITLE." + def test_check_MODEL_multiframe(self, maxframes=12): + """Check whether MODEL number is in the right column (Issue #1950)""" + u = mda.Universe(PSF, DCD) + protein = u.select_atoms("protein and name CA") + with mda.Writer(self.outfile, multiframe=True) as pdb: + for ts in u.trajectory[:maxframes]: + pdb.write(protein) + + def get_MODEL_lines(filename): + with open(filename) as pdb: + for line in pdb: + if line.startswith("MODEL"): + yield line + + MODEL_lines = list(get_MODEL_lines(self.outfile)) + + assert len(MODEL_lines) == maxframes + for model, line in enumerate(MODEL_lines, start=1): + assert line[10:14] == "{0:>4d}".format(model) + class TestMultiPDBReader(TestCase): def setUp(self): From aae393592b95e9558a248039e7ac72cfe90abc05 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sat, 23 Jun 2018 14:18:04 +0100 Subject: [PATCH 103/455] angstrom symbol in code-block was causing errors --- .../trajectory_transformations.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst index 9a491d03cc5..71599ff44f9 100644 --- a/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst +++ b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst @@ -17,14 +17,14 @@ of the :mod:`~MDAnalysis.coordinates.base` module, or upon Universe creation usi the keyword argument `transformations`. Note that in the two latter cases, the workflow cannot be changed after being defined. -A simple transformation that takes no other arguments but the `Timestep`can be defined +A simple transformation that takes no other arguments but the `Timestep` can be defined as the following example: .. code-block:: python - def up_by_2(ts): + def up_by_2(ts): """ - Translate all coordinates by 2 Šup along the Z dimension. + Translate all coordinates by 2 angstroms up along the Z dimension. """ ts.positions = ts.positions + np.array([0, 0, 2], dtype=np.float32) return ts @@ -52,13 +52,13 @@ above function can be written as: .. code-block:: python - import functools + import functools - def up_by_x(ts, distance): + def up_by_x(ts, distance): ts.positions = ts.positions + np.array([0, 0, distance], dtype=np.float32) return ts - up_by_2 = functools.partial(up_by_x, distance=2) + up_by_2 = functools.partial(up_by_x, distance=2) See :func:`MDAnalysis.transformations.translate` for a simple example. From 51709beb07082c7d2821cb692c58890ba6eac2f7 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sat, 23 Jun 2018 14:46:19 +0100 Subject: [PATCH 104/455] atom group center is now calculated inside wrapped ; updated changelog --- package/CHANGELOG | 2 +- package/MDAnalysis/transformations/translate.py | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index addedc44211..237e04103a6 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -19,7 +19,7 @@ The rules for this file: * 0.18.1 Enhancements - * Added a box centering trajectory transformation + * Added a box centering trajectory transformation (PR #1946) * Added a on-the-fly trajectory transformations API and a coordinate translation function (Issue #786) * Added various duecredit stubs diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index dc049a85b62..7fc73f5ae16 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -33,6 +33,7 @@ from __future__ import absolute_import, division import numpy as np +from functools import partial from ..lib.mdamath import triclinic_vectors from ..core.groups import AtomGroup @@ -48,7 +49,7 @@ def translate(vector): Parameters ---------- - vector: list + vector: array-like coordinates of the vector to which the coordinates will be translated Returns @@ -89,10 +90,10 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): center: str, optional used to choose the method of centering on the given atom group. Can be 'geometry' or 'mass' - point: list, optional + point: array-like, optional overrides the unit cell center - the coordinates of the Timestep are translated so that the center of mass/geometry of the given AtomGroup is aligned to this position - instead. Defined as a list of size 3. Example: [1, 2, 3] + instead. Defined as an array of size 3. Example: [1, 2, 3] pbc: bool or None, optional If True, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry @@ -105,9 +106,9 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): pbc_arg = pbc try: if center == 'geometry': - ag_center = ag.center_of_geometry(pbc=pbc_arg) + center_method = partial(ag.center_of_geometry, pbc=pbc_arg) elif center == 'mass': - ag_center = ag.center_of_mass(pbc=pbc_arg) + center_method = partial(ag.center_of_mass, pbc=pbc_arg) else: raise ValueError('{} is not a valid argument for center'.format(center)) except AttributeError: @@ -115,8 +116,9 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): raise AttributeError('{} is not an AtomGroup object with masses'.format(ag)) else: raise ValueError('{} is not an AtomGroup object'.format(ag)) - + def wrapped(ts): + ag_center = center_method() if point: if len(point)==3: boxcenter = np.float32(point) From 52d9fa073355133c028618a35f6f9dbc8b04f38f Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Fri, 22 Jun 2018 18:42:20 -0700 Subject: [PATCH 105/455] PDBWriter can set start frame and ensures that MODEL is only 4 digits - PDBWriter now honors start kwarg as expected (well, almost, start=0 turns into MODEL 1 because of PDB standard) - test that we do not have 5 digit MODEL numbers but wrap around; testing white space and that number is read correctly as int - use fixtures for TestPDBWriter --- package/CHANGELOG | 1 + package/MDAnalysis/coordinates/PDB.py | 46 ++-- .../MDAnalysisTests/coordinates/test_pdb.py | 197 +++++++++--------- 3 files changed, 131 insertions(+), 113 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 0520c1657f6..5ba0b5045b0 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -44,6 +44,7 @@ Fixes * Fixed inconsistent handling of groups with/without duplicates in pack_into_box() (Issue #1911) * Fixed format of MODEL number in PDB file writing (Issue #1950) + * PDBWriter now properly sets start value Changes * TopologyAttrs are now statically typed (Issue #1876) diff --git a/package/MDAnalysis/coordinates/PDB.py b/package/MDAnalysis/coordinates/PDB.py index 4a659e7a968..fed31308144 100644 --- a/package/MDAnalysis/coordinates/PDB.py +++ b/package/MDAnalysis/coordinates/PDB.py @@ -436,6 +436,18 @@ class PDBWriter(base.WriterBase): Note ---- + Writing bonds currently only works when writing a whole :class:`Universe` + and if bond information is available in the topology. (For selections + smaller than the whole :class:`Universe`, the atom numbering in the CONECT_ + records would not match the numbering of the atoms in the new PDB file and + therefore a :exc:`NotImplementedError` is raised.) + + The maximum frame number that can be stored in a PDB file is 9999 and it + will wrap around (see :meth:`MODEL` for further details). + + + See Also + -------- This class is identical to :class:`MultiPDBWriter` with the one exception that it defaults to writing single-frame PDB files as if `multiframe` = ``False`` was selected. @@ -521,7 +533,8 @@ def __init__(self, filename, bonds="conect", n_atoms=None, start=0, step=1, filename: str name of output file start: int (optional) - starting timestep + starting timestep (the first frame will have MODEL number `start` + 1 + because the PDB standard prescribes MODEL numbers starting at 1) step: int (optional) skip between subsequent timesteps remarks: str (optional) @@ -542,15 +555,6 @@ def __init__(self, filename, bonds="conect", n_atoms=None, start=0, step=1, multi frame PDB file in which frames are written as MODEL_ ... ENDMDL_ records. If ``None``, then the class default is chosen. [``None``] - Note - ---- - Writing bonds currently only works when writing a whole - :class:`Universe` and if bond information is available in the topology. - (For selections smaller than the whole :class:`Universe`, the atom - numbering in the CONECT_ records would not match the numbering of the - atoms in the new PDB file and therefore a :exc:`NotImplementedError` is - raised.) - .. _CONECT: http://www.wwpdb.org/documentation/format32/sect10.html#CONECT .. _MODEL: http://www.wwpdb.org/documentation/format32/sect9.html#MODEL @@ -571,11 +575,10 @@ def __init__(self, filename, bonds="conect", n_atoms=None, start=0, step=1, self._multiframe = self.multiframe if multiframe is None else multiframe self.bonds = bonds - self.frames_written = 0 if start < 0: raise ValueError("'Start' must be a positive value") - self.start = start + self.start = self.frames_written = start self.step = step self.remarks = remarks @@ -596,7 +599,7 @@ def close(self): def _write_pdb_title(self): if self._multiframe: - self.TITLE("MDANALYSIS FRAMES FROM {0:d}, SKIP {1:d}: {2!s}" + self.TITLE("MDANALYSIS FRAMES FROM {0:d}, STEP {1:d}: {2!s}" "".format(self.start, self.step, self.remarks)) else: self.TITLE("MDANALYSIS FRAME {0:d}: {1!s}" @@ -762,7 +765,7 @@ def write_all_timesteps(self, obj): or a :class:`~MDAnalysis.core.universe.Universe`. The method writes the frames from the one specified as *start* until - the end, using a step of *skip* (*start* and *skip* are set in the + the end, using a step of *step* (*start* and *step* are set in the constructor). Thus, if *u* is a Universe then :: u.trajectory[-2] @@ -771,7 +774,7 @@ def write_all_timesteps(self, obj): will write a PDB trajectory containing the last 2 frames and :: - pdb = PDBWriter("out.pdb", u.atoms.n_atoms, start=12, skip=2) + pdb = PDBWriter("out.pdb", u.atoms.n_atoms, start=12, step=2) pdb.write_all_timesteps(u) will be writing frames 12, 14, 16, ... @@ -989,10 +992,21 @@ def CRYST1(self, dimensions, spacegroup='P 1', zvalue=1): def MODEL(self, modelnumber): """Write the MODEL_ record. + .. note:: + + The maximum MODEL number is limited to 9999 in the PDB + standard (i.e., 4 digits). If frame numbers are larger than + 9999, they will wrap around, i.e., 9998, 9999, 0, 1, 2, ... + + .. _MODEL: http://www.wwpdb.org/documentation/format32/sect9.html#MODEL + + .. versionchanged:: 0.18.1 + Maximum model number is enforced. + """ - self.pdbfile.write(self.fmt['MODEL'].format(modelnumber)) + self.pdbfile.write(self.fmt['MODEL'].format(int(str(modelnumber)[-4:]))) def END(self): """Write END_ record. diff --git a/testsuite/MDAnalysisTests/coordinates/test_pdb.py b/testsuite/MDAnalysisTests/coordinates/test_pdb.py index ca200298ff4..6a9201dd52a 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pdb.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pdb.py @@ -149,116 +149,113 @@ def test_long_resSeq(self): assert_equal(u[4].resid, 10000, "can't read a five digit resid") -class TestPDBWriter(TestCase): - def setUp(self): - self.universe = mda.Universe(PSF, PDB_small) - self.universe2 = mda.Universe(PSF, DCD) - # 3 decimals in PDB spec - # http://www.wwpdb.org/documentation/format32/sect9.html#ATOM - self.prec = 3 - ext = ".pdb" - self.tmpdir = tempdir.TempDir() - self.outfile = self.tmpdir.name + '/primitive-pdb-writer' + ext - self.u_no_resnames = make_Universe(['names', 'resids'], - trajectory=True) - self.u_no_resids = make_Universe(['names', 'resnames'], - trajectory=True) - self.u_no_names = make_Universe(['resids', 'resnames'], - trajectory=True) +class TestPDBWriter(object): + # 3 decimals in PDB spec + # http://www.wwpdb.org/documentation/format32/sect9.html#ATOM + prec = 3 + ext = ".pdb" - def tearDown(self): - try: - os.unlink(self.outfile) - except OSError: - pass - del self.universe, self.universe2 - del self.u_no_resnames, self.u_no_resids, self.u_no_names - del self.tmpdir + @pytest.fixture + def universe(self): + return mda.Universe(PSF, PDB_small) + + @pytest.fixture + def universe2(self): + return mda.Universe(PSF, DCD) + + @pytest.fixture + def outfile(self, tmpdir): + return str(tmpdir.mkdir("PDBWriter").join('primitive-pdb-writer' + self.ext)) + + @pytest.fixture + def u_no_resnames(self): + return make_Universe(['names', 'resids'], trajectory=True) - def test_writer(self): + @pytest.fixture + def u_no_resids(self): + return make_Universe(['names', 'resnames'], trajectory=True) + + @pytest.fixture + def u_no_names(self): + return make_Universe(['resids', 'resnames'], trajectory=True) + + + def test_writer(self, universe, outfile): "Test writing from a single frame PDB file to a PDB file." "" - self.universe.atoms.write(self.outfile) - u = mda.Universe(PSF, self.outfile) + universe.atoms.write(outfile) + u = mda.Universe(PSF, outfile) assert_almost_equal(u.atoms.positions, - self.universe.atoms.positions, self.prec, + universe.atoms.positions, self.prec, err_msg="Writing PDB file with PDBWriter " "does not reproduce original coordinates") - def test_writer_no_resnames(self): - self.u_no_resnames.atoms.write(self.outfile) - u = mda.Universe(self.outfile) - expected = np.array(['UNK'] * self.u_no_resnames.atoms.n_atoms) + def test_writer_no_resnames(self, u_no_resnames, outfile): + u_no_resnames.atoms.write(outfile) + u = mda.Universe(outfile) + expected = np.array(['UNK'] * u_no_resnames.atoms.n_atoms) assert_equal(u.atoms.resnames, expected) - - def test_writer_no_resids(self): - self.u_no_resids.atoms.write(self.outfile) - u = mda.Universe(self.outfile) + def test_writer_no_resids(self, u_no_resids, outfile): + u_no_resids.atoms.write(outfile) + u = mda.Universe(outfile) expected = np.ones((25,)) assert_equal(u.residues.resids, expected) - - def test_writer_no_atom_names(self): - self.u_no_names.atoms.write(self.outfile) - u = mda.Universe(self.outfile) - expected = np.array(['X'] * self.u_no_names.atoms.n_atoms) + def test_writer_no_atom_names(self, u_no_names, outfile): + u_no_names.atoms.write(outfile) + u = mda.Universe(outfile) + expected = np.array(['X'] * u_no_names.atoms.n_atoms) assert_equal(u.atoms.names, expected) - - def test_writer_no_altlocs(self): - self.u_no_names.atoms.write(self.outfile) - u = mda.Universe(self.outfile) - expected = np.array([''] * self.u_no_names.atoms.n_atoms) + def test_writer_no_altlocs(self, u_no_names, outfile): + u_no_names.atoms.write(outfile) + u = mda.Universe(outfile) + expected = np.array([''] * u_no_names.atoms.n_atoms) assert_equal(u.atoms.altLocs, expected) - - def test_writer_no_icodes(self): - self.u_no_names.atoms.write(self.outfile) - u = mda.Universe(self.outfile) - expected = np.array([''] * self.u_no_names.atoms.n_atoms) + def test_writer_no_icodes(self, u_no_names, outfile): + u_no_names.atoms.write(outfile) + u = mda.Universe(outfile) + expected = np.array([''] * u_no_names.atoms.n_atoms) assert_equal(u.atoms.icodes, expected) - - def test_writer_no_segids(self): - self.u_no_names.atoms.write(self.outfile) - u = mda.Universe(self.outfile) - expected = np.array(['SYSTEM'] * self.u_no_names.atoms.n_atoms) + def test_writer_no_segids(self, u_no_names, outfile): + u_no_names.atoms.write(outfile) + u = mda.Universe(outfile) + expected = np.array(['SYSTEM'] * u_no_names.atoms.n_atoms) assert_equal([atom.segid for atom in u.atoms], expected) - - def test_writer_no_occupancies(self): - self.u_no_names.atoms.write(self.outfile) - u = mda.Universe(self.outfile) - expected = np.ones(self.u_no_names.atoms.n_atoms) + def test_writer_no_occupancies(self, u_no_names, outfile): + u_no_names.atoms.write(outfile) + u = mda.Universe(outfile) + expected = np.ones(u_no_names.atoms.n_atoms) assert_equal(u.atoms.occupancies, expected) - - def test_writer_no_tempfactors(self): - self.u_no_names.atoms.write(self.outfile) - u = mda.Universe(self.outfile) - expected = np.zeros(self.u_no_names.atoms.n_atoms) + def test_writer_no_tempfactors(self, u_no_names, outfile): + u_no_names.atoms.write(outfile) + u = mda.Universe(outfile) + expected = np.zeros(u_no_names.atoms.n_atoms) assert_equal(u.atoms.tempfactors, expected) - def test_write_single_frame_Writer(self): + def test_write_single_frame_Writer(self, universe2, outfile): """Test writing a single frame from a DCD trajectory to a PDB using MDAnalysis.Writer (Issue 105)""" - u = self.universe2 - W = mda.Writer(self.outfile) + u = universe2 u.trajectory[50] - W.write(u.select_atoms('all')) - W.close() - u2 = mda.Universe(self.outfile) + with mda.Writer(outfile) as W: + W.write(u.select_atoms('all')) + u2 = mda.Universe(outfile) assert_equal(u2.trajectory.n_frames, 1, err_msg="The number of frames should be 1.") - def test_write_single_frame_AtomGroup(self): + def test_write_single_frame_AtomGroup(self, universe2, outfile): """Test writing a single frame from a DCD trajectory to a PDB using AtomGroup.write() (Issue 105)""" - u = self.universe2 + u = universe2 u.trajectory[50] - u.atoms.write(self.outfile) - u2 = mda.Universe(PSF, self.outfile) + u.atoms.write(outfile) + u2 = mda.Universe(PSF, outfile) assert_equal(u2.trajectory.n_frames, 1, err_msg="Output PDB should only contain a single frame") @@ -267,38 +264,35 @@ def test_write_single_frame_AtomGroup(self): "agree with original coordinates from frame %d" % u.trajectory.frame) - def test_check_coordinate_limits_min(self): + def test_check_coordinate_limits_min(self, universe, outfile): """Test that illegal PDB coordinates (x <= -999.9995 A) are caught with ValueError (Issue 57)""" - # modify coordinates so we need our own copy or we could mess up - # parallel tests - u = mda.Universe(PSF, PDB_small) + # modify coordinates (universe needs to be a per-function fixture) + u = universe u.atoms[2000].position = [0, -999.9995, 22.8] with pytest.raises(ValueError): - u.atoms.write(self.outfile) + u.atoms.write(outfile) - def test_check_coordinate_limits_max(self): + def test_check_coordinate_limits_max(self, universe, outfile): """Test that illegal PDB coordinates (x > 9999.9995 A) are caught with ValueError (Issue 57)""" - # modify coordinates so we need our own copy or we could mess up - # parallel tests - u = mda.Universe(PSF, PDB_small) + # modify coordinates (universe needs to be a per-function fixture) + u = universe # OB: 9999.99951 is not caught by '<=' ?!? u.atoms[1000].position = [90.889, 9999.9996, 12.2] with pytest.raises(ValueError): - u.atoms.write(self.outfile) - del u + u.atoms.write(outfile) - def test_check_HEADER_TITLE_multiframe(self): + def test_check_HEADER_TITLE_multiframe(self, universe2, outfile): """Check whether HEADER and TITLE are written just once in a multi- frame PDB file (Issue 741)""" - u = mda.Universe(PSF, DCD) + u = universe2 protein = u.select_atoms("protein and name CA") - with mda.Writer(self.outfile, multiframe=True) as pdb: + with mda.Writer(outfile, multiframe=True) as pdb: for ts in u.trajectory[:5]: pdb.write(protein) - with open(self.outfile) as f: + with open(outfile) as f: got_header = 0 got_title = 0 for line in f: @@ -309,11 +303,13 @@ def test_check_HEADER_TITLE_multiframe(self): got_title += 1 assert got_title <= 1, "There should be only one TITLE." - def test_check_MODEL_multiframe(self, maxframes=12): + @pytest.mark.parametrize("startframe,maxframes", + [(0, 12), (9997, 12)]) + def test_check_MODEL_multiframe(self, universe2, outfile, startframe, maxframes): """Check whether MODEL number is in the right column (Issue #1950)""" - u = mda.Universe(PSF, DCD) + u = universe2 protein = u.select_atoms("protein and name CA") - with mda.Writer(self.outfile, multiframe=True) as pdb: + with mda.Writer(outfile, multiframe=True, start=startframe) as pdb: for ts in u.trajectory[:maxframes]: pdb.write(protein) @@ -323,11 +319,18 @@ def get_MODEL_lines(filename): if line.startswith("MODEL"): yield line - MODEL_lines = list(get_MODEL_lines(self.outfile)) + MODEL_lines = list(get_MODEL_lines(outfile)) assert len(MODEL_lines) == maxframes - for model, line in enumerate(MODEL_lines, start=1): - assert line[10:14] == "{0:>4d}".format(model) + for model, line in enumerate(MODEL_lines, start=startframe+1): + # test that only the right-most 4 digits are stored (rest must be space) + # line[10:14] == '9999' or ' 1' + + # test appearance with white space + assert line[5:14] == "{0:>9d}".format(int(str(model)[-4:])) + + # test number (only last 4 digits) + assert int(line[10:14]) == model % 10000 class TestMultiPDBReader(TestCase): From a15f2c2989c788d78ea4c98aacba295b6bcfccaa Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sat, 23 Jun 2018 13:31:53 +0200 Subject: [PATCH 106/455] TPR parser reads SETTLE constraints as bonds Fixes #1949 --- package/CHANGELOG | 3 ++- package/MDAnalysis/topology/TPRParser.py | 2 +- package/MDAnalysis/topology/tpr/utils.py | 11 ++++++++++ .../topology/test_tprparser.py | 21 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 1e3f317ea3d..e76b22b4fd4 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,7 +14,7 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, - VOD555, davidercruz + VOD555, davidercruz, jbarnoud * 0.18.1 @@ -53,6 +53,7 @@ Changes duplicates. Otherwise, the group itself is returned. Repeated access of *Group.unique will always return the same object unless the group is updated or modified. (PR #1922) + * The TPR parser reads SETTLE constraints as bonds. (Issue #1949) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, diff --git a/package/MDAnalysis/topology/TPRParser.py b/package/MDAnalysis/topology/TPRParser.py index 43cbfbfe892..06205f9b213 100644 --- a/package/MDAnalysis/topology/TPRParser.py +++ b/package/MDAnalysis/topology/TPRParser.py @@ -76,7 +76,7 @@ tabulated potential with exclusion/connection (type 8), tabulated potential without exclusion/connection (type 9), constraints with exclusion/connection (type 1), constraints without exclusion/connection (type - 2) + 2), SETTLE constraints * angles: regular angles (type 1), G96 angles (type 2), cross bond-bond (type3), cross-bond-angle (type 4), Urey-Bradley (type 5), quartic angles (type 6), restricted bending potential (type 10), tabulated angles (type 8) diff --git a/package/MDAnalysis/topology/tpr/utils.py b/package/MDAnalysis/topology/tpr/utils.py index de70643024e..5c60fbc7b92 100644 --- a/package/MDAnalysis/topology/tpr/utils.py +++ b/package/MDAnalysis/topology/tpr/utils.py @@ -635,6 +635,17 @@ def do_moltype(data, symtab, fver): dihs += list(ik_obj.process(ias)) elif ik_obj.name in ['IDIHS', 'PIDIHS']: impr += list(ik_obj.process(ias)) + elif ik_obj.name == 'SETTLE': + # SETTLE interactions are optimized triangular constraints for + # water molecules. They should be counted as a pair of bonds + # between the oxigen and the hydrogens. The format only + # specifies the index of the oxygen and assumes that the next + # two atoms are the hydrogens. + base_atom = ilist.iatoms[-1] + bonds += [ + [base_atom, base_atom + 1], + [base_atom, base_atom + 2] + ] else: # other interaction types are not interested at the moment pass diff --git a/testsuite/MDAnalysisTests/topology/test_tprparser.py b/testsuite/MDAnalysisTests/topology/test_tprparser.py index 500606c3ab2..dd2f5144d9b 100644 --- a/testsuite/MDAnalysisTests/topology/test_tprparser.py +++ b/testsuite/MDAnalysisTests/topology/test_tprparser.py @@ -212,3 +212,24 @@ def test_all_impropers(topology, impr): impr_type, elements = impr impr_type_in_topology(impr_type, elements, topology) + + +@pytest.fixture(params=( + TPR400, TPR402, TPR403, TPR404, TPR405, TPR406, TPR407, TPR450, TPR451, + TPR452, TPR453, TPR454, TPR502, TPR504, TPR505, TPR510, TPR2016, TPR2018, +)) +def bonds_water(request): + parser = MDAnalysis.topology.TPRParser.TPRParser(request.param).parse() + # The index of the first water atom is 1960 + first = 1960 + bonds = [ + bond + for bond in parser.bonds.values + if bond[0] >= first and bond[1] >= first + ] + return bonds + + +def test_settle(bonds_water): + # There are 101 water molecule with 2 bonds each + assert len(bonds_water) == 202 From bf62c1ebae5d23a4548693fdfb836c1a4c1cf267 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sat, 23 Jun 2018 18:08:44 +0100 Subject: [PATCH 107/455] point check and conversion now done in parent function --- .../MDAnalysis/transformations/translate.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 7fc73f5ae16..ff037cb8708 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -104,6 +104,11 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): """ pbc_arg = pbc + if point: + if len(point)==3: + boxcenter = np.float32(point) + else: + raise ValueError('{} is not a valid point'.format(point)) try: if center == 'geometry': center_method = partial(ag.center_of_geometry, pbc=pbc_arg) @@ -116,16 +121,13 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): raise AttributeError('{} is not an AtomGroup object with masses'.format(ag)) else: raise ValueError('{} is not an AtomGroup object'.format(ag)) - + def wrapped(ts): - ag_center = center_method() - if point: - if len(point)==3: - boxcenter = np.float32(point) - else: - raise ValueError('{} is not a valid point'.format(point)) - else: + if not boxcenter: boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 + + ag_center = center_method() + vector = boxcenter - ag_center ts.positions += vector From 1775462790bdd98f8d041f9cc63a3ee11889f772 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sat, 23 Jun 2018 18:27:43 +0100 Subject: [PATCH 108/455] cleaned point checking --- package/MDAnalysis/transformations/translate.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index ff037cb8708..9bd54d84e2d 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -104,11 +104,9 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): """ pbc_arg = pbc - if point: - if len(point)==3: - boxcenter = np.float32(point) - else: - raise ValueError('{} is not a valid point'.format(point)) + point = np.array(point) + if point.any() and len(point)!=3: + raise ValueError('{} is not a valid point'.format(point)) try: if center == 'geometry': center_method = partial(ag.center_of_geometry, pbc=pbc_arg) @@ -123,7 +121,9 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): raise ValueError('{} is not an AtomGroup object'.format(ag)) def wrapped(ts): - if not boxcenter: + if point.any(): + boxcenter = point + else: boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 ag_center = center_method() From 1cac08ea1bbce5d0764b56f51b6e5f93fa1639a8 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sat, 23 Jun 2018 18:30:52 +0100 Subject: [PATCH 109/455] cleaned point checking --- package/MDAnalysis/transformations/translate.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index afa6e7df3a2..9bd54d84e2d 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -21,14 +21,14 @@ # """\ -Trajectory translations --- :mod:`MDAnalysis.transformations.translate` +Trajectory translation --- :mod:`MDAnalysis.transformations.translate` ===================================================================== Translate the coordinates of a given trajectory by a given vector. The vector can either be user defined, using the function `translate` or defined by centering an AtomGroup in the unit cell using the function `center_in_box` - + """ from __future__ import absolute_import, division @@ -45,16 +45,13 @@ def translate(vector): Example ------- - - .. code-block:: python - ts = MDAnalysis.transformations.translate([1,2,3])(ts) Parameters ---------- vector: array-like coordinates of the vector to which the coordinates will be translated - + Returns ------- :class:`~MDAnalysis.coordinates.base.Timestep` object From cbe9049727cf6a2349c05ae4b587a90eb419ee50 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sun, 24 Jun 2018 10:34:47 +0100 Subject: [PATCH 110/455] code cleanup --- package/MDAnalysis/transformations/translate.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 9bd54d84e2d..6364a98ac57 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -22,7 +22,7 @@ """\ Trajectory translation --- :mod:`MDAnalysis.transformations.translate` -===================================================================== +====================================================================== Translate the coordinates of a given trajectory by a given vector. The vector can either be user defined, using the function `translate` @@ -104,8 +104,7 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): """ pbc_arg = pbc - point = np.array(point) - if point.any() and len(point)!=3: + if point and len(point)!=3: raise ValueError('{} is not a valid point'.format(point)) try: if center == 'geometry': @@ -121,8 +120,8 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): raise ValueError('{} is not an AtomGroup object'.format(ag)) def wrapped(ts): - if point.any(): - boxcenter = point + if point: + boxcenter = np.float32(point) else: boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 From d32abc328dab6d0e22a7cad6012ee0c17432491e Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sun, 24 Jun 2018 12:43:07 +0100 Subject: [PATCH 111/455] defult pbc flag now in docs --- package/MDAnalysis/transformations/translate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 6364a98ac57..b6fc1e794f1 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -96,7 +96,7 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): instead. Defined as an array of size 3. Example: [1, 2, 3] pbc: bool or None, optional If True, all the atoms from the given AtomGroup will be moved to the unit cell - before calculating the center of mass or geometry + before calculating the center of mass or geometry. Default is `None`. Returns ------- From c7b6622c1e50e35824d8f287e2d61c74af9a932c Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sun, 24 Jun 2018 21:34:34 +0100 Subject: [PATCH 112/455] pbc description now includes reference to flags --- package/MDAnalysis/transformations/translate.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index b6fc1e794f1..c12e56d4a8d 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -96,11 +96,14 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): instead. Defined as an array of size 3. Example: [1, 2, 3] pbc: bool or None, optional If True, all the atoms from the given AtomGroup will be moved to the unit cell - before calculating the center of mass or geometry. Default is `None`. + before calculating the center of mass or geometry. Default is `None`, thus if the + :class:`MDAnalysis.core.flags` flag *use_pbc* is set to ``True`` then the `pbc` + keyword is used by default. Returns ------- :class:`~MDAnalysis.coordinates.base.Timestep` object + """ pbc_arg = pbc From aff66156cf0253637c41511f4acec96b0f1bc8d1 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sun, 24 Jun 2018 21:46:17 +0100 Subject: [PATCH 113/455] removed flags reference;pbc arg defaults to False --- package/MDAnalysis/transformations/translate.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index c12e56d4a8d..17e39b52674 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -68,7 +68,7 @@ def wrapped(ts): return wrapped -def center_in_box(ag, center='geometry', point=None, pbc=None): +def center_in_box(ag, center='geometry', point=None, pbc=False): """ Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` instance so that the center of geometry/mass of the given :class:`~MDAnalysis.core.groups.AtomGroup` @@ -94,11 +94,10 @@ def center_in_box(ag, center='geometry', point=None, pbc=None): overrides the unit cell center - the coordinates of the Timestep are translated so that the center of mass/geometry of the given AtomGroup is aligned to this position instead. Defined as an array of size 3. Example: [1, 2, 3] - pbc: bool or None, optional + pbc: bool, optional If True, all the atoms from the given AtomGroup will be moved to the unit cell - before calculating the center of mass or geometry. Default is `None`, thus if the - :class:`MDAnalysis.core.flags` flag *use_pbc* is set to ``True`` then the `pbc` - keyword is used by default. + before calculating the center of mass or geometry. Default is `False`, no changes + to the atom coordinates are done before calculating the center of the AtomGroup. Returns ------- From 2d9f989a63c75cc9904677855f3925850277ada3 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sun, 24 Jun 2018 23:30:18 +0100 Subject: [PATCH 114/455] updated docs; center is now updated every frame; added more tests --- package/MDAnalysis/transformations/rotate.py | 48 +++--- .../transformations/test_rotate.py | 140 ++++++++++++++++-- 2 files changed, 159 insertions(+), 29 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 05a0efc29ac..0a89dd6c33e 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -32,11 +32,12 @@ import math import numpy as np +from functools import partial from ..lib.transformations import rotation_matrix from ..core.groups import AtomGroup -def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=None): +def rotateby(angle, direction, position=None, center="geometry", pbc=None, ag=None): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a position. This position can be the center @@ -64,8 +65,8 @@ def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=No Parameters ---------- angle: float - rotation angle in radians - direction: list + rotation angle in degrees + direction: array-like vector that will define the direction of a custom axis of rotation from the provided point. ag: AtomGroup, optional @@ -76,31 +77,44 @@ def rotateby(angle, direction, center="geometry", pbc=None, ag=None, position=No or 'mass' pbc: bool or None, optional If True, all the atoms from the given AtomGroup will be moved to the unit cell - before calculating the center - position: list, optional + before calculating the center. Warning: Wrapping/unwrapping the trajectory or + performing PBC corrections may not be possible after rotating the trajectory. + position: array-like, optional list of the coordinates of the point from where a custom axis of rotation will be defined. Returns ------- :class:`~MDAnalysis.coordinates.base.Timestep` object - + ''' pbc_arg = pbc - if position and len(position)>2: - position = position - elif isinstance(ag, AtomGroup): - if center == "geometry": - position = ag.center_of_geometry(pbc=pbc_arg) - elif center == "mass": - position = ag.center_of_mass(pbc=pbc_arg) - else: - raise ValueError('{} is not a valid argument for center'.format(center)) + angle = np.deg2rad(angle) + if position: + if len(position)!=3: + raise ValueError('{} is not a valid point'.format(position)) + elif ag: + try: + if center == 'geometry': + center_method = partial(ag.center_of_geometry, pbc=pbc_arg) + elif center == 'mass': + center_method = partial(ag.center_of_mass, pbc=pbc_arg) + else: + raise ValueError('{} is not a valid argument for center'.format(center)) + except AttributeError: + if center == 'mass': + raise AttributeError('{} is not an AtomGroup object with masses'.format(ag)) + else: + raise ValueError('{} is not an AtomGroup object'.format(ag)) else: - raise ValueError('A position or an AtomGroup must be specified') + raise ValueError('A position or an AtomGroup must be specified') def wrapped(ts): - rotation = rotation_matrix(angle, direction, position)[:3, :3] + if position: + point = position + else: + point = center_method() + rotation = rotation_matrix(angle, direction, point)[:3, :3] ts.positions= np.dot(ts.positions, rotation) return ts diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 7eb79e60807..e3b50e50d18 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -32,35 +32,151 @@ from MDAnalysisTests import make_Universe @pytest.fixture() -def rotateby_universes(): +def rotate_universes(): # create the Universe objects for the tests reference = make_Universe(trajectory=True) - transformed = make_Universe(trajectory=True) + transformed = make_Universe(['masses'], trajectory=True) + transformed.trajectory.ts.dimensions = np.array([372., 373., 374., 90, 90, 90]) return reference, transformed -def test_rotateby_custom_position(): +def test_rotateby_custom_position(rotate_universes): # what happens when we use a custom position for the axis of rotation? - ref_u, trans_u = rotateby_universes() + ref_u = rotate_universes[0] + trans_u = rotate_universes[1] trans = trans_u.trajectory.ts ref = ref_u.trajectory.ts vector = [1,0,0] pos = [0,0,0] - matrix = rotation_matrix(np.pi / 2, vector, pos)[:3, :3] + angle = 90 + matrix = rotation_matrix(np.deg2rad(angle), vector, pos)[:3, :3] ref.positions = np.dot(ref.positions, matrix) - transformed = rotateby(np.pi / 2, vector, position=pos)(trans) + transformed = rotateby(angle, vector, position=pos)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) -def test_rotateby_atomgroup(): - # what happens when we rotate arround the center of geometry of a residue? - ref_u, trans_u = rotateby_universes() +def test_rotateby_atomgroup_cog_nopbc(rotate_universes): + # what happens when we rotate arround the center of geometry of a residue + # without pbc? + ref_u = rotate_universes[0] + trans_u = rotate_universes[1] trans = trans_u.trajectory.ts ref = ref_u.trajectory.ts center_pos = [6,7,8] vector = [1,0,0] - matrix = rotation_matrix(np.pi, vector, center_pos)[:3, :3] + angle = 90 + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] ref.positions = np.dot(ref.positions, matrix) selection = trans_u.residues[0].atoms - transformed = rotateby(np.pi, vector, ag=selection, center='geometry')(trans) + transformed = rotateby(angle, vector, ag=selection, center='geometry')(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + +def test_rotateby_atomgroup_com_nopbc(rotate_universes): + # what happens when we rotate arround the center of mass of a residue + # without pbc? + ref_u = rotate_universes[0] + trans_u = rotate_universes[1] + trans = trans_u.trajectory.ts + ref = ref_u.trajectory.ts + vector = [1,0,0] + angle = 90 + selection = trans_u.residues[0].atoms + center_pos = selection.center_of_mass() + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] + ref.positions = np.dot(ref.positions, matrix) + transformed = rotateby(angle, vector, ag=selection, center='mass')(trans) + assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + +def test_rotateby_atomgroup_cog_pbc(rotate_universes): + # what happens when we rotate arround the center of geometry of a residue + # with pbc? + ref_u = rotate_universes[0] + trans_u = rotate_universes[1] + trans = trans_u.trajectory.ts + ref = ref_u.trajectory.ts + vector = [1,0,0] + angle = 90 + selection = trans_u.residues[0].atoms + center_pos = selection.center_of_geometry(pbc=True) + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] + ref.positions = np.dot(ref.positions, matrix) + transformed = rotateby(angle, vector, ag=selection, center='geometry', pbc=True)(trans) + assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + +def test_rotateby_atomgroup_com_pbc(rotate_universes): + # what happens when we rotate arround the center of mass of a residue + # with pbc? + ref_u = rotate_universes[0] + trans_u = rotate_universes[1] + trans = trans_u.trajectory.ts + ref = ref_u.trajectory.ts + vector = [1,0,0] + angle = 90 + selection = trans_u.residues[0].atoms + center_pos = selection.center_of_mass(pbc=True) + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] + ref.positions = np.dot(ref.positions, matrix) + transformed = rotateby(angle, vector, ag=selection, center='mass', pbc=True)(trans) + assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + +def test_rotateby_bad_ag(rotate_universes): + # this universe as a box size zero + ts = rotate_universes[0].trajectory.ts + ag = rotate_universes[0].residues[0].atoms + # what happens if something other than an AtomGroup is given? + angle = 90 + vector = [0, 0, 1] + bad_ag = 1 + with pytest.raises(ValueError): + rotateby(angle, vector, ag = bad_ag)(ts) + +def test_rotateby_bad_position(rotate_universes): + # this universe as a box size zero + ts = rotate_universes[0].trajectory.ts + # what if the box is in the wrong format? + angle = 90 + vector = [0, 0, 1] + bad_position = [1] + with pytest.raises(ValueError): + rotateby(angle, vector, position=bad_position)(ts) - \ No newline at end of file +def test_rotateby_bad_pbc(rotate_universes): + # this universe as a box size zero + ts = rotate_universes[0].trajectory.ts + ag = rotate_universes[0].residues[0].atoms + # is pbc passed to the center methods? + # if yes it should raise an exception for boxes that are zero in size + angle = 90 + vector = [0, 0, 1] + with pytest.raises(ValueError): + rotateby(angle, vector, ag = ag, pbc=True)(ts) + +def test_rotateby_bad_center(rotate_universes): + # this universe as a box size zero + ts = rotate_universes[0].trajectory.ts + ag = rotate_universes[0].residues[0].atoms + # what if a wrong center type name is passed? + angle = 90 + vector = [0, 0, 1] + bad_center = " " + with pytest.raises(ValueError): + rotateby(angle, vector, ag = ag, center=bad_center)(ts) + +def test_rotateby_no_masses(rotate_universes): + # this universe as a box size zero + ts = rotate_universes[0].trajectory.ts + ag = rotate_universes[0].residues[0].atoms + # if the universe has no masses and `mass` is passed as the center arg + angle = 90 + vector = [0, 0, 1] + bad_center = "mass" + with pytest.raises(AttributeError): + rotateby(angle, vector, ag = ag, center=bad_center)(ts) + +def test_rotateby_no_args(rotate_universes): + # this universe as a box size zero + ts = rotate_universes[0].trajectory.ts + angle = 90 + vector = [0, 0, 1] + # if no position or AtomGroup are passed to the function + # it should raise a ValueError + with pytest.raises(ValueError): + rotateby(angle, vector)(ts) \ No newline at end of file From 23e9868801d9e572039d32c7db7f9659029a8649 Mon Sep 17 00:00:00 2001 From: ayush Date: Sun, 24 Jun 2018 15:36:27 -0700 Subject: [PATCH 115/455] Modification as per the review --- package/MDAnalysis/lib/distances.py | 142 ++++++++++-------- .../MDAnalysisTests/lib/test_distances.py | 52 +++++++ 2 files changed, 134 insertions(+), 60 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index b16d1a66b6c..bc37264192d 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -389,58 +389,70 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): return distances -def capped_distance(reference, configuration, max_cutoff, min_cutoff = 0, box = None, method = None): - """Returns the indices of reference and configuration atoms within a fixed distance +def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None): + """Calculates the pairs and distance within a specified distance - If a box is supplied, then a minimum image convention is used to evaluate - the distances. + If a *box* is supplied, then a minimum image convention is used + to evaluate the distances. + + An automatic guessing of optimized method to calculate the distances is + included in the function. An optional keyword for the method is also + provided. Users can override the method with this functionality. + Currently pkdtree and bruteforce are implemented. - An optional keyword for the method is provided to allow usage of other - implemented methods. Currently pkdtree and bruteforce can be used. Depending - on the number of particles and distribution, the times may vary significantly. Parameters ----------- - reference : numpy.array of type numpy.float32 - The shape of the reference array should be ``(N, 3)`` - or a (3, ) coordinate. - configuration : numpy.array of type numpy.float32 - All the attributes are similar to reference array. Essentially - second group of atoms. - max_cutoff : float32 - The maximum cutoff distance. Only the pair of indices which - have smaller distance than this cutoff distance will be returned. - min_cutoff : float32 - The lower bound of cutoff. The function will not return the - pairs of indices whose distances are less than this parameter. - box : (optional) array or None, default ``None`` + reference : array + The shape of the reference array should be ``(N, 3)`` + or a (3, ) coordinate. + configuration : array + Similar to reference array and second group of coordinates + max_cutoff : float + Maximum cutoff distance between the reference and configuration + min_cutoff : (optional) float + Minimum cutoff distance between reference and configuration [None] + box : (optional) array or None The dimensions, if provided, must be provided in the same The unitcell dimesions for this system format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention - is applied if the box is provided. - method : 'bruteforce' or 'pkdtree' or 'None' - Based on benchmarks, checks the suitable method - and search the indices of the selections in relatively - less amount of time. 'bruteforce' can be costly with - large number of coordinates. Another option is - periodic KDTree and can be advantageous with increase in particles. - + is applied if the box is provided [None] + method : (optional) 'bruteforce' or 'pkdtree' or 'None' + Keyword to override the automatic guessing of method built-in + in the function [None] + Returns ------- - indices : list - Combination of coordinate indices, one from each - from reference and configuration state such that - distance between them is smaller than cutoff distance - provided as ``cutoff`` in arguments. - + pairs : array + Pair of indices, one from each reference and configuration such that + distance between them is within the ``max_cutoff`` and ``min_cutoff`` + pairs[i,j] contains the indices i from reference coordinates, and + j from configuration + distances : array + Distances corresponding to each pair of indices. + d[k] corresponding to the pairs[i,j] gives the distance between + i-th and j-th coordinate in reference and configuration respectively + + .. code-block:: python + + pairs, distances = capped_distances(reference, coordinates, max_cutoff) + for indx, [a,b] in enumerate(pairs): + coord1 = reference[a] + coord2 = configuration[b] + distance = distances[indx] + Note ----- - Currently only supports brute force. Similar methods - can be defined and can be directly linked - to this function. + Currently only supports brute force. + + .. SeeAlso:: :func:'MDAnalysis.lib.distances.distance_array' + + Similar methods can be defined and can be directly linked to this function. + + """ - + if box is not None: boxtype = _box_check(box) # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] @@ -449,45 +461,52 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff = 0, box = if (boxtype == 'tri_vecs_bad'): box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) if method is None: - method = _determine_method(reference, configuration, max_cutoff, box = box) + method = _determine_method(reference, configuration, + max_cutoff, box=box) if method == 'bruteforce': - pairs = _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff = min_cutoff, box = box) - #if method = 'pkdt': - # pairs = _pkdt_capped(reference, configuration, cutoff, box = None) - return pairs - + pairs, dist = _bruteforce_capped(reference, configuration, + max_cutoff, min_cutoff=min_cutoff, + box=box) + # if method = 'pkdt': + # pairs = _pkdt_capped(reference, configuration, cutoff, box = None) + return np.array(pairs), np.array(dist) + def _determine_method(reference, configuration, cutoff, box): """ Switch between different methods based on the the optimized time. - All the rules to select the method based on the input can be + All the rules to select the method based on the input can be incorporated here. Returns ------- - String of the method. supports ``bruteforce`` or ``pkdt`` as of now + String of the method. Supports ``bruteforce`` or ``pkdt`` as of now - Note + Note ---- Just a basic rule based on the number of particles """ - #if (len(reference) > 1000) or (len(configuration) > 1000): - # return 'pkdt' + # if (len(reference) > 1000) or (len(configuration) > 1000): + # return 'pkdt' return 'bruteforce' -def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff = 0, box = None): - """ - Using naive distanc calulations, returns a list - containing the indices with one from each +def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): + """ + Using naive distance calulations, returns a list + containing the indices with one from each reference and configuration list, such that the distance between them is less than the specified cutoff distance """ - pairs = [] - if reference.shape == (3,): + pairs, distance = [], [] + + reference = np.asarray(reference, dtype=np.float32) + configuration = np.asarray(configuration, dtype=np.float32) + + if reference.shape == (3, ): reference = reference[None, :] - if configuration.shape == (3,): + if configuration.shape == (3, ): configuration = configuration[None, :] _check_array(reference, 'reference') @@ -495,11 +514,14 @@ def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff = 0, bo for i, coords in enumerate(reference): dist = distance_array(coords[None, :], configuration, box=box)[0] - idx = np.where((dist <= max_cutoff) & (dist > min_cutoff))[0] + if min_cutoff is not None: + idx = np.where((dist <= max_cutoff) & (dist > min_cutoff))[0] + else: + idx = np.where((dist <= max_cutoff))[0] for j in idx: - pairs.append((i,j)) - - return pairs + pairs.append((i, j)) + distance.append(dist[j]) + return pairs, distance def transform_RtoS(inputcoords, box, backend="serial"): diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 71e74231239..5061bec2475 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -27,6 +27,8 @@ import MDAnalysis as mda +from MDAnalysis.lib.mdamath import triclinic_vectors + def test_transform_StoR_pass(): box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) s = np.array([[0.5, -0.1, 0.5]], dtype=np.float32) @@ -37,9 +39,59 @@ def test_transform_StoR_pass(): assert_equal(original_r, test_r) + def test_transform_StoR_fail(): box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) s = np.array([[0.5, -0.1, 0.5]]) with pytest.raises(TypeError, match='S must be of type float32'): r = mda.lib.distances.transform_StoR(s, box) + + +def test_capped_distance_noresults(): + point1 = np.array([0.1, 0.1, 0.1], dtype=np.float32) + point2 = np.array([0.95, 0.1, 0.1], dtype=np.float32) + + pairs, distances = mda.lib.distances.capped_distance(point1, + point2, + max_cutoff=0.2) + + assert_equal(len(pairs), 0) + + +boxes_1 = (np.array([1, 2, 3, 90, 90, 90], dtype=np.float32), # ortho + np.array([1, 2, 3, 30, 45, 60], dtype=np.float32), # tri_box + triclinic_vectors( # tri_vecs + np.array([1, 2, 3, 90, 90, 45], dtype=np.float32)), + np.array([[0.5, 0.9, 1.9], # tri_vecs_bad + [2.0, 0.4, 0.1], + [0.0, 0.6, 0.5]], dtype=np.float32)) + +query_1 = (np.array([0.1, 0.1, 0.1], dtype=np.float32), + np.array([[0.1, 0.1, 0.1], + [0.2, 0.1, 0.1]], dtype=np.float32)) + +points = (np.random.uniform(low=0, high=1.0, + size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) + +np.random.seed(90003) + + +@pytest.mark.parametrize('box, query', zip(boxes_1, query_1)) +def test_capped_distance_checkbrute(box, query): + max_cutoff = 0.3 + # capped distance should be able to handle array of vectors + # as well as single vectors. + pairs, dist = mda.lib.distances.capped_distance(query, + points, + max_cutoff, + box=box) + if(query.shape[0] == 3): + distances = mda.lib.distances.distance_array(query[None, :], + points, box=box) + else: + distances = mda.lib.distances.distance_array(query, + points, box=box) + indices = np.where(distances < max_cutoff) + + assert_equal(pairs[:, 1], indices[1]) From dd12343150a16a53dcf7e05a6894a1c1965dcb7c Mon Sep 17 00:00:00 2001 From: ayush Date: Sun, 24 Jun 2018 16:29:39 -0700 Subject: [PATCH 116/455] modified zip with itertools.product --- testsuite/MDAnalysisTests/lib/test_distances.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 5061bec2475..cc0f01c2017 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -25,6 +25,8 @@ import numpy as np from numpy.testing import assert_equal +import itertools + import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors @@ -77,7 +79,7 @@ def test_capped_distance_noresults(): np.random.seed(90003) -@pytest.mark.parametrize('box, query', zip(boxes_1, query_1)) +@pytest.mark.parametrize('box, query', itertools.product(boxes_1, query_1)) def test_capped_distance_checkbrute(box, query): max_cutoff = 0.3 # capped distance should be able to handle array of vectors From 9833a6909d674bcf7dc35415cc2133e25d6f9c07 Mon Sep 17 00:00:00 2001 From: ayush Date: Sun, 24 Jun 2018 17:33:28 -0700 Subject: [PATCH 117/455] random seed --- testsuite/MDAnalysisTests/lib/test_distances.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index cc0f01c2017..0eebcdcbb46 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -73,10 +73,11 @@ def test_capped_distance_noresults(): np.array([[0.1, 0.1, 0.1], [0.2, 0.1, 0.1]], dtype=np.float32)) +np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) -np.random.seed(90003) + @pytest.mark.parametrize('box, query', itertools.product(boxes_1, query_1)) From e1dce21d0cfb28446a2bda05a5fc23ced34c4e0e Mon Sep 17 00:00:00 2001 From: ayush Date: Sun, 24 Jun 2018 19:56:46 -0700 Subject: [PATCH 118/455] Capped PKDTree --- package/MDAnalysis/lib/distances.py | 65 +++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index bc37264192d..420af741ee8 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -72,6 +72,7 @@ from .mdamath import triclinic_vectors, triclinic_box + # hack to select backend with backend= kwarg. Note that # the cython parallel code (prange) in parallel.distances is # independent from the OpenMP code @@ -389,6 +390,7 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): return distances + def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None): """Calculates the pairs and distance within a specified distance @@ -444,9 +446,10 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N Note ----- - Currently only supports brute force. + Currently only supports brute force and Periodic KDtree .. SeeAlso:: :func:'MDAnalysis.lib.distances.distance_array' + .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree' Similar methods can be defined and can be directly linked to this function. @@ -468,8 +471,10 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N pairs, dist = _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=min_cutoff, box=box) - # if method = 'pkdt': - # pairs = _pkdt_capped(reference, configuration, cutoff, box = None) + if method == 'pkdt': + pairs, dist = _pkdt_capped(reference, configuration, + max_cutoff, min_cutoff=min_cutoff, + box=box) return np.array(pairs), np.array(dist) @@ -523,6 +528,60 @@ def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, bo distance.append(dist[j]) return pairs, distance +def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): + """ Capped Distance evaluations using KDtree. + + Uses minimum image convention if *box* is specified + + Returns: + -------- + pairs : list + List of atom indices which are within the specified cutoff distance. + pairs `(i, j)` corresponds to i-th particle in reference and + j-th particle in configuration + distance : list + Distance between two atoms corresponding to the (i, j) indices + in pairs. + + """ + from .pkdtree import PeriodicKDTree + from Bio.KDTree import KDTree + + pairs, distances = [], [] + + reference = np.asarray(reference, dtype=np.float32) + configuration = np.asarray(configuration, dtype=np.float32) + + if reference.shape == (3, ): + reference = reference[None, :] + if configuration.shape == (3, ): + configuration = configuration[None, :] + + _check_array(reference, 'reference') + _check_array(configuration, 'configuration') + + # Build The KDTree + if box is not None: + kdtree = PeriodicKDTree(box, bucket_size=10) + else : + kdtree = KDTree(dim=3, bucket_size=10) + + kdtree.set_coords(configuration) + # Search for every query point + for idx,centers in enumerate(reference): + kdtree.search(centers, max_cutoff) + indices = kdtree.get_indices() + dist = distance_array(centers.reshape((1,3)), configuration[indices],box=box)[0] + if min_cutoff is not None: + mask = np.where(dist > min_cutoff)[0] + dist = dist[mask] + indices = [indices[mask[i]] for i in range(len(mask))] + if len(indices) != 0: + for num, j in enumerate(indices): + pairs.append((idx,j)) + distances.append(dist[num]) + return pairs, distances + def transform_RtoS(inputcoords, box, backend="serial"): """Transform an array of coordinates from real space to S space (aka lambda space) From 8cc25fe2df0e12d9910440f7cb7664ad52f6c6b7 Mon Sep 17 00:00:00 2001 From: ayush Date: Sun, 24 Jun 2018 20:33:18 -0700 Subject: [PATCH 119/455] PEP8 and added test --- package/MDAnalysis/lib/distances.py | 24 ++++++++++--------- .../MDAnalysisTests/lib/test_distances.py | 12 ++++++---- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 420af741ee8..8c772b55d6a 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -471,10 +471,10 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N pairs, dist = _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=min_cutoff, box=box) - if method == 'pkdt': - pairs, dist = _pkdt_capped(reference, configuration, - max_cutoff, min_cutoff=min_cutoff, - box=box) + if method == 'pkdtree': + pairs, dist = _pkdtree_capped(reference, configuration, + max_cutoff, min_cutoff=min_cutoff, + box=box) return np.array(pairs), np.array(dist) @@ -493,12 +493,12 @@ def _determine_method(reference, configuration, cutoff, box): Just a basic rule based on the number of particles """ # if (len(reference) > 1000) or (len(configuration) > 1000): - # return 'pkdt' + # return 'pkdtree' return 'bruteforce' def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): - """ + """ Using naive distance calulations, returns a list containing the indices with one from each reference and configuration list, such that the distance between @@ -528,6 +528,7 @@ def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, bo distance.append(dist[j]) return pairs, distance + def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): """ Capped Distance evaluations using KDtree. @@ -537,7 +538,7 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N -------- pairs : list List of atom indices which are within the specified cutoff distance. - pairs `(i, j)` corresponds to i-th particle in reference and + pairs `(i, j)` corresponds to i-th particle in reference and j-th particle in configuration distance : list Distance between two atoms corresponding to the (i, j) indices @@ -563,22 +564,23 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N # Build The KDTree if box is not None: kdtree = PeriodicKDTree(box, bucket_size=10) - else : + else: kdtree = KDTree(dim=3, bucket_size=10) kdtree.set_coords(configuration) # Search for every query point - for idx,centers in enumerate(reference): + for idx, centers in enumerate(reference): kdtree.search(centers, max_cutoff) indices = kdtree.get_indices() - dist = distance_array(centers.reshape((1,3)), configuration[indices],box=box)[0] + dist = distance_array(centers.reshape((1, 3)), + configuration[indices], box=box)[0] if min_cutoff is not None: mask = np.where(dist > min_cutoff)[0] dist = dist[mask] indices = [indices[mask[i]] for i in range(len(mask))] if len(indices) != 0: for num, j in enumerate(indices): - pairs.append((idx,j)) + pairs.append((idx, j)) distances.append(dist[num]) return pairs, distances diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 0eebcdcbb46..1813ec9c275 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -73,22 +73,24 @@ def test_capped_distance_noresults(): np.array([[0.1, 0.1, 0.1], [0.2, 0.1, 0.1]], dtype=np.float32)) +method_1 = ('bruteforce', 'pkdtree') + np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) - - -@pytest.mark.parametrize('box, query', itertools.product(boxes_1, query_1)) -def test_capped_distance_checkbrute(box, query): +@pytest.mark.parametrize('box, query , method', + itertools.product(boxes_1, query_1, method_1)) +def test_capped_distance_checkbrute(box, query, method): max_cutoff = 0.3 # capped distance should be able to handle array of vectors # as well as single vectors. pairs, dist = mda.lib.distances.capped_distance(query, points, max_cutoff, - box=box) + box=box, + method=method) if(query.shape[0] == 3): distances = mda.lib.distances.distance_array(query[None, :], points, box=box) From 0f6613fbdb37e2f37a7675f024542aa1cb54061c Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Mon, 25 Jun 2018 11:17:07 +0100 Subject: [PATCH 120/455] no longer checking for lengths --- package/MDAnalysis/transformations/translate.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 17e39b52674..f188f37ef16 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -95,7 +95,7 @@ def center_in_box(ag, center='geometry', point=None, pbc=False): that the center of mass/geometry of the given AtomGroup is aligned to this position instead. Defined as an array of size 3. Example: [1, 2, 3] pbc: bool, optional - If True, all the atoms from the given AtomGroup will be moved to the unit cell + If `True`, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry. Default is `False`, no changes to the atom coordinates are done before calculating the center of the AtomGroup. @@ -106,8 +106,10 @@ def center_in_box(ag, center='geometry', point=None, pbc=False): """ pbc_arg = pbc - if point and len(point)!=3: - raise ValueError('{} is not a valid point'.format(point)) + if point: + point = np.asarray(point, np.float32) + if point.shape != (3, ) and point.shape != (1, 3): + raise ValueError('{} is not a valid point'.format(point)) try: if center == 'geometry': center_method = partial(ag.center_of_geometry, pbc=pbc_arg) @@ -122,10 +124,10 @@ def center_in_box(ag, center='geometry', point=None, pbc=False): raise ValueError('{} is not an AtomGroup object'.format(ag)) def wrapped(ts): - if point: - boxcenter = np.float32(point) - else: + if point is None: boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 + else: + boxcenter = np.float32(point) ag_center = center_method() From 67142c051dfff5dd9c0198637035e5ef7fdad2f8 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Mon, 25 Jun 2018 11:18:13 +0100 Subject: [PATCH 121/455] no longer checking for lengths ; added test to rotation matrix function --- package/MDAnalysis/transformations/rotate.py | 40 +++++++++++-------- .../transformations/test_rotate.py | 30 ++++++++++++-- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 0a89dd6c33e..d17a5111a97 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -37,10 +37,10 @@ from ..lib.transformations import rotation_matrix from ..core.groups import AtomGroup -def rotateby(angle, direction, position=None, center="geometry", pbc=None, ag=None): +def rotateby(angle, direction, point=None, center="geometry", pbc=False, ag=None): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by - the user, combining the direction vector and a position. This position can be the center + the user, combining the direction vector and a point. This point can be the center of geometry or the center of mass of a user defined AtomGroup, or a list defining custom coordinates. e.g. rotate the coordinates by pi/2 on a x axis centered on a given atom group: @@ -48,7 +48,7 @@ def rotateby(angle, direction, position=None, center="geometry", pbc=None, ag=No .. code-block:: python ts = u.trajectory.ts - angle = math.pi/2 + angle = 90 ag = u.atoms() rotated = MDAnalysis.transformations.rotate(angle, ag)(ts) @@ -57,7 +57,7 @@ def rotateby(angle, direction, position=None, center="geometry", pbc=None, ag=No .. code-block:: python ts = u.trajectory.ts - angle = math.pi/2 + angle = 90 p = [1,2,3] d = [0,0,1] rotated = MDAnalysis.transformations.rotate(angle, point=point, direction=d)(ts) @@ -75,24 +75,30 @@ def rotateby(angle, direction, position=None, center="geometry", pbc=None, ag=No center: str, optional used to choose the method of centering on the given atom group. Can be 'geometry' or 'mass' - pbc: bool or None, optional - If True, all the atoms from the given AtomGroup will be moved to the unit cell - before calculating the center. Warning: Wrapping/unwrapping the trajectory or - performing PBC corrections may not be possible after rotating the trajectory. - position: array-like, optional + pbc: bool, optional + If `True`, all the atoms from the given AtomGroup will be moved to the unit cell + before calculating the center of mass or geometry. Default is `False`, no changes + to the atom coordinates are done before calculating the center of the AtomGroup. + point: array-like, optional list of the coordinates of the point from where a custom axis of rotation will be defined. Returns ------- :class:`~MDAnalysis.coordinates.base.Timestep` object + + Warning + ------- + Wrapping/unwrapping the trajectory or performing PBC corrections may not be possible + after rotating the trajectory. ''' pbc_arg = pbc angle = np.deg2rad(angle) - if position: - if len(position)!=3: - raise ValueError('{} is not a valid point'.format(position)) + if point: + point = np.asarray(point, np.float32) + if point.shape != (3, ) and point.shape != (1, 3): + raise ValueError('{} is not a valid point'.format(point)) elif ag: try: if center == 'geometry': @@ -107,14 +113,14 @@ def rotateby(angle, direction, position=None, center="geometry", pbc=None, ag=No else: raise ValueError('{} is not an AtomGroup object'.format(ag)) else: - raise ValueError('A position or an AtomGroup must be specified') + raise ValueError('A point or an AtomGroup must be specified') def wrapped(ts): - if position: - point = position + if point is None: + position = center_method() else: - point = center_method() - rotation = rotation_matrix(angle, direction, point)[:3, :3] + position = point + rotation = rotation_matrix(angle, direction, position)[:3, :3] ts.positions= np.dot(ts.positions, rotation) return ts diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index e3b50e50d18..20d82a765fc 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -39,8 +39,30 @@ def rotate_universes(): transformed.trajectory.ts.dimensions = np.array([372., 373., 374., 90, 90, 90]) return reference, transformed +def test_rotation_matrix(): + # test if the rotation_matrix function is working properly + # simple angle and unit vector on origin + angle = 180 + vector = [0, 0, 1] + pos = [0, 0, 0] + ref_matrix = np.asarray([[-1, 0, 0], + [0, -1, 0], + [0, 0, 1]], np.float64) + matrix = rotation_matrix(np.deg2rad(angle), vector, pos)[:3, :3] + assert_array_almost_equal(matrix, ref_matrix, decimal=6) + # another angle in a custom axis + angle = 60 + vector = [1, 2, 3] + pos = [1, 2, 3] + ref_matrix = np.asarray([[ 0.53571429, -0.6229365 , 0.57005291], + [ 0.76579365, 0.64285714, -0.01716931], + [-0.35576719, 0.44574074, 0.82142857]], np.float64) + matrix = rotation_matrix(np.deg2rad(angle), vector, pos)[:3, :3] + assert_array_almost_equal(matrix, ref_matrix, decimal=6) + + def test_rotateby_custom_position(rotate_universes): - # what happens when we use a custom position for the axis of rotation? + # what happens when we use a custom point for the axis of rotation? ref_u = rotate_universes[0] trans_u = rotate_universes[1] trans = trans_u.trajectory.ts @@ -50,7 +72,7 @@ def test_rotateby_custom_position(rotate_universes): angle = 90 matrix = rotation_matrix(np.deg2rad(angle), vector, pos)[:3, :3] ref.positions = np.dot(ref.positions, matrix) - transformed = rotateby(angle, vector, position=pos)(trans) + transformed = rotateby(angle, vector, point=pos)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_cog_nopbc(rotate_universes): @@ -136,7 +158,7 @@ def test_rotateby_bad_position(rotate_universes): vector = [0, 0, 1] bad_position = [1] with pytest.raises(ValueError): - rotateby(angle, vector, position=bad_position)(ts) + rotateby(angle, vector, point=bad_position)(ts) def test_rotateby_bad_pbc(rotate_universes): # this universe as a box size zero @@ -176,7 +198,7 @@ def test_rotateby_no_args(rotate_universes): ts = rotate_universes[0].trajectory.ts angle = 90 vector = [0, 0, 1] - # if no position or AtomGroup are passed to the function + # if no point or AtomGroup are passed to the function # it should raise a ValueError with pytest.raises(ValueError): rotateby(angle, vector)(ts) \ No newline at end of file From cf9c6c5f068e741a235fefc4b171cfe892232374 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Mon, 25 Jun 2018 11:20:00 +0100 Subject: [PATCH 122/455] typo in doc --- package/MDAnalysis/transformations/rotate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index d17a5111a97..a3644e74e14 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -43,7 +43,7 @@ def rotateby(angle, direction, point=None, center="geometry", pbc=False, ag=None the user, combining the direction vector and a point. This point can be the center of geometry or the center of mass of a user defined AtomGroup, or a list defining custom coordinates. - e.g. rotate the coordinates by pi/2 on a x axis centered on a given atom group: + e.g. rotate the coordinates by 90 degrees on a x axis centered on a given atom group: .. code-block:: python From d3a7ce1baeae2aa0f38564b8048b4f3835a72fe3 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Fri, 22 Jun 2018 23:26:52 +0200 Subject: [PATCH 123/455] Add a faster function to deduplicate indices `mda.lib.cutil.unique_int_1d` takes a 1D array of integers and returns an array of the unique values. It has similar perormances as `np.unique` for randomly ordered values, but is faster for sorted values. MDAnalysis needs to deduplicate arrays of indices for basic operations. In most cases the indices are sorted so the deduplication can be done in linear complexity. However, `np.unique` is a general function; it systematically sorts the values with a quicksort, which makes the complexity in the order of n log n. `mda.lib.cutil.unique_int_1d` only works on 1D arrays of integer and does not have the optional return values `np.unique` has. It assumes first that the values are sorted and only sorts them if they happen not to be. --- package/CHANGELOG | 1 + package/MDAnalysis/core/groups.py | 13 ++-- package/MDAnalysis/lib/cutil.pyx | 68 +++++++++++++++++++++ package/setup.py | 8 ++- testsuite/MDAnalysisTests/lib/test_cutil.py | 38 ++++++++++++ 5 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 package/MDAnalysis/lib/cutil.pyx create mode 100644 testsuite/MDAnalysisTests/lib/test_cutil.py diff --git a/package/CHANGELOG b/package/CHANGELOG index 85599a41e22..6b7533052bd 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -31,6 +31,7 @@ Enhancements * Added boolean property *Group.isunique (PR #1922) * Added *Group.copy() methods returning an identical copy of the respective group (PR #1922) + * Improves performances when accessing groups (PR #1951) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index a7b53489898..ed8403ccde8 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -104,6 +104,7 @@ from .. import _ANCHOR_UNIVERSES from ..lib import util from ..lib.util import cached, warn_if_not_unique +from ..lib.cutil import unique_int_1d from ..lib import distances from ..lib import transformations from ..selections import get_writer as get_selection_writer_for @@ -1843,7 +1844,7 @@ def residues(self): """A sorted :class:`ResidueGroup` of the unique :class:`Residues` present in the :class:`AtomGroup`. """ - rg = self.universe.residues[np.unique(self.resindices)] + rg = self.universe.residues[unique_int_1d(self.resindices)] rg._cache['isunique'] = True rg._cache['unique'] = rg return rg @@ -1890,7 +1891,7 @@ def segments(self): """A sorted :class:`SegmentGroup` of the unique segments present in the :class:`AtomGroup`. """ - sg = self.universe.segments[np.unique(self.segindices)] + sg = self.universe.segments[unique_int_1d(self.segindices)] sg._cache['isunique'] = True sg._cache['unique'] = sg return sg @@ -2402,7 +2403,7 @@ def split(self, level): accessors.keys())) return [self[levelindices == index] for index in - np.unique(levelindices)] + unique_int_1d(levelindices)] def guess_bonds(self, vdwradii=None): """Guess bonds that exist within this :class:`AtomGroup` and add them to @@ -2675,7 +2676,7 @@ def segments(self): """Get sorted :class:`SegmentGroup` of the unique segments present in the :class:`ResidueGroup`. """ - sg = self.universe.segments[np.unique(self.segindices)] + sg = self.universe.segments[unique_int_1d(self.segindices)] sg._cache['isunique'] = True sg._cache['unique'] = sg return sg @@ -2747,7 +2748,7 @@ def unique(self): """ if self.isunique: return self - _unique = self.universe.residues[np.unique(self.ix)] + _unique = self.universe.residues[unique_int_1d(self.ix)] # Since we know that _unique is a unique ResidueGroup, we set its # uniqueness caches from here: _unique._cache['isunique'] = True @@ -2892,7 +2893,7 @@ def unique(self): """ if self.isunique: return self - _unique = self.universe.segments[np.unique(self.ix)] + _unique = self.universe.segments[unique_int_1d(self.ix)] # Since we know that _unique is a unique SegmentGroup, we set its # uniqueness caches from here: _unique._cache['isunique'] = True diff --git a/package/MDAnalysis/lib/cutil.pyx b/package/MDAnalysis/lib/cutil.pyx new file mode 100644 index 00000000000..1d622f6b251 --- /dev/null +++ b/package/MDAnalysis/lib/cutil.pyx @@ -0,0 +1,68 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +# + +import cython +import numpy as np +cimport numpy as np + + +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +def unique_int_1d(np.ndarray[np.int_t, ndim=1] values): + """ + Find the unique elements of a 1D array of integers. + + This function is optimal on sorted arrays. + + Parameters + ---------- + values: np.ndarray + 1D array of int in which to find the unique values. + + Returns + ------- + np.ndarray + + .. versionadded:: 0.19.0 + """ + cdef bint is_monotonic = True + cdef int i = 0 + cdef int j = 0 + cdef int n_values = values.shape[0] + cdef np.ndarray[np.int_t, ndim=1] result = np.empty(n_values, dtype=int) + + if n_values == 0: + return result + + result[0] = values[0] + for i in range(1, n_values): + if values[i] != result[j]: + j += 1 + result[j] = values[i] + if values[i] < values[i - 1]: + is_monotonic = False + result = result[:j + 1] + if not is_monotonic: + result.sort() + result = unique_int_1d(result) + return result diff --git a/package/setup.py b/package/setup.py index 38420dd2b3c..6782c1ff6f1 100755 --- a/package/setup.py +++ b/package/setup.py @@ -339,6 +339,12 @@ def extensions(config): include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args) + cutil = MDAExtension('MDAnalysis.lib.cutil', + sources=['MDAnalysis/lib/cutil' + source_suffix], + include_dirs=include_dirs, + define_macros=define_macros, + extra_compile_args=extra_compile_args) + encore_utils = MDAExtension('MDAnalysis.analysis.encore.cutils', sources=['MDAnalysis/analysis/encore/cutils' + source_suffix], @@ -361,7 +367,7 @@ def extensions(config): extra_compile_args=extra_compile_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, - ap_clustering, spe_dimred] + ap_clustering, spe_dimred, cutil] cython_generated = [] if use_cython: diff --git a/testsuite/MDAnalysisTests/lib/test_cutil.py b/testsuite/MDAnalysisTests/lib/test_cutil.py new file mode 100644 index 00000000000..12323dfef0e --- /dev/null +++ b/testsuite/MDAnalysisTests/lib/test_cutil.py @@ -0,0 +1,38 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +import pytest +import numpy as np +from numpy.testing import assert_equal + +from MDAnalysis.lib.cutil import unique_int_1d + + +@pytest.mark.parametrize('values', ( + [], # empty array + [1, 1, 1, 1, ], # all identical + [2, 3, 5, 7, ], # all different, monotonic + [5, 2, 7, 3, ], # all different, non-monotonic +)) +def test_unique_int_1d(values): + array = np.array(values, dtype=int) + assert_equal(unique_int_1d(array), np.unique(array)) From 25d355d60b73d8e16fcc6974ba10a82bc38ecfd7 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sat, 23 Jun 2018 09:16:59 +0200 Subject: [PATCH 124/455] Address comments from @richardgowers on #1951 --- package/CHANGELOG | 2 +- package/MDAnalysis/core/groups.py | 2 +- package/MDAnalysis/core/selection.py | 7 +++++-- package/MDAnalysis/lib/NeighborSearch.py | 5 ++++- testsuite/MDAnalysisTests/lib/test_cutil.py | 3 +++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 6b7533052bd..a05f07222a2 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -31,7 +31,7 @@ Enhancements * Added boolean property *Group.isunique (PR #1922) * Added *Group.copy() methods returning an identical copy of the respective group (PR #1922) - * Improves performances when accessing groups (PR #1951) + * Use a faster function to deduplicate indices (PR #1951) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index ed8403ccde8..10dbafd9dcb 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -740,7 +740,7 @@ def center(self, weights, pbc=None, compound='group'): # Get sizes of compounds: unique_compound_indices, compound_sizes = np.unique(compound_indices, return_counts=True) - unique_compound_sizes = np.unique(compound_sizes) + unique_compound_sizes = unique_int_1d(compound_sizes) # Compute centers per compound for each compound size: for compound_size in unique_compound_sizes: compound_mask = compound_sizes == compound_size diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index d8a7b6d7815..f25c1e1fad1 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -51,6 +51,7 @@ from Bio.KDTree import KDTree from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.cutil import unique_int_1d from MDAnalysis.core import flags from ..lib import distances from ..exceptions import SelectionError, NoDataError @@ -219,7 +220,7 @@ class ByResSelection(UnarySelection): def apply(self, group): res = self.sel.apply(group) - unique_res = np.unique(res.resids) + unique_res = unique_int_1d(res.resids) mask = np.in1d(group.resids, unique_res) return group[mask].unique @@ -290,7 +291,9 @@ def _apply_KDTree(self, group): for atom in sel.positions: kdtree.search(atom, self.cutoff) found_indices.append(kdtree.get_indices()) - unique_idx = np.unique(np.concatenate(found_indices)) + unique_idx = unique_int_1d( + np.concatenate(found_indices).astype(np.int64) + ) else: kdtree = PeriodicKDTree(box, bucket_size=10) diff --git a/package/MDAnalysis/lib/NeighborSearch.py b/package/MDAnalysis/lib/NeighborSearch.py index b9b75ca0161..b077a37b671 100644 --- a/package/MDAnalysis/lib/NeighborSearch.py +++ b/package/MDAnalysis/lib/NeighborSearch.py @@ -32,6 +32,7 @@ import numpy as np from Bio.KDTree import KDTree from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.cutil import unique_int_1d from MDAnalysis.core.groups import AtomGroup, Atom @@ -94,7 +95,9 @@ def search(self, atoms, radius, level='A'): for pos in positions: self.kdtree.search(pos, radius) indices.append(self.kdtree.get_indices()) - unique_idx = np.unique([i for l in indices for i in l]).astype(np.int64) + unique_idx = unique_int_1d( + np.array([i for l in indices for i in l], dtype=np.int64) + ) return self._index2level(unique_idx, level) def _index2level(self, indices, level): diff --git a/testsuite/MDAnalysisTests/lib/test_cutil.py b/testsuite/MDAnalysisTests/lib/test_cutil.py index 12323dfef0e..9c12486d446 100644 --- a/testsuite/MDAnalysisTests/lib/test_cutil.py +++ b/testsuite/MDAnalysisTests/lib/test_cutil.py @@ -19,6 +19,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # +from __future__ import absolute_import import pytest import numpy as np @@ -32,6 +33,8 @@ [1, 1, 1, 1, ], # all identical [2, 3, 5, 7, ], # all different, monotonic [5, 2, 7, 3, ], # all different, non-monotonic + [1, 2, 2, 4, 4, 6, ], # duplicates, monotonic + [1, 2, 2, 6, 4, 4, ], # duplicates, non-monotonic )) def test_unique_int_1d(values): array = np.array(values, dtype=int) From e7ba5c39bcd242b3a6d18e739314cd69fa197e10 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sat, 23 Jun 2018 09:39:22 +0200 Subject: [PATCH 125/455] Make unique_int_1d accessible through lib.util Hide the implementation details amongst utils. The user does not need to know that some util functions are written in pure python or in cython. --- package/MDAnalysis/core/groups.py | 3 +-- package/MDAnalysis/core/selection.py | 2 +- package/MDAnalysis/lib/NeighborSearch.py | 2 +- package/MDAnalysis/lib/{cutil.pyx => _cutil.pyx} | 2 ++ package/MDAnalysis/lib/util.py | 2 ++ package/setup.py | 4 ++-- testsuite/MDAnalysisTests/lib/test_cutil.py | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) rename package/MDAnalysis/lib/{cutil.pyx => _cutil.pyx} (98%) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 10dbafd9dcb..816745d5a8b 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -103,8 +103,7 @@ from .. import _ANCHOR_UNIVERSES from ..lib import util -from ..lib.util import cached, warn_if_not_unique -from ..lib.cutil import unique_int_1d +from ..lib.util import cached, warn_if_not_unique, unique_int_1d from ..lib import distances from ..lib import transformations from ..selections import get_writer as get_selection_writer_for diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index f25c1e1fad1..55ae5ee71aa 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -51,7 +51,7 @@ from Bio.KDTree import KDTree from MDAnalysis.lib.pkdtree import PeriodicKDTree -from MDAnalysis.lib.cutil import unique_int_1d +from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core import flags from ..lib import distances from ..exceptions import SelectionError, NoDataError diff --git a/package/MDAnalysis/lib/NeighborSearch.py b/package/MDAnalysis/lib/NeighborSearch.py index b077a37b671..a1a9feca073 100644 --- a/package/MDAnalysis/lib/NeighborSearch.py +++ b/package/MDAnalysis/lib/NeighborSearch.py @@ -32,7 +32,7 @@ import numpy as np from Bio.KDTree import KDTree from MDAnalysis.lib.pkdtree import PeriodicKDTree -from MDAnalysis.lib.cutil import unique_int_1d +from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core.groups import AtomGroup, Atom diff --git a/package/MDAnalysis/lib/cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx similarity index 98% rename from package/MDAnalysis/lib/cutil.pyx rename to package/MDAnalysis/lib/_cutil.pyx index 1d622f6b251..a342650dec7 100644 --- a/package/MDAnalysis/lib/cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -25,6 +25,8 @@ import cython import numpy as np cimport numpy as np +__all__ = ['unique_int_1d', ] + @cython.boundscheck(False) # turn off bounds-checking for entire function @cython.wraparound(False) # turn off negative index wrapping for entire function diff --git a/package/MDAnalysis/lib/util.py b/package/MDAnalysis/lib/util.py index c5c9a72f574..e970ce0f4ae 100644 --- a/package/MDAnalysis/lib/util.py +++ b/package/MDAnalysis/lib/util.py @@ -109,6 +109,7 @@ .. autofunction:: asiterable .. autofunction:: hasmethod .. autoclass:: Namespace +.. autofunction:: unique_int_1d File parsing ------------ @@ -178,6 +179,7 @@ import inspect from ..exceptions import StreamWarning, DuplicateWarning +from ._cutil import * # Python 3.0, 3.1 do not have the builtin callable() diff --git a/package/setup.py b/package/setup.py index 6782c1ff6f1..ca7cd30edce 100755 --- a/package/setup.py +++ b/package/setup.py @@ -339,8 +339,8 @@ def extensions(config): include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args) - cutil = MDAExtension('MDAnalysis.lib.cutil', - sources=['MDAnalysis/lib/cutil' + source_suffix], + cutil = MDAExtension('MDAnalysis.lib._cutil', + sources=['MDAnalysis/lib/_cutil' + source_suffix], include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args) diff --git a/testsuite/MDAnalysisTests/lib/test_cutil.py b/testsuite/MDAnalysisTests/lib/test_cutil.py index 9c12486d446..2b79975a092 100644 --- a/testsuite/MDAnalysisTests/lib/test_cutil.py +++ b/testsuite/MDAnalysisTests/lib/test_cutil.py @@ -25,7 +25,7 @@ import numpy as np from numpy.testing import assert_equal -from MDAnalysis.lib.cutil import unique_int_1d +from MDAnalysis.lib._cutil import unique_int_1d @pytest.mark.parametrize('values', ( From a0bc631699f7619a12aa2ecda1e3fa06113c9507 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sat, 23 Jun 2018 10:16:12 +0200 Subject: [PATCH 126/455] Be more specific about types in unique_int_1d Hopefully it will solves issues on windows. --- package/MDAnalysis/lib/_cutil.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index a342650dec7..856d3f4a06e 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -30,7 +30,7 @@ __all__ = ['unique_int_1d', ] @cython.boundscheck(False) # turn off bounds-checking for entire function @cython.wraparound(False) # turn off negative index wrapping for entire function -def unique_int_1d(np.ndarray[np.int_t, ndim=1] values): +def unique_int_1d(np.ndarray[np.int64_t, ndim=1] values): """ Find the unique elements of a 1D array of integers. @@ -51,7 +51,7 @@ def unique_int_1d(np.ndarray[np.int_t, ndim=1] values): cdef int i = 0 cdef int j = 0 cdef int n_values = values.shape[0] - cdef np.ndarray[np.int_t, ndim=1] result = np.empty(n_values, dtype=int) + cdef np.ndarray[np.int64_t, ndim=1] result = np.empty(n_values, dtype=np.int64) if n_values == 0: return result From f02868cf7234761e3e31c757f48569b508e72289 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 26 Jun 2018 14:07:42 -0700 Subject: [PATCH 127/455] Added rules for method selection and modifications --- package/MDAnalysis/lib/distances.py | 70 +++++++++++++++++------------ 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 8c772b55d6a..341a1307d6b 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -1,4 +1,4 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- + # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # # MDAnalysis --- https://www.mdanalysis.org @@ -406,10 +406,11 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N Parameters ----------- reference : array - The shape of the reference array should be ``(N, 3)`` - or a (3, ) coordinate. + reference coordinates array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)`` configuration : array - Similar to reference array and second group of coordinates + Configuration coordinate array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)`` max_cutoff : float Maximum cutoff distance between the reference and configuration min_cutoff : (optional) float @@ -451,9 +452,6 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N .. SeeAlso:: :func:'MDAnalysis.lib.distances.distance_array' .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree' - Similar methods can be defined and can be directly linked to this function. - - """ if box is not None: @@ -463,22 +461,16 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N box = triclinic_vectors(box) if (boxtype == 'tri_vecs_bad'): box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - if method is None: - method = _determine_method(reference, configuration, - max_cutoff, box=box) - - if method == 'bruteforce': - pairs, dist = _bruteforce_capped(reference, configuration, - max_cutoff, min_cutoff=min_cutoff, - box=box) - if method == 'pkdtree': - pairs, dist = _pkdtree_capped(reference, configuration, - max_cutoff, min_cutoff=min_cutoff, - box=box) + method = _determine_method(reference, configuration, + max_cutoff, min_cutoff=min_cutoff, + box=box, method=method) + pairs, dist = method(reference, configuration, max_cutoff, + min_cutoff=min_cutoff, box=box) + return np.array(pairs), np.array(dist) -def _determine_method(reference, configuration, cutoff, box): +def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None): """ Switch between different methods based on the the optimized time. All the rules to select the method based on the input can be @@ -486,22 +478,44 @@ def _determine_method(reference, configuration, cutoff, box): Returns ------- - String of the method. Supports ``bruteforce`` or ``pkdt`` as of now + Function object based on the rules and specified method + + Currently implemented methods are + bruteforce : returns ``_bruteforce_capped`` + PKDtree : return ``_pkdtree_capped` - Note - ---- - Just a basic rule based on the number of particles """ - # if (len(reference) > 1000) or (len(configuration) > 1000): - # return 'pkdtree' - return 'bruteforce' + methods = {'bruteforce': _bruteforce_capped, + 'pkdtree':_pkdtree_capped} + + if method is not None: + return methods[method] + + if len(reference) > 5000 and len(configuration) > 5000: + if box is None and reference.shape[0] != 3 and configuration.shape[0] != 3: + min_dim = np.array([reference.min(axis=0), + configuration.min(axis=0)]) + max_dim = np.array([reference.max(axis=0), + configuration.max(axis=0)]) + size = max_dim.max(axis=0) - min_dim.min(axis=0) + elif box is not None: + if box.shape[0] == 6: + size = box[:3] + else: + size = box.max(axis=0) - box.min(axis=0) + + if np.any(size < 10.0*max_cutoff) and len(reference) > 100000 and len(configuration) > 100000: + return methods['bruteforce'] + else: + return methods['pkdtree'] + return methods['bruteforce'] def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): """ Using naive distance calulations, returns a list containing the indices with one from each - reference and configuration list, such that the distance between + reference and configuration arrays, such that the distance between them is less than the specified cutoff distance """ pairs, distance = [], [] From 8883f906fd4d921d050573a1ead297f2624ae008 Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 12 Jun 2018 19:14:31 +0200 Subject: [PATCH 128/455] enforced double precision calculations in *Group.center(); added automatic input dtype conversion to apply_PBC and (self_)distance_array --- package/MDAnalysis/core/groups.py | 18 +++++- package/MDAnalysis/lib/distances.py | 91 ++++++++++++++++------------- 2 files changed, 65 insertions(+), 44 deletions(-) diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 816745d5a8b..68217167934 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -711,11 +711,19 @@ def center(self, weights, pbc=None, compound='group'): atoms = self.atoms + # enforce calculations in double precision: + dtype = np.float64 + if compound.lower() == 'group': if pbc: coords = atoms.pack_into_box(inplace=False) else: coords = atoms.positions + # promote coords or weights to dtype if required: + if weights is None: + coords = coords.astype(dtype, copy=False) + else: + weights = weights.astype(dtype, copy=False) return np.average(coords, weights=weights, axis=0) elif compound.lower() == 'residues': compound_indices = atoms.resindices @@ -728,14 +736,18 @@ def center(self, weights, pbc=None, compound='group'): " one of 'group', 'residues', or 'segments'." "".format(compound)) - # Sort positions and masses by compound index: + # Sort positions and weights by compound index and promote to dtype if + # required: sort_indices = np.argsort(compound_indices) compound_indices = compound_indices[sort_indices] coords = atoms.positions[sort_indices] - if weights is not None: + if weights is None: + coords = coords.astype(dtype, copy=False) + else: + weights = weights.astype(dtype, copy=False) weights = weights[sort_indices] # Allocate output array: - centers = np.zeros((n_compounds, 3), dtype=coords.dtype) + centers = np.zeros((n_compounds, 3), dtype=dtype) # Get sizes of compounds: unique_compound_indices, compound_sizes = np.unique(compound_indices, return_counts=True) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 11ba3c1e112..4719c88b611 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -227,27 +227,29 @@ def distance_array(reference, configuration, box=None, result=None, backend="ser Parameters ---------- - reference : numpy.array of numpy.float32 - Reference coordinate array. - configuration : numpy.array of numpy.float32 - Configuration coordinate array. - box : numpy.array or None + reference : numpy.ndarray + Reference coordinate array of shape ``(n, 3)``, will be converted to + ``dtype=numpy.float32``. + configuration : numpy.ndarray + Configuration coordinate array of shape ``(m, 3)``, will be converted to + ``dtype=numpy.float32``. + box : numpy.ndarray or None Dimensions of the cell; if provided, the minimum image convention is applied. The dimensions must be provided in the same format as returned by by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - result : numpy.array of numpy.float64, optional + result : numpy.ndarray(dtype=numpy.float64), optional Preallocated result array which must have the shape ``(len(ref), len(conf))`` and ``dtype=numpy.float64``. Avoids creating the array which saves time when the function is called repeatedly. [``None``] - backend + backend : str Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). Returns ------- - d : numpy.array + d : numpy.ndarray ``(len(reference),len(configuration))`` numpy array with the distances ``d[i,j]`` between reference coordinates `i` and configuration coordinates `j`. @@ -260,9 +262,11 @@ def distance_array(reference, configuration, box=None, result=None, backend="ser .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Added input array dtype conversion to ``numpy.float32``. """ - ref = reference.copy('C') - conf = configuration.copy('C') + ref = reference.astype(np.float32, order='C', copy=True) + conf = configuration.astype(np.float32, order='C', copy=True) _check_array(conf, 'conf') _check_array(ref, 'ref') @@ -313,25 +317,25 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): Parameters ---------- - reference : array - Reference coordinate array with ``N=len(ref)`` coordinates. - box : array or None + reference : numpy.ndarray + Reference coordinate array with ``N=len(ref)`` coordinates, will be + converted to ``dtype=numpy.float32``. + box : numpy.ndarray or None Dimensions of the cell; if provided, the minimum image convention is applied. The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - result : array, optional - Preallocated result array which must have the shape - ``(N*(N-1)/2,)`` and dtype ``numpy.float64``. Avoids creating - the array which saves time when the function is called - repeatedly. [``None``] - backend + result : numpy.ndarray(dtype=numpy.float64), optional + Preallocated result array which must have the shape ``(N*(N-1)/2,)`` and + dtype ``numpy.float64``. Avoids creating the array which saves time when + the function is called repeatedly. [``None``] + backend : str Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). Returns ------- - d : array + d : numpy.ndarray ``N*(N-1)/2`` numpy 1D array with the distances dist[i,j] between ref coordinates i and j at position d[k]. Loop through d: @@ -345,13 +349,15 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): Note ---- This method is slower than it could be because internally we need to make - copies of the coordinate arrays. + copies of the coordinate array. .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Added input array dtype conversion to ``numpy.float32``. """ - ref = reference.copy('C') + ref = reference.astype(np.float32, order='C', copy=True) _check_array(ref, 'ref') @@ -406,7 +412,7 @@ def transform_RtoS(inputcoords, box, backend="serial"): The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - backend + backend : str Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). @@ -465,7 +471,7 @@ def transform_StoR(inputcoords, box, backend="serial"): The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - backend + backend : str Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). @@ -539,7 +545,7 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): Preallocated result array which must be same length as coord arrays and ``dtype=numpy.float64``. Avoids creating the array which saves time when the function is called repeatedly. [None] - backend + backend : str Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). @@ -611,29 +617,29 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="seria Parameters ---------- - coords1 : array + coords1 : numpy.ndarray Coordinate array of one side of angles. - coords2 : array + coords2 : numpy.ndarray Coordinate array of apex of angles. - coords3 : array + coords3 : numpy.ndarray Coordinate array of other side of angles. - box : array + box : numpy.ndarray, optional The unitcell dimesions for this system. The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - result : array, optional + result : numpy.ndarray, optional Preallocated result array which must be same length as coord arrays and ``dtype=numpy.float64``. Avoids creating the array which saves time when the function is called repeatedly. [None] - backend + backend : str Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). Returns ------- - angles : array - A numpy.array of angles in radians. + angles : numpy.ndarray + An array of angles in radians. .. versionadded:: 0.8 @@ -727,7 +733,7 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, Preallocated result array which must be same length as coord arrays and ``dtype=numpy.float64``. Avoids creating the array which saves time when the function is called repeatedly. [None] - backend + backend : str Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). @@ -796,21 +802,22 @@ def apply_PBC(incoords, box, backend="serial"): Parameters ---------- - coords : array - Coordinate array (of type numpy.float32). + incoords : numpy.ndarray + Coordinate array of shape ``(n, 3)``, will be converted to + ``dtype=numpy.float32``. box : array The unitcell dimesions for this system; can be either orthogonal or triclinic information. The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - backend - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + backend : str + Select the type of acceleration; ``"serial"`` is always available. Other + possibilities are ``"OpenMP"`` (OpenMP). Returns ------- - newcoords : array + newcoords : numpy.ndarray(dtype=numpy.float32) Coordinates that are now all within the primary unit cell, as defined by box. @@ -818,8 +825,10 @@ def apply_PBC(incoords, box, backend="serial"): .. versionadded:: 0.8 .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Added input array dtype conversion to ``numpy.float32``. """ - coords = incoords.copy('C') + coords = incoords.astype(np.float32, order='C', copy=True) _check_array(coords, 'coords') From a5e235b994fbbac94d3f385f0860a3c40e8fb399 Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 27 Jun 2018 12:36:57 +0200 Subject: [PATCH 129/455] input dtype conversion for all functions in lib/distances.py; modified tests accordingly --- package/MDAnalysis/lib/distances.py | 88 +++++++++++------- .../MDAnalysisTests/lib/test_distances.py | 12 +-- .../MDAnalysisTests/utils/test_distances.py | 89 +++---------------- 3 files changed, 70 insertions(+), 119 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 4719c88b611..01bbeb868d0 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -228,11 +228,11 @@ def distance_array(reference, configuration, box=None, result=None, backend="ser Parameters ---------- reference : numpy.ndarray - Reference coordinate array of shape ``(n, 3)``, will be converted to - ``dtype=numpy.float32``. + Reference coordinate array of shape ``(n, 3)`` (``dtype`` is arbitrary, + will be converted to ``dtype=numpy.float32`` internally) configuration : numpy.ndarray - Configuration coordinate array of shape ``(m, 3)``, will be converted to - ``dtype=numpy.float32``. + Configuration coordinate array of shape ``(m, 3)`` (``dtype`` is + arbitrary, will be converted to ``dtype=numpy.float32`` internally) box : numpy.ndarray or None Dimensions of the cell; if provided, the minimum image convention is applied. The dimensions must be provided in the same format as returned @@ -263,7 +263,7 @@ def distance_array(reference, configuration, box=None, result=None, backend="ser .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 - Added input array dtype conversion to ``numpy.float32``. + Internal dtype conversion of input coordinates to ``numpy.float32``. """ ref = reference.astype(np.float32, order='C', copy=True) conf = configuration.astype(np.float32, order='C', copy=True) @@ -318,8 +318,8 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): Parameters ---------- reference : numpy.ndarray - Reference coordinate array with ``N=len(ref)`` coordinates, will be - converted to ``dtype=numpy.float32``. + Reference coordinate array with ``N=len(ref)`` coordinates (``dtype`` is + arbitrary, will be converted to ``dtype=numpy.float32`` internally) box : numpy.ndarray or None Dimensions of the cell; if provided, the minimum image convention is applied. The dimensions must be provided in the same format as returned @@ -355,7 +355,7 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 - Added input array dtype conversion to ``numpy.float32``. + Internal dtype conversion of input coordinates to ``numpy.float32``. """ ref = reference.astype(np.float32, order='C', copy=True) @@ -406,7 +406,8 @@ def transform_RtoS(inputcoords, box, backend="serial"): Parameters ---------- inputcoords : array - A (3,) coordinate or (n x 3) array of coordinates, type ``np.float32``. + A (3,) coordinate or (n x 3) array of coordinates (``dtype`` is + arbitrary, will be converted to ``dtype=numpy.float32`` internally) box : array The unitcell dimesions for this system. The dimensions must be provided in the same format as returned @@ -423,8 +424,10 @@ def transform_RtoS(inputcoords, box, backend="serial"): .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Internal dtype conversion of input coordinates to ``numpy.float32``. """ - coords = inputcoords.copy('C') + coords = inputcoords.astype(np.float32, order='C', copy=True) is_1d = False # True if only one vector coordinate if len(coords.shape) == 1: @@ -465,7 +468,8 @@ def transform_StoR(inputcoords, box, backend="serial"): Parameters ---------- inputcoords : array - A (3,) coordinate or (n x 3) array of coordinates, type ``np.float32``. + A (3,) coordinate or (n x 3) array of coordinates (``dtype`` is + arbitrary, will be converted to ``dtype=numpy.float32`` internally) box : array The unitcell dimesions for this system. The dimensions must be provided in the same format as returned @@ -483,9 +487,10 @@ def transform_StoR(inputcoords, box, backend="serial"): .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Internal dtype conversion of input coordinates to ``numpy.float32``. """ - _check_array_dtype(inputcoords, 'S') - coords = inputcoords.copy('C') + coords = inputcoords.astype(np.float32, order='C', copy=True) is_1d = False # True if only one vector coordinate if len(coords.shape) == 1: @@ -533,9 +538,11 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): Parameters ---------- coords1 : array - An array of coordinates for one half of the bond. + An array of coordinates for one half of the bond (``dtype`` is + arbitrary, will be converted to ``dtype=numpy.float32`` internally) coords2 : array - An array of coordinates for the other half of bond + An array of coordinates for the other half of bond (``dtype`` is + arbitrary, will be converted to ``dtype=numpy.float32`` internally) box : array The unitcell dimesions for this system. The dimensions must be provided in the same format as returned @@ -558,9 +565,11 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): .. versionadded:: 0.8 .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Internal dtype conversion of input coordinates to ``numpy.float32``. """ - atom1 = coords1.copy('C') - atom2 = coords2.copy('C') + atom1 = coords1.astype(np.float32, order='C', copy=True) + atom2 = coords2.astype(np.float32, order='C', copy=True) _check_array(atom1, 'atom1') _check_array(atom2, 'atom2') @@ -618,11 +627,14 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="seria Parameters ---------- coords1 : numpy.ndarray - Coordinate array of one side of angles. + Coordinate array of one side of angles (``dtype`` is arbitrary, will be + converted to ``dtype=numpy.float32`` internally) coords2 : numpy.ndarray - Coordinate array of apex of angles. + Coordinate array of apex of angles (``dtype`` is arbitrary, will be + converted to ``dtype=numpy.float32`` internally) coords3 : numpy.ndarray - Coordinate array of other side of angles. + Coordinate array of other side of angles (``dtype`` is arbitrary, will be + converted to ``dtype=numpy.float32`` internally) box : numpy.ndarray, optional The unitcell dimesions for this system. The dimensions must be provided in the same format as returned @@ -647,10 +659,12 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="seria Added optional box argument to account for periodic boundaries in calculation .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Internal dtype conversion of input coordinates to ``numpy.float32``. """ - atom1 = coords1.copy('C') - atom2 = coords2.copy('C') - atom3 = coords3.copy('C') + atom1 = coords1.astype(np.float32, order='C', copy=True) + atom2 = coords2.astype(np.float32, order='C', copy=True) + atom3 = coords3.astype(np.float32, order='C', copy=True) numatom = atom1.shape[0] _check_array(atom1, 'coords1') @@ -717,13 +731,17 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, Parameters ---------- coords1 : array - Coordinate array of 1st atom in dihedrals. + Coordinate array of 1st atom in dihedrals (``dtype`` is arbitrary, will + be converted to ``dtype=numpy.float32`` internally) coords2 : array - Coordinate array of 2nd atom in dihedrals. + Coordinate array of 2nd atom in dihedrals (``dtype`` is arbitrary, will + be converted to ``dtype=numpy.float32`` internally) coords3 : array - Coordinate array of 3rd atom in dihedrals. + Coordinate array of 3rd atom in dihedrals (``dtype`` is arbitrary, will + be converted to ``dtype=numpy.float32`` internally) coords4 : array - Coordinate array of 4th atom in dihedrals. + Coordinate array of 4th atom in dihedrals (``dtype`` is arbitrary, will + be converted to ``dtype=numpy.float32`` internally) box : array The unitcell dimesions for this system. The dimensions must be provided in the same format as returned @@ -750,11 +768,13 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, Renamed from calc_torsions to calc_dihedrals .. versionchanged:: 0.13.0 Added *backend* keyword. + .. versionchanged:: 0.19.0 + Internal dtype conversion of input coordinates to ``numpy.float32``. """ - atom1 = coords1.copy('C') - atom2 = coords2.copy('C') - atom3 = coords3.copy('C') - atom4 = coords4.copy('C') + atom1 = coords1.astype(np.float32, order='C', copy=True) + atom2 = coords2.astype(np.float32, order='C', copy=True) + atom3 = coords3.astype(np.float32, order='C', copy=True) + atom4 = coords4.astype(np.float32, order='C', copy=True) _check_array(atom1, 'atom1') _check_array(atom2, 'atom2') @@ -803,8 +823,8 @@ def apply_PBC(incoords, box, backend="serial"): Parameters ---------- incoords : numpy.ndarray - Coordinate array of shape ``(n, 3)``, will be converted to - ``dtype=numpy.float32``. + Coordinate array of shape ``(n, 3)`` (``dtype`` is arbitrary, will be + converted to ``dtype=numpy.float32`` internally) box : array The unitcell dimesions for this system; can be either orthogonal or triclinic information. The dimensions must be provided in the same @@ -826,7 +846,7 @@ def apply_PBC(incoords, box, backend="serial"): .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 - Added input array dtype conversion to ``numpy.float32``. + Internal dtype conversion of input coordinates to ``numpy.float32``. """ coords = incoords.astype(np.float32, order='C', copy=True) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 71e74231239..9a6c5aff6c6 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -27,19 +27,13 @@ import MDAnalysis as mda -def test_transform_StoR_pass(): +@pytest.mark.parametrize('coord_dtype', (np.float32, np.float64)) +def test_transform_StoR_pass(coord_dtype): box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) - s = np.array([[0.5, -0.1, 0.5]], dtype=np.float32) + s = np.array([[0.5, -0.1, 0.5]], dtype=coord_dtype) original_r = np.array([[ 5.75, 0.36066014, 0.75000012]], dtype=np.float32) test_r = mda.lib.distances.transform_StoR(s, box) assert_equal(original_r, test_r) - -def test_transform_StoR_fail(): - box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) - s = np.array([[0.5, -0.1, 0.5]]) - - with pytest.raises(TypeError, match='S must be of type float32'): - r = mda.lib.distances.transform_StoR(s, box) diff --git a/testsuite/MDAnalysisTests/utils/test_distances.py b/testsuite/MDAnalysisTests/utils/test_distances.py index 5b29ca9b554..fa57a16d0ac 100644 --- a/testsuite/MDAnalysisTests/utils/test_distances.py +++ b/testsuite/MDAnalysisTests/utils/test_distances.py @@ -388,6 +388,10 @@ def positions(): d = np.array([[0., 0., 0.], [3., 3., 3.], [11., -11., 0.], [65., -65., 65.]], dtype=np.float32) return a, b, c, d + @staticmethod + def convert_position_dtype(a, b, c, d, dtype): + return a.astype(dtype), b.astype(dtype), c.astype(dtype), d.astype(dtype) + @staticmethod @pytest.fixture() def wrongtype(): @@ -402,8 +406,9 @@ def wronglength(): return np.array([[0., 0., 0.], [3., 3., 3.]], dtype=np.float32) - def test_bonds(self, positions, box, backend): - a, b, c, d = positions + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) + def test_bonds(self, positions, box, backend, dtype): + a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) dists = MDAnalysis.lib.distances.calc_bonds(a, b, backend=backend) assert_equal(len(dists), 4, err_msg="calc_bonds results have wrong length") @@ -423,23 +428,6 @@ def test_bonds(self, positions, box, backend): assert_almost_equal(dists_pbc[3], 3.46410072, self.prec, err_msg="PBC check #w with box") - #Bad input checking - def test_bonds_wrongtype(self, positions, wrongtype, wronglength, backend): - a, b, c, d = positions - - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_bonds(a, wrongtype, backend=backend) - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_bonds(wrongtype, b, backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_bonds(a, wronglength, backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_bonds(wronglength, b, backend= - backend) - - def test_bonds_badbox(self, positions, backend): a, b, c, d = positions badboxtype = np.array([10., 10., 10.], dtype=np.float64) @@ -469,8 +457,9 @@ def test_bonds_triclinic(self, positions, triclinic_box, backend): reference = np.array([0.0, 1.7320508, 1.4142136, 2.82842712]) assert_almost_equal(dists, reference, self.prec, err_msg="calc_bonds with triclinic box failed") - def test_angles(self, positions, backend): - a, b, c, d = positions + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) + def test_angles(self, positions, backend, dtype): + a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) angles = MDAnalysis.lib.distances.calc_angles(a, b, c, backend=backend) # Check calculated values @@ -484,36 +473,6 @@ def test_angles(self, positions, backend): assert_almost_equal(angles[3], 0.098174833, self.prec, err_msg="Small angle failed in calc_angles") - # Check data type checks - def test_angles_wrongtype(self, positions, wrongtype, wronglength, backend): - a, b, c, d = positions - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_angles( - a, wrongtype, c, backend=backend) - - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_angles() - wrongtype, b, c, backend = backend - - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_angles( - a, b, wrongtype, backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_angles( - a, wronglength, c, - backend=backend) # try inputting arrays of different length - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_angles( - wronglength, b, c, - backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_angles( - a, b, wronglength, - backend=backend) - def test_angles_bad_result(self, positions, backend): a, b, c, d = positions badresult = np.zeros(len(a) - 1) @@ -521,8 +480,9 @@ def test_angles_bad_result(self, positions, backend): MDAnalysis.lib.distances.calc_angles( a, b, c, result=badresult, backend=backend) # Bad result array - def test_dihedrals(self, positions, backend): - a, b, c, d = positions + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) + def test_dihedrals(self, positions, backend, dtype): + a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) dihedrals = MDAnalysis.lib.distances.calc_dihedrals(a, b, c, d, backend=backend) @@ -534,29 +494,6 @@ def test_dihedrals(self, positions, backend): assert_almost_equal(dihedrals[3], -0.50714064, self.prec, err_msg="arbitrary dihedral angle failed") - # Check data type checks - def test_dihedrals_wrongtype(self, positions, wrongtype, backend): - a, b, c, d = positions - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_dihedrals( - a, wrongtype, c, d, - backend=backend) # try inputting float64 values - - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_dihedrals( - wrongtype, b, c, d, - backend=backend) - - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_dihedrals( - a, b, wrongtype, d, - backend=backend) - - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_dihedrals( - a, b, c, wrongtype, - backend=backend) - def test_dihedrals_wronglength(self, positions, wronglength, backend): a, b, c, d = positions with pytest.raises(ValueError): From 36a7a5a01dfa2deaa03c8ffeaa2e277491816a4a Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 27 Jun 2018 20:00:28 +0200 Subject: [PATCH 130/455] updated CHANGELOG for PR #1936 --- package/CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package/CHANGELOG b/package/CHANGELOG index a05f07222a2..d54a313609a 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -32,6 +32,9 @@ Enhancements * Added *Group.copy() methods returning an identical copy of the respective group (PR #1922) * Use a faster function to deduplicate indices (PR #1951) + * Calculations in *Group.center() are performed in double precision (#PR1936) + * Functions in lib.distances accept coordinate arrays of arbitrary dtype + (PR #1936) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) From 339c5106d8ee71d6c9a7ab88eb2fd6fbd2354140 Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 27 Jun 2018 22:05:01 +0200 Subject: [PATCH 131/455] updated weblinks to PDB file format in PDB.py and PDBQT.py --- package/MDAnalysis/coordinates/PDB.py | 54 ++++++++++++------------- package/MDAnalysis/coordinates/PDBQT.py | 10 ++--- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/package/MDAnalysis/coordinates/PDB.py b/package/MDAnalysis/coordinates/PDB.py index fed31308144..a084b403626 100644 --- a/package/MDAnalysis/coordinates/PDB.py +++ b/package/MDAnalysis/coordinates/PDB.py @@ -136,7 +136,7 @@ .. _`PDB 3.2 standard`: - http://www.wwpdb.org/documentation/format32/v3.2.html + http://www.wwpdb.org/documentation/file-format-content/format32/v3.2.html """ from __future__ import absolute_import @@ -180,11 +180,11 @@ class PDBReader(base.ReaderBase): Reads multi-`MODEL`_ PDB files as trajectories. .. _PDB-formatted: - http://www.wwpdb.org/documentation/file-format-content/format33/v3.3.html + http://www.wwpdb.org/documentation/file-format-content/format32/v3.2.html .. _PDB coordinate section: - http://www.wwpdb.org/documentation/format32/sect9.html + http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html .. _MODEL: - http://www.wwpdb.org/documentation/format32/sect9.html#MODEL + http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#MODEL ============= ============ =========== ============================================= COLUMNS DATA TYPE FIELD DEFINITION @@ -428,10 +428,10 @@ class PDBWriter(base.WriterBase): multiple models (using the MODEL_ and ENDMDL_ records). .. _`PDB 3.2 standard`: - http://www.wwpdb.org/documentation/format32/v3.2.html - .. _MODEL: http://www.wwpdb.org/documentation/format32/sect9.html#MODEL - .. _ENDMDL: http://www.wwpdb.org/documentation/format32/sect9.html#ENDMDL - .. _CONECT: http://www.wwpdb.org/documentation/format32/sect10.html#CONECT + http://www.wwpdb.org/documentation/file-format-content/format32/v3.2.html + .. _MODEL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#MODEL + .. _ENDMDL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#ENDMDL + .. _CONECT: http://www.wwpdb.org/documentation/file-format-content/format32/sect10.html#CONECT Note @@ -556,9 +556,9 @@ def __init__(self, filename, bonds="conect", n_atoms=None, start=0, step=1, records. If ``None``, then the class default is chosen. [``None``] - .. _CONECT: http://www.wwpdb.org/documentation/format32/sect10.html#CONECT - .. _MODEL: http://www.wwpdb.org/documentation/format32/sect9.html#MODEL - .. _ENDMDL: http://www.wwpdb.org/documentation/format32/sect9.html#ENDMDL + .. _CONECT: http://www.wwpdb.org/documentation/file-format-content/format32/sect10.html#CONECT + .. _MODEL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#MODEL + .. _ENDMDL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#ENDMDL """ # n_atoms = None : dummy keyword argument @@ -870,9 +870,9 @@ def _write_timestep(self, ts, multiframe=False): :class:`PDBWriter` is in single frame mode and no MODEL_ records are written. - .. _MODEL: http://www.wwpdb.org/documentation/format32/sect9.html#MODEL - .. _ENDMDL: http://www.wwpdb.org/documentation/format32/sect9.html#ENDMDL - .. _NUMMDL: http://www.wwpdb.org/documentation/format32/sect2.html#NUMMDL + .. _MODEL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#MODEL + .. _ENDMDL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#ENDMDL + .. _NUMMDL: http://www.wwpdb.org/documentation/file-format-content/format32/sect2.html#NUMMDL .. versionchanged:: 0.7.6 The *multiframe* keyword was added, which completely determines if @@ -929,7 +929,7 @@ def get_attr(attrname, default): vals['segID'] = segids[i][:4] vals['element'] = guess_atom_element(atomnames[i].strip())[:2] - # .. _ATOM: http://www.wwpdb.org/documentation/format32/sect9.html + # .. _ATOM: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#ATOM self.pdbfile.write(self.fmt['ATOM'].format(**vals)) if multiframe: self.ENDMDL() @@ -938,7 +938,7 @@ def get_attr(attrname, default): def HEADER(self, trajectory): """Write HEADER_ record. - .. _HEADER: http://www.wwpdb.org/documentation/format32/sect2.html#HEADER + .. _HEADER: http://www.wwpdb.org/documentation/file-format-content/format32/sect2.html#HEADER """ if not hasattr(trajectory, 'header'): @@ -949,7 +949,7 @@ def HEADER(self, trajectory): def TITLE(self, *title): """Write TITLE_ record. - .. _TITLE: http://www.wwpdb.org/documentation/format32/sect2.html + .. _TITLE: http://www.wwpdb.org/documentation/file-format-content/format32/sect2.html """ line = " ".join(title) # TODO: should do continuation automatically @@ -963,8 +963,8 @@ def REMARK(self, *remarks): See also `REMARK (update)`_. - .. _REMARK: http://www.wwpdb.org/documentation/format32/remarks1.html - .. _REMARK (update): http://www.wwpdb.org/documentation/format32/remarks2.html + .. _REMARK: http://www.wwpdb.org/documentation/file-format-content/format32/remarks1.html + .. _REMARK (update): http://www.wwpdb.org/documentation/file-format-content/format32/remarks2.html """ for remark in remarks: @@ -980,7 +980,7 @@ def COMPND(self, trajectory): def CRYST1(self, dimensions, spacegroup='P 1', zvalue=1): """Write CRYST1_ record. - .. _CRYST1: http://www.wwpdb.org/documentation/format32/sect8.html + .. _CRYST1: http://www.wwpdb.org/documentation/file-format-content/format32/sect8.html#CRYST1 """ self.pdbfile.write(self.fmt['CRYST1'].format( @@ -999,7 +999,7 @@ def MODEL(self, modelnumber): 9999, they will wrap around, i.e., 9998, 9999, 0, 1, 2, ... - .. _MODEL: http://www.wwpdb.org/documentation/format32/sect9.html#MODEL + .. _MODEL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#MODEL .. versionchanged:: 0.18.1 @@ -1016,7 +1016,7 @@ def END(self): method right before closing the file it is recommended to *not* call :meth:`~PDBWriter.END` explicitly. - .. _END: http://www.wwpdb.org/documentation/format32/sect11.html#END + .. _END: http://www.wwpdb.org/documentation/file-format-content/format32/sect11.html#END """ if not self.has_END: @@ -1027,7 +1027,7 @@ def END(self): def ENDMDL(self): """Write the ENDMDL_ record. - .. _ENDMDL: http://www.wwpdb.org/documentation/format32/sect9.html#ENDMDL + .. _ENDMDL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#ENDMDL """ self.pdbfile.write(self.fmt['ENDMDL']) @@ -1035,7 +1035,7 @@ def ENDMDL(self): def CONECT(self, conect): """Write CONECT_ record. - .. _CONECT: http://www.wwpdb.org/documentation/format32/sect10.html#CONECT + .. _CONECT: http://www.wwpdb.org/documentation/file-format-content/format32/sect10.html#CONECT """ conect = ["{0:5d}".format(entry + 1) for entry in conect] @@ -1075,9 +1075,9 @@ class MultiPDBWriter(PDBWriter): and ENDMDL_ records). - .. _MODEL: http://www.wwpdb.org/documentation/format32/sect9.html#MODEL - .. _ENDMDL: http://www.wwpdb.org/documentation/format32/sect9.html#ENDMDL - .. _CONECT: http://www.wwpdb.org/documentation/format32/sect10.html#CONECT + .. _MODEL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#MODEL + .. _ENDMDL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#ENDMDL + .. _CONECT: http://www.wwpdb.org/documentation/file-format-content/format32/sect10.html#CONECT See Also diff --git a/package/MDAnalysis/coordinates/PDBQT.py b/package/MDAnalysis/coordinates/PDBQT.py index 73a817d0f3a..f9e488542a2 100644 --- a/package/MDAnalysis/coordinates/PDBQT.py +++ b/package/MDAnalysis/coordinates/PDBQT.py @@ -59,7 +59,7 @@ class PDBQTReader(base.SingleFrameReaderBase): .. _PDB format documentation: - http://www.wwpdb.org/documentation/format32/sect9.html + http://www.wwpdb.org/documentation/file-format-content/format32/v3.2.html .. _AutoDOCK extensions: http://autodock.scripps.edu/faqs-help/faq/what-is-the-format-of-a-pdbqt-file @@ -192,7 +192,7 @@ def Writer(self, filename, **kwargs): class PDBQTWriter(base.WriterBase): """PDBQT writer that implements a subset of the PDB_ 3.2 standard and the PDBQT_ spec. - .. _PDB: http://www.wwpdb.org/documentation/file-format + .. _PDB: http://www.wwpdb.org/documentation/file-format-content/format32/v3.2.html .. _PDBQT: http://autodock.scripps.edu/faqs-help/faq/what-is-the-format-of-a-pdbqt-file """ @@ -302,18 +302,18 @@ def write(self, selection, frame=None): self.pdb_coor_limits["max"])) # Write title record - # http://www.wwpdb.org/documentation/format32/sect2.html + # http://www.wwpdb.org/documentation/file-format-content/format32/sect2.html line = "FRAME " + str(frame) + " FROM " + str(u.trajectory.filename) self.pdb.write(self.fmt['TITLE'].format(line)) # Write CRYST1 record - # http://www.wwpdb.org/documentation/format32/sect8.html + # http://www.wwpdb.org/documentation/file-format-content/format32/sect8.html box = self.convert_dimensions_to_unitcell(u.trajectory.ts) self.pdb.write(self.fmt['CRYST1'].format(box=box[:3], ang=box[3:], spacegroup='P 1', zvalue=1)) # Write atom records - # http://www.wwpdb.org/documentation/format32/sect9.html + # http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html for serial, (pos, name, resname, chainid, resid, icode, occupancy, tempfactor, charge, element) in enumerate( zip(coor, attrs['names'], attrs['resnames'], attrs['chainids'], From b5c2665157106a8b88600759df5fb4d3b15ea4a2 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Thu, 14 Jun 2018 07:18:44 -0500 Subject: [PATCH 132/455] Added single distance calculations to lib.distances calc_distance, calc_angle and calc_dihedral Fixes Issue #1262 #1938 redid 180 degree angle test for new function --- package/CHANGELOG | 2 + .../analysis/hbonds/hbond_analysis.py | 12 ++--- package/MDAnalysis/core/topologyobjects.py | 33 ++++++------- package/MDAnalysis/lib/distances.py | 48 +++++++++++++++++++ .../core/test_topologyobjects.py | 8 ++-- 5 files changed, 75 insertions(+), 28 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index d54a313609a..ae564c3d795 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -51,6 +51,8 @@ Fixes * PDBWriter now properly sets start value Changes + * Added calc_distance, calc_angle and calc_dihedral to lib.distances + (Issue #1262 #1938) * TopologyAttrs are now statically typed (Issue #1876) * updated meta data for new PyPi (#1837) * AtomGroup.atoms, ResidueGroup.residues, and SegmentGroup.segments now return diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index bf6b376479b..f7edc9d031e 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -328,7 +328,8 @@ class HydrogenBondAnalysis_OtherFF(HydrogenBondAnalysis): from MDAnalysis import MissingDataWarning, NoDataError, SelectionError, SelectionWarning from MDAnalysis.lib.log import ProgressMeter, _set_verbose from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch -from MDAnalysis.lib.distances import calc_bonds, calc_angles +from MDAnalysis.lib import distances +from MDAnalysis.lib.distances import calc_bonds logger = logging.getLogger('MDAnalysis.analysis.hbonds') @@ -1037,17 +1038,12 @@ def _get_timestep(): @staticmethod def calc_angle(d, h, a, box=None): """Calculate the angle (in degrees) between two atoms with H at apex.""" - v1= d.position - v2= h.position - v3= a.position - angle= calc_angles(v1[None, :], v2[None, :], v3[None, :], box=box) - - return np.rad2deg(angle[0]) + return distances.calc_angle(d.position, h.position, a.position, box) @staticmethod def calc_eucl_distance(a1, a2, box=None): """Calculate the Euclidean distance between two atoms. """ - return calc_bonds(a1.position[None, :], a2.position[None, :], box=box)[0] + return distances.calc_distance(a1.position, a2.position, box) @property def timeseries(self): diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index bd586ec0556..2ca6b111c2d 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -197,13 +197,9 @@ def length(self, pbc=False): .. versionchanged:: 0.11.0 Added pbc keyword """ - if pbc: - box = self.universe.dimensions - return distances.self_distance_array( - np.array([self[0].position, self[1].position]), - box=box)[0] - else: - return mdamath.norm(self[0].position - self[1].position) + box = self.universe.dimensions if pbc else None + + return distances.calc_distance(self[0].position, self[1].position, box) value = length @@ -220,7 +216,7 @@ class Angle(TopologyObject): """ btype = 'angle' - def angle(self): + def angle(self, pbc=False): """Returns the angle in degrees of this Angle. Angle between atoms 0 and 2 with apex at 1:: @@ -238,10 +234,13 @@ def angle(self): .. versionadded:: 0.9.0 .. versionchanged:: 0.17.0 Fixed angles close to 180 giving NaN + .. versionchanged:: 0.18.1 + Added pbc keyword """ - a = self[0].position - self[1].position - b = self[2].position - self[1].position - return np.rad2deg(mdamath.angle(a, b)) + box = self.universe.dimensions if pbc else None + + return distances.calc_angle( + self[0].position, self[1].position, self[2].position, box) value = angle @@ -265,7 +264,7 @@ class Dihedral(TopologyObject): # http://cbio.bmt.tue.nl/pumma/uploads/Theory/dihedral.png btype = 'dihedral' - def dihedral(self): + def dihedral(self, pbc=False): """Calculate the dihedral angle in degrees. Dihedral angle around axis connecting atoms 1 and 2 (i.e. the angle @@ -284,12 +283,14 @@ def dihedral(self): 4 decimals (and is only tested to 3 decimals). .. versionadded:: 0.9.0 + .. versionchanged:: 0.18.1 + Added pbc keyword """ + box = self.universe.dimensions if pbc else None A, B, C, D = self.atoms - ab = A.position - B.position - bc = B.position - C.position - cd = C.position - D.position - return np.rad2deg(mdamath.dihedral(ab, bc, cd)) + + return distances.calc_dihedral( + A.position, B.position, C.position, D.position, box) value = dihedral diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 01bbeb868d0..4890fbf0283 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -879,3 +879,51 @@ def apply_PBC(incoords, box, backend="serial"): backend=backend) return coords + + +def calc_distance(a, b, box=None): + """Distance between a and b + + Parameters + ---------- + a, b : numpy.ndarray + single coordinate vectors + box : numpy.ndarray, optional + simulation box, if given periodic boundary conditions will be applied + + .. versionadded:: 0.18.1 + """ + return calc_bonds(a[None, :], b[None, :], box=box)[0] + + +def calc_angle(a, b, c, box=None): + """Angle (in degrees) between a, b and c, where b is apex of angle + + Parameters + ---------- + a, b, c : numpy.ndarray + single coordinate vectors + box : numpy.ndarray, optional + simulation box, if given periodic boundary conditions will be applied + to the vectors a->b and b->c. + + .. versionadded:: 0.18.1 + """ + return np.rad2deg(calc_angles(a[None, :], b[None, :], c[None, :], box=box)[0]) + + +def calc_dihedral(a, b, c, d, box=None): + """Dihedral angle (in degrees) between planes (a, b, c) and (b, c, d) + + Parameters + ---------- + a, b, c, d : numpy.ndarray + single coordinate vectors + box : numpy.ndarray, optional + simulation box, if given periodic boundary conditions will be applied + to the vectors a->b and b->c. + + .. versionadded:: 0.18.1 + """ + return np.rad2deg( + calc_dihedrals(a[None, :], b[None, :], c[None, :], d[None, :], box)[0]) diff --git a/testsuite/MDAnalysisTests/core/test_topologyobjects.py b/testsuite/MDAnalysisTests/core/test_topologyobjects.py index 6a1f9adb708..244771bcfd0 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyobjects.py +++ b/testsuite/MDAnalysisTests/core/test_topologyobjects.py @@ -163,14 +163,14 @@ def test_angle_180(self): # we edit the coordinates, so make our own universe u = mda.Universe(PSF, DCD) angle = u.atoms[210].angles[0] - coords = np.array([[ 83.37363434, 65.01402283, 35.03564835], - [ 82.28535461, 59.99816513, 34.94399261], - [ 81.19387817, 54.97631073, 34.85218048]], + coords = np.array([[1, 1, 1], + [2, 1, 1], + [3, 1, 1]], dtype=np.float32) angle.atoms.positions = coords - assert_almost_equal(angle.value(), -180.0, self.precision) + assert_almost_equal(angle.value(), 180.0, self.precision) # Dihedral class check def test_dihedral(self, PSFDCD): From a40b33ec2a8f5fceb2330c17caf3e71ba551a7bf Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 16 Jun 2018 18:29:26 -0500 Subject: [PATCH 133/455] tests for new functions in lib.distances --- .../MDAnalysisTests/lib/test_distances.py | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 9a6c5aff6c6..571f4893338 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -37,3 +37,92 @@ def test_transform_StoR_pass(coord_dtype): test_r = mda.lib.distances.transform_StoR(s, box) assert_equal(original_r, test_r) + + +# different boxlengths to shift a coordinate +shifts = [ + ((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)), # no shifting + ((1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 0)), # single box lengths + ((-1, 0, 1), (0, -1, 0), (1, 0, 1), (-1, -1, -1)), # negative single + ((4, 3, -2), (-2, 2, 2), (-5, 2, 2), (0, 2, 2)), # multiple boxlengths +] + + +@pytest.mark.parametrize('shift', shifts) +@pytest.mark.parametrize('periodic', [True, False]) +def test_calc_distance(shift, periodic): + box = np.array([10, 10, 10, 90., 90., 90.], dtype=np.float32) + + coords = np.array([[1, 1, 1], [3, 1, 1]], dtype=np.float32) + + shift1, shift2, _, _ = shift + + coords[0] += shift1 * box[:3] + coords[1] += shift2 * box[:3] + + box = box if periodic else None + result = mda.lib.distances.calc_distance(coords[0], coords[1], box) + + reference = 2.0 if periodic else np.linalg.norm(coords[0] - coords[1]) + + assert result == pytest.approx(reference) + + +@pytest.mark.parametrize('case', [ + # 90 degree angle + (np.array([[1, 1, 1], [1, 2, 1], [2, 2, 1]], dtype=np.float32), 90.), + # straight line / 180. + (np.array([[1, 1, 1], [1, 2, 1], [1, 3, 1]], dtype=np.float32), 180.), +]) +@pytest.mark.parametrize('shift', shifts) +@pytest.mark.parametrize('periodic', [True, False]) +def test_calc_angle(case, shift, periodic): + def manual_angle(x, y, z): + return np.rad2deg(mda.lib.mdamath.angle(y - x, y - z)) + + box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) + (a, b, c), ref = case + + shift1, shift2, shift3, _ = shift + + a += shift1 * box[:3] + b += shift2 * box[:3] + c += shift3 * box[:3] + + box = box if periodic else None + result = mda.lib.distances.calc_angle(a, b, c, box) + + reference = ref if periodic else manual_angle(a, b, c) + + assert result == pytest.approx(reference, abs=1e-3) + + +@pytest.mark.parametrize('case', [ + # 0 degree angle (cis) + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 1]], dtype=np.float32), 0.), + # 180 degree (trans) + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 1]], dtype=np.float32), 180.), +]) +@pytest.mark.parametrize('shift', shifts) +@pytest.mark.parametrize('periodic', [True, False]) +def test_calc_dihedral(case, shift, periodic): + def manual_dihedral(a, b, c, d): + return np.rad2deg(mda.lib.mdamath.dihedral(b - a, c - b, d - c)) + + box = np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) + + (a, b, c, d), ref = case + + shift1, shift2, shift3, shift4 = shift + + a += shift1 * box[:3] + b += shift2 * box[:3] + c += shift3 * box[:3] + d += shift4 * box[:3] + + box = box if periodic else None + result = mda.lib.distances.calc_dihedral(a, b, c, d, box) + + reference = ref if periodic else manual_dihedral(a, b, c, d) + + assert abs(result) == pytest.approx(abs(reference), abs=1e-3) From 0da4f4fdc42dc6499b4d6a0b8fc9c3886983f788 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 16 Jun 2018 18:32:09 -0500 Subject: [PATCH 134/455] simplified docstrings --- package/MDAnalysis/lib/distances.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 4890fbf0283..e82455935f9 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -905,7 +905,6 @@ def calc_angle(a, b, c, box=None): single coordinate vectors box : numpy.ndarray, optional simulation box, if given periodic boundary conditions will be applied - to the vectors a->b and b->c. .. versionadded:: 0.18.1 """ @@ -921,7 +920,6 @@ def calc_dihedral(a, b, c, d, box=None): single coordinate vectors box : numpy.ndarray, optional simulation box, if given periodic boundary conditions will be applied - to the vectors a->b and b->c. .. versionadded:: 0.18.1 """ From 0931383da977b4b851169811c939433d7ee4ae09 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 17 Jun 2018 13:59:51 -0500 Subject: [PATCH 135/455] added more tests for single distance calculations --- testsuite/MDAnalysisTests/lib/test_distances.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 571f4893338..611b31c60d1 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -51,7 +51,7 @@ def test_transform_StoR_pass(coord_dtype): @pytest.mark.parametrize('shift', shifts) @pytest.mark.parametrize('periodic', [True, False]) def test_calc_distance(shift, periodic): - box = np.array([10, 10, 10, 90., 90., 90.], dtype=np.float32) + box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) coords = np.array([[1, 1, 1], [3, 1, 1]], dtype=np.float32) @@ -73,6 +73,8 @@ def test_calc_distance(shift, periodic): (np.array([[1, 1, 1], [1, 2, 1], [2, 2, 1]], dtype=np.float32), 90.), # straight line / 180. (np.array([[1, 1, 1], [1, 2, 1], [1, 3, 1]], dtype=np.float32), 180.), + # 45 + (np.array([[1, 1, 1], [1, 2, 1], [2, 1, 1]], dtype=np.float32), 45.), ]) @pytest.mark.parametrize('shift', shifts) @pytest.mark.parametrize('periodic', [True, False]) @@ -102,6 +104,14 @@ def manual_angle(x, y, z): (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 1]], dtype=np.float32), 0.), # 180 degree (trans) (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 1]], dtype=np.float32), 180.), + # 90 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 2]], dtype=np.float32), 90.), + # other 90 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 0]], dtype=np.float32), 90.), + # 45 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 2]], dtype=np.float32), 45.), + # 135 + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 2]], dtype=np.float32), 135.), ]) @pytest.mark.parametrize('shift', shifts) @pytest.mark.parametrize('periodic', [True, False]) From 7a11becb293eaa12127c702ea85e797c209634c2 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 17 Jun 2018 14:02:39 -0500 Subject: [PATCH 136/455] finalised changelog defaulted Bond.value pbc to True to match other objects --- package/CHANGELOG | 6 ++++-- package/MDAnalysis/core/topologyobjects.py | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index ae564c3d795..b104e006aad 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -35,6 +35,10 @@ Enhancements * Calculations in *Group.center() are performed in double precision (#PR1936) * Functions in lib.distances accept coordinate arrays of arbitrary dtype (PR #1936) + * Added calc_distance, calc_angle and calc_dihedral to lib.distances + (Issue #1262 #1938) + * Added pbc kwarg to Bond/Angle/Dihedral/Improper object value method, + default True. (Issue #1938) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) @@ -51,8 +55,6 @@ Fixes * PDBWriter now properly sets start value Changes - * Added calc_distance, calc_angle and calc_dihedral to lib.distances - (Issue #1262 #1938) * TopologyAttrs are now statically typed (Issue #1876) * updated meta data for new PyPi (#1837) * AtomGroup.atoms, ResidueGroup.residues, and SegmentGroup.segments now return diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index 2ca6b111c2d..f26936c4074 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -191,11 +191,13 @@ def partner(self, atom): else: raise ValueError("Unrecognised Atom") - def length(self, pbc=False): + def length(self, pbc=True): """Length of the bond. .. versionchanged:: 0.11.0 Added pbc keyword + .. versionchanged:: 0.18.1 + Changed default of pbc to True """ box = self.universe.dimensions if pbc else None From 0f005f2a0d0d56a966ede42b8d44febcb252911d Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 17 Jun 2018 14:04:06 -0500 Subject: [PATCH 137/455] changed default to pbc to True in TopologyObjects --- package/MDAnalysis/core/topologyobjects.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index f26936c4074..6abfb02eb33 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -218,7 +218,7 @@ class Angle(TopologyObject): """ btype = 'angle' - def angle(self, pbc=False): + def angle(self, pbc=True): """Returns the angle in degrees of this Angle. Angle between atoms 0 and 2 with apex at 1:: @@ -266,7 +266,7 @@ class Dihedral(TopologyObject): # http://cbio.bmt.tue.nl/pumma/uploads/Theory/dihedral.png btype = 'dihedral' - def dihedral(self, pbc=False): + def dihedral(self, pbc=True): """Calculate the dihedral angle in degrees. Dihedral angle around axis connecting atoms 1 and 2 (i.e. the angle From 5353f95a4ed918058e9084714db3d9936a4752cc Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 19 Jun 2018 11:47:42 -0500 Subject: [PATCH 138/455] fixed make_whole now Bond.length() defaults to pbc=True --- package/MDAnalysis/core/topologyobjects.py | 4 ++-- package/MDAnalysis/lib/mdamath.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index 6abfb02eb33..0844efa987e 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -237,7 +237,7 @@ def angle(self, pbc=True): .. versionchanged:: 0.17.0 Fixed angles close to 180 giving NaN .. versionchanged:: 0.18.1 - Added pbc keyword + Added pbc keyword, default True """ box = self.universe.dimensions if pbc else None @@ -286,7 +286,7 @@ def dihedral(self, pbc=True): .. versionadded:: 0.9.0 .. versionchanged:: 0.18.1 - Added pbc keyword + Added pbc keyword, default True """ box = self.universe.dimensions if pbc else None A, B, C, D = self.atoms diff --git a/package/MDAnalysis/lib/mdamath.py b/package/MDAnalysis/lib/mdamath.py index eccc43fdf55..dd58ea12bab 100644 --- a/package/MDAnalysis/lib/mdamath.py +++ b/package/MDAnalysis/lib/mdamath.py @@ -416,7 +416,7 @@ def make_whole(atomgroup, reference_atom=None): continue if other in ref_points: continue - if b.length() > box_length: + if b.length(pbc=False) > box_length: # Vector from ref atom to other vec = other.position - ref.position # Apply pbc to this vector From 61157394f803a73370bf01b4292a6182cb0ec500 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 19 Jun 2018 11:54:13 -0500 Subject: [PATCH 139/455] completely removed HBondAnalysis' distance methods --- .../analysis/hbonds/hbond_analysis.py | 22 ++++++---------- .../analysis/hbonds/wbridge_analysis.py | 25 +++++++++++++------ 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index f7edc9d031e..42b3d9f37f4 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -807,7 +807,7 @@ def _get_bonded_hydrogens_list(self, atom, **kwargs): hydrogens = [ a for a in self.u.atoms[atom.index + 1:atom.index + 4] if (a.name.startswith(('H', '1H', '2H', '3H')) and - self.calc_eucl_distance(atom, a, box) < self.r_cov[atom.name[0]]) + distances.calc_distance(atom.position, a.position, box) < self.r_cov[atom.name[0]]) ] except IndexError: hydrogens = [] # weird corner case that atom is the last one in universe @@ -993,9 +993,10 @@ def _get_timestep(): for h in donor_h_set: res = ns_acceptors.search(h, self.distance) for a in res: - angle = self.calc_angle(d, h, a, box=box) + angle = distances.calc_angle(d.position, h.position, + a.position, box=box) donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a, box) + dist = distances.calc_distance(donor_atom.position, a.position, box) if angle >= self.angle and dist <= self.distance: self.logger_debug( "S1-D: {0!s} <-> S2-A: {1!s} {2:f} A, {3:f} DEG".format(h.index, a.index, dist, angle)) @@ -1018,9 +1019,10 @@ def _get_timestep(): (h.index, a.index) in already_found or (a.index, h.index) in already_found): continue - angle = self.calc_angle(d, h, a, box=box) + angle = distances.calc_angle(d.position, h.position, + a.position, box=box) donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a, box) + dist = distances.calc_distance(donor_atom.position, a.position, box) if angle >= self.angle and dist <= self.distance: self.logger_debug( "S1-A: {0!s} <-> S2-D: {1!s} {2:f} A, {3:f} DEG".format(a.index, h.index, dist, angle)) @@ -1035,16 +1037,6 @@ def _get_timestep(): logger.info("HBond analysis: complete; timeseries %s.timeseries", self.__class__.__name__) - @staticmethod - def calc_angle(d, h, a, box=None): - """Calculate the angle (in degrees) between two atoms with H at apex.""" - return distances.calc_angle(d.position, h.position, a.position, box) - - @staticmethod - def calc_eucl_distance(a1, a2, box=None): - """Calculate the Euclidean distance between two atoms. """ - return distances.calc_distance(a1.position, a2.position, box) - @property def timeseries(self): """Time series of hydrogen bonds. diff --git a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py index 308f7d077a4..e55272c7a2a 100644 --- a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py @@ -292,6 +292,7 @@ class WaterBridgeAnalysis_OtherFF(WaterBridgeAnalysis): from .hbond_analysis import HydrogenBondAnalysis from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch from MDAnalysis.lib.log import ProgressMeter, _set_verbose +from MDAnalysis.lib import distances from MDAnalysis import SelectionWarning logger = logging.getLogger('MDAnalysis.analysis.wbridges') @@ -634,9 +635,11 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a) + dist = distances.calc_distance(donor_atom.position, + a.position) if dist <= self.distance: - angle = self.calc_angle(d, h, a) + angle = distances.calc_angle(d.position, h.position, + a.position) if angle >= self.angle: self.logger_debug( "S1-D: {0!s} <-> W-A: {1!s} {2:f} A, {3:f} DEG"\ @@ -658,9 +661,11 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a) + dist = distances.calc_distance(donor_atom.position, + a.position) if dist <= self.distance: - angle = self.calc_angle(d, h, a) + angle = distances.calc_angle(d.position, h.position, + a.position) if angle >= self.angle: self.logger_debug( "S1-A: {0!s} <-> W-D: {1!s} {2:f} A, {3:f} DEG"\ @@ -706,9 +711,11 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a) + dist = distances.calc_distance(donor_atom.position, + a.position) if dist <= self.distance: - angle = self.calc_angle(d, h, a) + angle = distances.calc_angle(d.position, h.position, + a.position) if angle >= self.angle: self.logger_debug( "WB-D: {0!s} <-> S2-A: {1!s} {2:f} A, {3:f} DEG"\ @@ -728,9 +735,11 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = self.calc_eucl_distance(donor_atom, a) + dist = distances.calc_distance(donor_atom.position, + a.position) if dist <= self.distance: - angle = self.calc_angle(d, h, a) + angle = distances.calc_angle(d.position, h.position, + a.position) if angle >= self.angle: self.logger_debug( "WB-A: {0!s} <-> S2-D: {1!s} {2:f} A, {3:f} DEG"\ From be1ce8cfaa96dfa457efd556d5a4c7b6a5c11b45 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Wed, 20 Jun 2018 09:32:28 -0500 Subject: [PATCH 140/455] removed unused import --- package/MDAnalysis/analysis/hbonds/hbond_analysis.py | 1 - 1 file changed, 1 deletion(-) diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index 42b3d9f37f4..ac38eceb8a9 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -329,7 +329,6 @@ class HydrogenBondAnalysis_OtherFF(HydrogenBondAnalysis): from MDAnalysis.lib.log import ProgressMeter, _set_verbose from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch from MDAnalysis.lib import distances -from MDAnalysis.lib.distances import calc_bonds logger = logging.getLogger('MDAnalysis.analysis.hbonds') From c4fc8ec6d423668d493f79e61ea0421ec6c577e0 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 23 Jun 2018 19:11:04 -0500 Subject: [PATCH 141/455] maybe fixed the docs? --- package/MDAnalysis/lib/distances.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index e82455935f9..d25f5cd8aac 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -887,9 +887,9 @@ def calc_distance(a, b, box=None): Parameters ---------- a, b : numpy.ndarray - single coordinate vectors + single coordinate vectors box : numpy.ndarray, optional - simulation box, if given periodic boundary conditions will be applied + simulation box, if given periodic boundary conditions will be applied .. versionadded:: 0.18.1 """ @@ -902,9 +902,10 @@ def calc_angle(a, b, c, box=None): Parameters ---------- a, b, c : numpy.ndarray - single coordinate vectors - box : numpy.ndarray, optional - simulation box, if given periodic boundary conditions will be applied + single coordinate vectors + box : numpy.ndarray + simulation box if given periodic boundary conditions will be applied to + the vectors between atoms .. versionadded:: 0.18.1 """ @@ -917,9 +918,9 @@ def calc_dihedral(a, b, c, d, box=None): Parameters ---------- a, b, c, d : numpy.ndarray - single coordinate vectors + single coordinate vectors box : numpy.ndarray, optional - simulation box, if given periodic boundary conditions will be applied + simulation box, if given periodic boundary conditions will be applied .. versionadded:: 0.18.1 """ From 068934372d42048bc4e92d903fa434cfc89ee86b Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 24 Jun 2018 10:51:59 -0500 Subject: [PATCH 142/455] really really fixed the docs --- package/MDAnalysis/lib/distances.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index d25f5cd8aac..0411a6d4ab0 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -891,6 +891,7 @@ def calc_distance(a, b, box=None): box : numpy.ndarray, optional simulation box, if given periodic boundary conditions will be applied + .. versionadded:: 0.18.1 """ return calc_bonds(a[None, :], b[None, :], box=box)[0] @@ -907,6 +908,7 @@ def calc_angle(a, b, c, box=None): simulation box if given periodic boundary conditions will be applied to the vectors between atoms + .. versionadded:: 0.18.1 """ return np.rad2deg(calc_angles(a[None, :], b[None, :], c[None, :], box=box)[0]) @@ -922,6 +924,7 @@ def calc_dihedral(a, b, c, d, box=None): box : numpy.ndarray, optional simulation box, if given periodic boundary conditions will be applied + .. versionadded:: 0.18.1 """ return np.rad2deg( From f3cbffdc8bee42a321c6142a5680554268c6541c Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 24 Jun 2018 11:03:23 -0500 Subject: [PATCH 143/455] more doc fixes in lib.distances --- package/MDAnalysis/lib/distances.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 0411a6d4ab0..773eed09336 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -413,7 +413,7 @@ def transform_RtoS(inputcoords, box, backend="serial"): The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - backend : str + backend : str, optional Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). @@ -422,6 +422,7 @@ def transform_RtoS(inputcoords, box, backend="serial"): outcoords : array A n x 3 array of fractional coordiantes. + .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 @@ -475,14 +476,14 @@ def transform_StoR(inputcoords, box, backend="serial"): The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, alpha, beta, gamma]``. - backend : str + backend : str, optional Select the type of acceleration; "serial" is always available. Other possibilities are "OpenMP" (OpenMP). Returns ------- outcoords : array - A n x 3 array of fracional coordiantes. + A n x 3 array of fractional coordiantes. .. versionchanged:: 0.13.0 From 68446bd398ab83a1c3348cc94e2e039f63465ab8 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Fri, 29 Jun 2018 10:12:51 -0500 Subject: [PATCH 144/455] use np.testing.assert_almost_equal not pytest.approx --- testsuite/MDAnalysisTests/lib/test_distances.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 611b31c60d1..61857fffe73 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -23,7 +23,7 @@ from __future__ import absolute_import import pytest import numpy as np -from numpy.testing import assert_equal +from numpy.testing import assert_equal, assert_almost_equal import MDAnalysis as mda @@ -65,7 +65,7 @@ def test_calc_distance(shift, periodic): reference = 2.0 if periodic else np.linalg.norm(coords[0] - coords[1]) - assert result == pytest.approx(reference) + assert_almost_equal(result, reference, decimal=3) @pytest.mark.parametrize('case', [ @@ -96,7 +96,7 @@ def manual_angle(x, y, z): reference = ref if periodic else manual_angle(a, b, c) - assert result == pytest.approx(reference, abs=1e-3) + assert_almost_equal(result, reference, decimal=3) @pytest.mark.parametrize('case', [ @@ -135,4 +135,4 @@ def manual_dihedral(a, b, c, d): reference = ref if periodic else manual_dihedral(a, b, c, d) - assert abs(result) == pytest.approx(abs(reference), abs=1e-3) + assert_almost_equal(abs(result), abs(reference), decimal=3) From ad4b44be6c62f311c46bcca304eeedf52f750a17 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 29 Jun 2018 20:09:37 +0100 Subject: [PATCH 145/455] Changed expected output from 0.0 to Nan. The survival probability is a measure of how likely a selected molecule is to remain within a specified region over a period of time. If at t0 the selected molecule is not in the specified region, no survival probability can be calculated. For example, consider that we would like to calculate the survival probability of an ion at an interface. If the ion never approaches the interface, the previous test would return a survival probability of 0, which suggests that the ion comes to the interface but leaves immediately. However, as the ion was never at the interface, no survival probability can be calculated from this data. --- testsuite/MDAnalysisTests/analysis/test_waterdynamics.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index a4cd5f0e247..3b4abbfe7a3 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -101,8 +101,7 @@ def test_SurvivalProbability_t0Ignored(universe_prot): assert_almost_equal(sp.timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) - def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) sp_zero.run() - assert_almost_equal(sp_zero.timeseries[1], 0.0) + assert np.isnan(sp_zero.timeseries[1]) From 61d9c6b07096ac57f5be7ef682d8a5c78d5d3cf5 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 30 Jun 2018 02:15:23 -0700 Subject: [PATCH 146/455] Changes the return type --- package/MDAnalysis/lib/distances.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 341a1307d6b..51335f96dbb 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -466,8 +466,8 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N box=box, method=method) pairs, dist = method(reference, configuration, max_cutoff, min_cutoff=min_cutoff, box=box) - - return np.array(pairs), np.array(dist) + + return np.asarray(pairs), np.asarray(dist) def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None): From 8c55498b62d6aa3d0687997ed756776694d0040b Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 30 Jun 2018 12:42:29 +0200 Subject: [PATCH 147/455] remove matplotlib warning this warning is issued in a user session when we load files after matplotlib is loaded. This is annoying and not clear why this is happening to a user. --- testsuite/MDAnalysisTests/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/__init__.py b/testsuite/MDAnalysisTests/__init__.py index b4b87f472b3..4ad9d92fdf2 100644 --- a/testsuite/MDAnalysisTests/__init__.py +++ b/testsuite/MDAnalysisTests/__init__.py @@ -121,11 +121,13 @@ # issue #412 https://github.com/MDAnalysis/mdanalysis/issues/412 and PR #1822. os.environ['DUECREDIT_ENABLE'] = 'yes' -# Any tests that plot with matplotlib need to run with the simple agg backend because -# on Travis there is no DISPLAY set +# Any tests that plot with matplotlib need to run with the simple agg backend +# because on Travis there is no DISPLAY set. This doesn't warn if we import +# files from the tests after loading matplotlib. This will remove unnecessary +# user warnings. try: import matplotlib - matplotlib.use('agg') + matplotlib.use('agg', warn=False) except ImportError: pass From 57363bb6bb92365602b9f41d6b168bc376300303 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 30 Jun 2018 12:01:34 -0700 Subject: [PATCH 148/455] fixed the testcase --- testsuite/MDAnalysisTests/lib/test_distances.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 5f5883283bb..c9916b117db 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -43,14 +43,6 @@ def test_transform_StoR_pass(coord_dtype): assert_equal(original_r, test_r) -def test_transform_StoR_fail(): - box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) - s = np.array([[0.5, -0.1, 0.5]]) - - with pytest.raises(TypeError, match='S must be of type float32'): - r = mda.lib.distances.transform_StoR(s, box) - - def test_capped_distance_noresults(): point1 = np.array([0.1, 0.1, 0.1], dtype=np.float32) point2 = np.array([0.95, 0.1, 0.1], dtype=np.float32) From e4c16b420df8825ccf734c056dafaa61e1a60550 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Mon, 18 Jun 2018 21:01:49 +0200 Subject: [PATCH 149/455] add a continuous chain reader option This option allows the chain reader to sort the given trajectories so that the time will always increase when iterating over a trajectory. This mimics gmx trjcat. --- package/MDAnalysis/coordinates/chain.py | 281 ++++++++++++++++++------ package/MDAnalysis/core/universe.py | 3 + 2 files changed, 215 insertions(+), 69 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index 612f3526b76..a23bc9a1614 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -56,6 +56,80 @@ from . import core +def multi_level_argsort(l): + """ + This sorts based on the start time. + + Parameters + ---------- + l : list + + Returns + ------- + indices + """ + return [el[0] for el in sorted(enumerate(l), key=lambda x: x[1][0])] + + +def filter_times(times, dt): + """Given a list of start and end times this function filters out any duplicate + time steps preferring the last tuple. + + ((0, 3), (0, 3)) -> (1, ) + ((0, 3), (0, 4)) -> (1, ) + ((0, 3), (3, 4)) -> (0, 1) + ((0, 3), (2, 5), (4, 9)) -> (1, 2, 3) + + + Parameters + ---------- + times : + sorted list of times + dt : + timestep between two frames + + Returns + ------- + indices of times to used with overlaps removed + + """ + # Special cases + if len(times) == 1: + return [0, ] + elif len(times) == 2: + if times[0][0] < times[1][0]: + return [0, 1] + elif np.allclose(times[0][0], times[1][0]): + return [1, ] + else: + return [0, ] + if np.unique(times).size == 2: + return [len(times) - 1, ] + + # more then 2 unique time entries + + # special case first times are equal + if not np.allclose(times[0][0], times[1][0]): + used_idx = [0, ] + offset = 1 + else: + used_idx = [1, ] + offset = 2 + + for i, (first, middle, last) in enumerate(zip(times[:-2], times[1:-1], times[2:])): + if not np.allclose(middle[1] - middle[0], dt): + if (middle[0] <= first[1]) and (last[0] <= middle[1]): + used_idx.append(i + offset) + elif (middle[0] <= first[1]): + used_idx.append(i + offset) + + # take care of first special case + if (times[-2][1] <= times[-1][1]): + used_idx.append(len(times) - (2-offset)) + + return used_idx + + class ChainReader(base.ProtoReader): """Reader that concatenates multiple trajectories on the fly. @@ -80,68 +154,69 @@ class ChainReader(base.ProtoReader): """ format = 'CHAIN' - def __init__(self, filenames, **kwargs): - """Set up the chain reader. + def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): + """Set up the chain reader. This can also be used similar to `gmx trjcat` to + treat several parts of a long simulation as a single trajectory. Parameters ---------- filenames : str or list or sequence - file name or list of file names; the reader will open all file names - and provide frames in the order of trajectories from the list. Each - trajectory must contain the same number of atoms in the same order - (i.e. they all must belong to the same topology). The trajectory - format is deduced from the extension of each file name. - - Extension: `filenames` are either a single file name or list of file - names in either plain file names format or ``(filename, format)`` - tuple combination. This allows explicit setting of the format for - each individual trajectory file. + file name or list of file names; the reader will open all file names + and provide frames in the order of trajectories from the list. Each + trajectory must contain the same number of atoms in the same order + (i.e. they all must belong to the same topology). The trajectory + format is deduced from the extension of each file name. + + Extension: `filenames` are either a single file name or list of file + names in either plain file names format or ``(filename, format)`` + tuple combination. This allows explicit setting of the format for + each individual trajectory file. skip : int (optional) - skip step (also passed on to the individual trajectory readers); - must be same for all trajectories + skip step (also passed on to the individual trajectory readers); + must be same for all trajectories dt : float (optional) - Passed to individual trajectory readers to enforce a common time - difference between frames, in MDAnalysis time units. If not set, each - reader's `dt` will be used (either inferred from the trajectory - files, or set to the reader's default) when reporting frame times; - note that this might lead an inconsistent time difference between - frames. + Passed to individual trajectory readers to enforce a common time + difference between frames, in MDAnalysis time units. If not set, each + reader's `dt` will be used (either inferred from the trajectory + files, or set to the reader's default) when reporting frame times; + note that this might lead an inconsistent time difference between + frames. + continuous : bool (optional) + treat all trajectories as one single long trajectory. Adds several + checks. Might not work with all trajectory formats! This should + ensure that there is no need to concatenate trajectories of GROMACS + simulations **kwargs : dict (optional) - all other keyword arguments are passed on to each trajectory reader - unchanged - - - .. versionchanged:: 0.8 - The ``delta`` keyword was added. - .. versionchanged:: 0.13 - The ``delta`` keyword was deprecated in favor of using ``dt``. + all other keyword arguments are passed on to each trajectory reader + unchanged """ super(ChainReader, self).__init__() - self.filenames = asiterable(filenames) + filenames = asiterable(filenames) + # Override here because single frame readers handle this argument as a + # kwarg to a timestep which behaves differently if dt is present or not. + if dt is not None: + kwargs['dt'] = dt self.readers = [core.reader(filename, **kwargs) - for filename in self.filenames] + for filename in filenames] + self.filenames = np.array([fn[0] if isinstance(fn, tuple) else fn for fn in filenames]) # pointer to "active" trajectory index into self.readers self.__active_reader_index = 0 - self.skip = kwargs.get('skip', 1) + self.skip = skip self.n_atoms = self._get_same('n_atoms') - #self.fixed = self._get_same('fixed') # Translation between virtual frames and frames in individual - # trajectories. - # Assumes that individual trajectories i contain frames that can - # be addressed with an index 0 <= f < n_frames[i] + # trajectories. Assumes that individual trajectories i contain frames + # that can be addressed with an index 0 <= f < n_frames[i] - # Build a map of frames: ordered list of starting virtual - # frames; the index i into this list corresponds to the index - # into self.readers + # Build a map of frames: ordered list of starting virtual frames; the + # index i into this list corresponds to the index into self.readers # # For virtual frame 0 <= k < sum(n_frames) find corresponding - # trajectory i and local frame f (i.e. readers[i][f] will - # correspond to ChainReader[k]). - + # trajectory i and local frame f (i.e. readers[i][f] will correspond to + # ChainReader[k]). # build map 'start_frames', which is used by _get_local_frame() n_frames = self._get('n_frames') # [0]: frames are 0-indexed internally @@ -155,8 +230,81 @@ def __init__(self, filenames, **kwargs): #: source for trajectories frame (fakes trajectory) self.__chained_trajectories_iter = None + # calculate new start_frames to have a time continuous trajectory. + if continuous: + filetypes = np.unique([r.format for r in self.readers]) + if not len(filetypes) == 1: + raise RuntimeError("Continuous only supported with all files " + "are from the same format. found {}".format(filetypes)) + if np.any(np.array(n_frames) == 1): + raise RuntimeError("Need at least two frames in every trajectory") + if filetypes[0] not in ['XTC', 'TRR']: + raise RuntimeError("continuous only supported for xtc and trr format") + + # TODO: allow floating point precision in dt check + dt = self._get_same('dt') + n_frames = np.asarray(self._get('n_frames')) + self.dts = np.ones(self.dts.shape) * dt + + # the sorting needs to happen on two levels. The first major level + # is by start times and the second is by end times. + # The second level of sorting is needed for cases like: + # [0 1 2 3 4 5 6 7 8 9] [0 1 2 4] + # to + # [0 1 2 4] [0 1 2 3 4 5 6 7 8 9] + # after that sort the chain reader will work + times = [] + for r in self.readers: + r[0] + start = r.ts.time + r[-1] + end = r.ts.time + times.append((start, end)) + # sort step + sort_idx = multi_level_argsort(times) + self.readers = [self.readers[i] for i in sort_idx] + self.filenames = self.filenames[sort_idx] + self.total_times = self.dts * n_frames[sort_idx] + + # filter step: remove indices if we have complete overlap + if len(self.readers) > 1: + used_idx = filter_times(np.array(times)[sort_idx], dt) + + self.readers = [self.readers[i] for i in used_idx] + self.filenames = self.filenames[used_idx] + self.total_times = self.dts[used_idx] * n_frames[used_idx] + + # rebuild lookup table + sf = [0, ] + n_frames = 0 + for r1, r2 in zip(self.readers[:-1], self.readers[1:]): + r2[0], r1[0] + start_time = r2.time + + # trajectory doesn't contain valid frames + if r1.time >= start_time: + # this ensure bisect works correctly + sf.append(sf[-1]) + continue + + if start_time > n_frames * dt: + warnings.warn("Missing frame in continuous chain", UserWarning) + # find end where trajectory was restarted from + for ts in r1[::-1]: + if ts.time < start_time: + break + sf.append(sf[-1] + ts.frame + 1) + n_frames += ts.frame + 1 + + n_frames += self.readers[-1].n_frames + + self.__start_frames = sf + self.n_frames = n_frames + self._sf = sf + # make sure that iteration always yields frame 0 # rewind() also sets self.ts + self.start_frames = self.__start_frames self.ts = None self.rewind() @@ -174,8 +322,11 @@ def _get_local_frame(self, k): Returns ------- - (i, f) : tuple - **local frame** tuple + i : int + trajectory + f : int + frame in trajectory i + Raises ------ @@ -299,8 +450,8 @@ def _get_same(self, attr): """ values = np.array(self._get(attr)) value = values[0] - if not np.all(values == value): - bad_traj = np.array([self._get_filename(fn) for fn in self.filenames])[values != value] + if not np.allclose(values, value): + bad_traj = np.array(self.filenames)[values != value] raise ValueError("The following trajectories do not have the correct {0} " " ({1}):\n{2}".format(attr, value, bad_traj)) return value @@ -347,14 +498,12 @@ def _read_frame(self, frame): def _chained_iterator(self): """Iterator that presents itself as a chained trajectory.""" self._rewind() # must rewind all readers - readers = itertools.chain(*self.readers) - for frame, ts in enumerate(readers): - ts.frame = frame # fake continuous frames, 0-based - self.ts = ts - # make sure that the active reader is in sync - i, f = self._get_local_frame(frame) # uses 0-based frames! - self.__activate_reader(i) - yield ts + for i in range(self.n_frames): + j, f = self._get_local_frame(i) + self.__activate_reader(j) + self.ts = self.active_reader[f] + self.ts.frame = i + yield self.ts def _read_next_timestep(self, ts=None): self.ts = next(self.__chained_trajectories_iter) @@ -383,43 +532,37 @@ def __iter__(self): for ts in self.__chained_trajectories_iter: yield ts - @staticmethod - def _get_filename(filename): - """retrieve the actual filename of the list element""" - return filename[0] if isinstance(filename, tuple) else filename - def __repr__(self): return ("<{clsname} {fname} with {nframes} frames of {natoms} atoms>" "".format( clsname=self.__class__.__name__, - fname=[os.path.basename(self._get_filename(fn)) - for fn in self.filenames], + fname=[os.path.basename(fn) for fn in self.filenames], nframes=self.n_frames, natoms=self.n_atoms)) def add_transformations(self, *transformations): """ Add all transformations to be applied to the trajectory. - + This function take as list of transformations as an argument. These transformations are functions that will be called by the Reader and given a :class:`Timestep` object as argument, which will be transformed and returned to the Reader. - The transformations can be part of the :mod:`~MDAnalysis.transformations` - module, or created by the user, and are stored as a list `transformations`. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. This list can only be modified once, and further calls of this function will raise an exception. - + .. code-block:: python - + u = MDAnalysis.Universe(topology, coordinates) workflow = [some_transform, another_transform, this_transform] u.trajectory.add_transformations(*workflow) - + Parameters ---------- transform_list : list list of all the transformations that will be applied to the coordinates - + See Also -------- :mod:`MDAnalysis.transformations` @@ -428,7 +571,7 @@ def add_transformations(self, *transformations): #to avoid unintended behaviour where the coordinates of each frame are transformed #multiple times when iterating over the trajectory. #In this method, the trajectory is modified all at once and once only. - + super(ChainReader, self).add_transformations(*transformations) for r in self.readers: r.add_transformations(*transformations) @@ -437,5 +580,5 @@ def _apply_transformations(self, ts): """ Applies the transformations to the timestep.""" # Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` # to avoid applying the same transformations multiple times on each frame - + return ts diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index f31bbd01d11..34dc487ba4d 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -222,6 +222,9 @@ class Universe(object): representations, which allow for manipulation of coordinates. in_memory_step Only read every nth frame into in-memory representation. + continuous : bool, optional + treat as time continues when using several trajectories with time + information Attributes ---------- From 3ae1d8f52362ca2dc4201c5478e6a517997de675 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Mon, 18 Jun 2018 21:03:02 +0200 Subject: [PATCH 150/455] add tests for continuous chain reader Uses the build_trajectory tool from @jbarnoud --- .../coordinates/test_chainreader.py | 152 ++++++++++++++---- 1 file changed, 122 insertions(+), 30 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 39d4da9457b..52b0e23f12c 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -20,14 +20,14 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # from __future__ import division, absolute_import - from six.moves import zip import numpy as np +import os import pytest -from numpy.testing import (assert_equal, assert_almost_equal, assert_array_almost_equal) +from numpy.testing import (assert_equal, assert_almost_equal, assert_array_almost_equal, assert_array_equal) import MDAnalysis as mda from MDAnalysis.transformations import translate @@ -42,7 +42,7 @@ class TestChainReader(object): def universe(self): return mda.Universe(PSF, [DCD, CRD, DCD, CRD, DCD, CRD, CRD]) - + @pytest.fixture() def transformed(ref): return mda.Universe(PSF, @@ -65,14 +65,15 @@ def test_n_frames(self, universe): def test_iteration(self, universe): for ts in universe.trajectory: pass # just forward to last frame - assert_equal( - universe.trajectory.n_frames - 1, ts.frame, - "iteration yielded wrong number of frames ({0:d}), " - "should be {1:d}".format(ts.frame, universe.trajectory.n_frames)) + assert_equal(universe.trajectory.n_frames - 1, ts.frame, + "iteration yielded wrong number of frames ({0:d}), " + "should be {1:d}".format(ts.frame, + universe.trajectory.n_frames)) def test_jump_lastframe_trajectory(self, universe): universe.trajectory[-1] - assert_equal(universe.trajectory.ts.frame + 1, universe.trajectory.n_frames, + assert_equal(universe.trajectory.ts.frame + 1, + universe.trajectory.n_frames, "indexing last frame with trajectory[-1]") def test_slice_trajectory(self, universe): @@ -94,16 +95,13 @@ def test_frame(self, universe): # forward to frame where we repeat original dcd again: # dcd:0..97 crd:98 dcd:99..196 universe.trajectory[99] - assert_equal( - universe.atoms.positions, coord0, - "coordinates at frame 1 and 100 should be the same!") + assert_equal(universe.atoms.positions, coord0, + "coordinates at frame 1 and 100 should be the same!") def test_time(self, universe): universe.trajectory[30] # index and frames 0-based - assert_almost_equal(universe.trajectory.time, - 30.0, - 5, - err_msg="Wrong time of frame") + assert_almost_equal( + universe.trajectory.time, 30.0, 5, err_msg="Wrong time of frame") def test_write_dcd(self, universe, tmpdir): """test that ChainReader written dcd (containing crds) is correct @@ -114,8 +112,7 @@ def test_write_dcd(self, universe, tmpdir): W.write(universe) universe.trajectory.rewind() u = mda.Universe(PSF, outfile) - for (ts_orig, ts_new) in zip(universe.trajectory, - u.trajectory): + for (ts_orig, ts_new) in zip(universe.trajectory, u.trajectory): assert_almost_equal( ts_orig._pos, ts_new._pos, @@ -169,34 +166,129 @@ class TestChainReaderCommonDt(object): @pytest.fixture() def trajectory(self): - universe = mda.Universe(PSF, - [DCD, CRD, DCD, CRD, DCD, CRD, CRD], - dt=self.common_dt) + universe = mda.Universe( + PSF, [DCD, CRD, DCD, CRD, DCD, CRD, CRD], dt=self.common_dt) return universe.trajectory def test_time(self, trajectory): # We test this for the beginning, middle and end of the trajectory. for frame_n in (0, trajectory.n_frames // 2, -1): trajectory[frame_n] - assert_almost_equal(trajectory.time, - trajectory.frame * self.common_dt, - 5, - err_msg="Wrong time for frame {0:d}".format( - frame_n)) + assert_almost_equal( + trajectory.time, + trajectory.frame * self.common_dt, + 5, + err_msg="Wrong time for frame {0:d}".format(frame_n)) class TestChainReaderFormats(object): """Test of ChainReader with explicit formats (Issue 76).""" def test_set_all_format_tuples(self): - universe = mda.Universe(GRO, [(PDB, 'pdb'), (XTC, 'xtc'), - (TRR, 'trr')]) - assert_equal(universe.trajectory.n_frames, 21) + universe = mda.Universe(GRO, [(PDB, 'pdb'), (XTC, 'xtc'), (TRR, + 'trr')]) + assert universe.trajectory.n_frames == 21 + assert_equal(universe.trajectory.filenames, [PDB, XTC, TRR]) def test_set_one_format_tuple(self): universe = mda.Universe(PSF, [(PDB_small, 'pdb'), DCD]) - assert_equal(universe.trajectory.n_frames, 99) + assert universe.trajectory.n_frames == 99 def test_set_all_formats(self): universe = mda.Universe(PSF, [PDB_small, PDB_closed], format='pdb') - assert_equal(universe.trajectory.n_frames, 2) + assert universe.trajectory.n_frames == 2 + + +def build_trajectories(folder, sequences, fmt='xtc'): + """ + A scenario is given as a series of time sequences. The result is + returned as a list of time and origin of the frame. Each element of that + result list correspond to a frame of the conatenated trajectory, The + first element of each tuple is the time it corresponds to, the second + element is the index of the input the frame comes from. + """ + template = 'trjcat_test_{{}}.{}'.format(fmt) + template = os.path.join(folder, template) + + # Use an empty universe to have a topology + utop = mda.Universe.empty(1, trajectory=True) + + # Create synthetic trajectories. The times come from the user input, + # the coordinates indicate the index of the input. + fnames = [] + for index, subseq in enumerate(sequences): + coords = np.zeros((len(subseq), 1, 3), dtype=np.float32) + index + u = mda.Universe(utop._topology, coords) + out_traj = mda.Writer(template.format(index), n_atoms=len(u.atoms)) + fnames.append(out_traj.filename) + with out_traj: + for ts, time in zip(u.trajectory, subseq): + # The time step needs a box to avoid a warning + ts.dimensions = [10, 10, 10, 90, 90, 90] + # The time is set from the user input + ts.time = time + out_traj.write(ts) + return utop, fnames + + +class TestChainReaderContinuous(object): + @pytest.mark.parametrize('fmt', ('xtc', 'trr')) + @pytest.mark.parametrize('sequences, n_frames', + [ + [([0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7]), 8], + [([0, 1, 2, 4], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 10], + [([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3]), 4], + [([5, 6, 7, 8, 9], [2, 3, 4, 5, 6], [0, 1, 2, 3]), 10], + [([0, 1, 2],) * 3, 3], + [([0, 1, 2, 3,], [3, 4], [4, 5, 6, 7]), 8], + [([5, 6, 7, 8, 9], [2, 3, 4, 5, 6], [0, 1, 2, 3]), 10] + ]) + def test_order(self, sequences, n_frames, tmpdir, fmt): + folder = str(tmpdir) + utop, fnames = build_trajectories(folder, sequences=sequences, fmt=fmt) + u = mda.Universe(utop._topology, fnames, continuous=True) + assert u.trajectory.n_frames == n_frames + for i, ts in enumerate(u.trajectory): + assert_almost_equal(i, ts.time, decimal=4) + + def test_missing(self, tmpdir): + folder = str(tmpdir) + sequences = ([0, 1, 2, 3], [5, 6, 7, 8, 9]) + utop, fnames = build_trajectories(folder, sequences=sequences,) + u = mda.Universe(utop._topology, fnames, continuous=True) + assert u.trajectory.n_frames == 9 + + def test_single_frames(self, tmpdir): + folder = str(tmpdir) + sequences = ([0, 1, 2, 3], [5, ]) + utop, fnames = build_trajectories(folder, sequences=sequences,) + with pytest.raises(RuntimeError): + mda.Universe(utop._topology, fnames, continuous=True) + + def test_mixed_filetypes(self): + with pytest.raises(RuntimeError): + mda.Universe(PDB, [XTC, TRR], continuous=True) + + def test_unsupported_filetypes(self): + with pytest.raises(RuntimeError): + mda.Universe(PDB, [XTC, GRO], continuous=True) + +@pytest.mark.parametrize('l, ref', ([((0, 3), (3, 3), (4, 7)), (0, 1, 2)], + [((0, 9), (0, 4)), (0, 1)], + [((0, 3), (2, 2), (3, 3), (2, 6), (5, 9)), (0, 1, 3, 2, 4)], + [((0, 2), (4, 9), (0, 4), (7, 9)), (0, 2, 1, 3)])) +def test_multilevel_arg_sort(l, ref): + indices = mda.coordinates.chain.multi_level_argsort(l) + assert_array_equal(indices, ref) + +@pytest.mark.parametrize('l, ref', ([((0, 4), (3, 6), (6, 9)), (0, 1, 2)], + [((0, 3), (3, 4), (4, 7)), (0, 1, 2)], + [((0, 3), (3, 5), (4, 7)), (0, 1, 2)], + [((0, 3), (0, 4)), (1,)], + [((0, 3), (0, 3)), (1,)], + [((1, 3), (0, 4)), (0,)], + [((0, 3), ), (0, )], + [((0, 3), (5, 9)), (0, 1)])) +def test_filter_times(l, ref): + indices = mda.coordinates.chain.filter_times(l, dt=1) + assert_array_equal(indices, ref) From fcf0f23280ec833998bf8a44eebaf51becb91841 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Mon, 18 Jun 2018 21:04:43 +0200 Subject: [PATCH 151/455] update CHANGELOG --- package/CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package/CHANGELOG b/package/CHANGELOG index b104e006aad..46ee6d9f8db 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -39,6 +39,8 @@ Enhancements (Issue #1262 #1938) * Added pbc kwarg to Bond/Angle/Dihedral/Improper object value method, default True. (Issue #1938) + * ChainReader can correctly handle continuous trajectories split into multiple files, + generated with gromacs -noappend (PR #1728) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) From 98427d19b430c8d8067514edae14bf6f6d486584 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Mon, 18 Jun 2018 21:07:43 +0200 Subject: [PATCH 152/455] add documentation --- package/MDAnalysis/coordinates/chain.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index a23bc9a1614..12ce6a6035d 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -137,6 +137,18 @@ class ChainReader(base.ProtoReader): represent multiple trajectories as one virtual trajectory. Users typically do not need to use the :class:`ChainReader` explicitly. + Chainreader can also handle a continuous trajectory split over several + files. To use this passe the 'continuous == True' keyword argument. An + example take the following trajectory that is split into three parts. The + colum represents the time and the trajectory segments overlap. With the + continuous chainreader only the frames marked with a + will be read. + + part01: ++++-- + part02: ++++++- + part03: ++++++++ + + The default chainreader will read all frames. + Notes ----- The trajectory API attributes exist but most of them only reflect the first From e6ff4abacc455d3bd5390fa056a94746769c5556 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 19 Jun 2018 10:43:31 +0200 Subject: [PATCH 153/455] update docs and Error messages --- package/MDAnalysis/coordinates/chain.py | 49 ++++++++++++------- .../coordinates/test_chainreader.py | 8 ++- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index 12ce6a6035d..e608022812a 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -57,8 +57,9 @@ def multi_level_argsort(l): - """ - This sorts based on the start time. + """Return indices to sort a multi value tuple. Sorting is done on the first + value of the tuple. + Parameters ---------- @@ -67,6 +68,12 @@ def multi_level_argsort(l): Returns ------- indices + + Example + ------- + >>> multi_level_argsort(((0, 2), (4, 9), (0, 4), (7, 9))) + [0, 2, 1, 3] + """ return [el[0] for el in sorted(enumerate(l), key=lambda x: x[1][0])] @@ -75,22 +82,28 @@ def filter_times(times, dt): """Given a list of start and end times this function filters out any duplicate time steps preferring the last tuple. - ((0, 3), (0, 3)) -> (1, ) - ((0, 3), (0, 4)) -> (1, ) - ((0, 3), (3, 4)) -> (0, 1) - ((0, 3), (2, 5), (4, 9)) -> (1, 2, 3) - - Parameters ---------- - times : + times : list sorted list of times - dt : + dt : float timestep between two frames Returns ------- - indices of times to used with overlaps removed + list: + indices of times to be used with overlaps removed + + Example + ------- + >>> filter_times(((0, 3), (0, 3))) + [1, ] + >>> filter_times(((0, 3), (0, 4))) + [1, ] + >>> filter_times(((0, 3), (3, 4))) + [0, 1] + >>> filter_times(((0, 3), (2, 5), (4, 9))) + [1, 2, 3] """ # Special cases @@ -147,7 +160,8 @@ class ChainReader(base.ProtoReader): part02: ++++++- part03: ++++++++ - The default chainreader will read all frames. + The default chainreader will read all frames. The continuous option is + currently only supported for XTC and TRR files. Notes ----- @@ -162,13 +176,14 @@ class ChainReader(base.ProtoReader): .. versionchanged:: 0.13.0 :attr:`time` now reports the time summed over each trajectory's frames and individual :attr:`dt`. + .. versionchanged:: 0.19.0 + added continuous trajectory option """ format = 'CHAIN' def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): - """Set up the chain reader. This can also be used similar to `gmx trjcat` to - treat several parts of a long simulation as a single trajectory. + """Set up the chain reader. Parameters ---------- @@ -246,12 +261,12 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): if continuous: filetypes = np.unique([r.format for r in self.readers]) if not len(filetypes) == 1: - raise RuntimeError("Continuous only supported with all files " - "are from the same format. found {}".format(filetypes)) + raise ValueError("Continuous only supported when all files " + "are using the same format. found {}".format(filetypes)) if np.any(np.array(n_frames) == 1): raise RuntimeError("Need at least two frames in every trajectory") if filetypes[0] not in ['XTC', 'TRR']: - raise RuntimeError("continuous only supported for xtc and trr format") + raise NotImplementedError("continuous only supported for xtc and trr format") # TODO: allow floating point precision in dt check dt = self._get_same('dt') diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 52b0e23f12c..94e1389161e 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -206,6 +206,10 @@ def build_trajectories(folder, sequences, fmt='xtc'): result list correspond to a frame of the conatenated trajectory, The first element of each tuple is the time it corresponds to, the second element is the index of the input the frame comes from. + + See original gist and PR 1728 for comparison with gromacs trjcat. + + https://gist.github.com/jbarnoud/cacd0957d3df01d1577f640b20e86039 """ template = 'trjcat_test_{{}}.{}'.format(fmt) template = os.path.join(folder, template) @@ -266,11 +270,11 @@ def test_single_frames(self, tmpdir): mda.Universe(utop._topology, fnames, continuous=True) def test_mixed_filetypes(self): - with pytest.raises(RuntimeError): + with pytest.raises(ValueError): mda.Universe(PDB, [XTC, TRR], continuous=True) def test_unsupported_filetypes(self): - with pytest.raises(RuntimeError): + with pytest.raises(NotImplementedError): mda.Universe(PDB, [XTC, GRO], continuous=True) @pytest.mark.parametrize('l, ref', ([((0, 3), (3, 3), (4, 7)), (0, 1, 2)], From f4d405d091ef80b0132e366b0a7d0d9da4e07899 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 19 Jun 2018 11:05:29 +0200 Subject: [PATCH 154/455] add untested case and fix errors --- package/MDAnalysis/coordinates/chain.py | 4 ++-- testsuite/MDAnalysisTests/coordinates/test_chainreader.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index e608022812a..c480d5695b2 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -137,8 +137,8 @@ def filter_times(times, dt): used_idx.append(i + offset) # take care of first special case - if (times[-2][1] <= times[-1][1]): - used_idx.append(len(times) - (2-offset)) + if offset == 1 and (times[-2][1] <= times[-1][1]): + used_idx.append(len(times) - 1) return used_idx diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 94e1389161e..afc7333d68c 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -275,7 +275,7 @@ def test_mixed_filetypes(self): def test_unsupported_filetypes(self): with pytest.raises(NotImplementedError): - mda.Universe(PDB, [XTC, GRO], continuous=True) + mda.Universe(PSF, [DCD, DCD], continuous=True) @pytest.mark.parametrize('l, ref', ([((0, 3), (3, 3), (4, 7)), (0, 1, 2)], [((0, 9), (0, 4)), (0, 1)], @@ -288,6 +288,7 @@ def test_multilevel_arg_sort(l, ref): @pytest.mark.parametrize('l, ref', ([((0, 4), (3, 6), (6, 9)), (0, 1, 2)], [((0, 3), (3, 4), (4, 7)), (0, 1, 2)], [((0, 3), (3, 5), (4, 7)), (0, 1, 2)], + [((0, 3), (0, 4), (3, 5), (4, 7)), (1, 2, 3)], [((0, 3), (0, 4)), (1,)], [((0, 3), (0, 3)), (1,)], [((1, 3), (0, 4)), (0,)], From f38c75d87539fa1235d39a127211626aee8367b6 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Tue, 19 Jun 2018 11:07:55 +0200 Subject: [PATCH 155/455] remove impossible case --- package/MDAnalysis/coordinates/chain.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index c480d5695b2..c91c89d5d99 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -308,12 +308,6 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): r2[0], r1[0] start_time = r2.time - # trajectory doesn't contain valid frames - if r1.time >= start_time: - # this ensure bisect works correctly - sf.append(sf[-1]) - continue - if start_time > n_frames * dt: warnings.warn("Missing frame in continuous chain", UserWarning) # find end where trajectory was restarted from From a6880ec468a985f959e4443015ac971d1c0e49f4 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 30 Jun 2018 13:18:28 +0200 Subject: [PATCH 156/455] add no_warning context --- testsuite/MDAnalysisTests/util.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/testsuite/MDAnalysisTests/util.py b/testsuite/MDAnalysisTests/util.py index 136103b64f8..0c87d0cb684 100644 --- a/testsuite/MDAnalysisTests/util.py +++ b/testsuite/MDAnalysisTests/util.py @@ -40,6 +40,7 @@ import mock import os import warnings +import pytest from numpy.testing import assert_warns @@ -169,6 +170,17 @@ def assert_nowarns(warning_class, *args, **kwargs): raise AssertionError("function {0} raises warning of class {1}".format( func.__name__, warning_class.__name__)) + +@contextmanager +def no_warning(warning_class): + """contextmanager to check that no warning was raised""" + with pytest.warns(warning_class) as record: + yield + if len(record) != 0: + raise AssertionError("Raised warning of class {}".format( + warning_class.__name__)) + + class _NoDeprecatedCallContext(object): # modified version of similar pytest class object that checks for # raised DeprecationWarning From 940f287a7486d4230df2f4c1ace81cd94af0cb0a Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 30 Jun 2018 13:44:27 +0200 Subject: [PATCH 157/455] update start_frames to be introspected in a test --- package/MDAnalysis/coordinates/chain.py | 12 +++++++----- testsuite/MDAnalysisTests/util.py | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index c91c89d5d99..7866e089c19 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -248,7 +248,7 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): n_frames = self._get('n_frames') # [0]: frames are 0-indexed internally # (see Timestep.check_slice_indices()) - self.__start_frames = np.cumsum([0] + n_frames) + self._start_frames = np.cumsum([0] + n_frames) self.n_frames = np.sum(n_frames) self.dts = np.array(self._get('dt')) @@ -309,6 +309,9 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): start_time = r2.time if start_time > n_frames * dt: + print(start_time, n_frames * dt) + print(r1) + print(r2) warnings.warn("Missing frame in continuous chain", UserWarning) # find end where trajectory was restarted from for ts in r1[::-1]: @@ -319,13 +322,12 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): n_frames += self.readers[-1].n_frames - self.__start_frames = sf + self._start_frames = sf self.n_frames = n_frames self._sf = sf # make sure that iteration always yields frame 0 # rewind() also sets self.ts - self.start_frames = self.__start_frames self.ts = None self.rewind() @@ -363,11 +365,11 @@ def _get_local_frame(self, k): if k < 0: raise IndexError("Virtual (chained) frames must be >= 0") # trajectory index i - i = bisect.bisect_right(self.__start_frames, k) - 1 + i = bisect.bisect_right(self._start_frames, k) - 1 if i < 0: raise IndexError("Cannot find trajectory for virtual frame {0:d}".format(k)) # local frame index f in trajectory i (frame indices are 0-based) - f = k - self.__start_frames[i] + f = k - self._start_frames[i] return i, f # methods that can change with the current reader diff --git a/testsuite/MDAnalysisTests/util.py b/testsuite/MDAnalysisTests/util.py index 0c87d0cb684..db30a962a31 100644 --- a/testsuite/MDAnalysisTests/util.py +++ b/testsuite/MDAnalysisTests/util.py @@ -174,7 +174,8 @@ def assert_nowarns(warning_class, *args, **kwargs): @contextmanager def no_warning(warning_class): """contextmanager to check that no warning was raised""" - with pytest.warns(warning_class) as record: + with warnings.catch_warnings(record=True) as record: + warnings.simplefilter('always') yield if len(record) != 0: raise AssertionError("Raised warning of class {}".format( From 5130a6141dcb316e48855a99674b3cb84c716b7f Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 30 Jun 2018 14:02:12 +0200 Subject: [PATCH 158/455] add test for warning --- .../coordinates/test_chainreader.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index afc7333d68c..120177c6f3b 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -33,6 +33,7 @@ from MDAnalysis.transformations import translate from MDAnalysisTests.datafiles import (PDB, PSF, CRD, DCD, GRO, XTC, TRR, PDB_small, PDB_closed) +from MDAnalysisTests.util import no_warning class TestChainReader(object): @@ -255,6 +256,13 @@ def test_order(self, sequences, n_frames, tmpdir, fmt): for i, ts in enumerate(u.trajectory): assert_almost_equal(i, ts.time, decimal=4) + def test_start_frames(self, tmpdir): + folder = str(tmpdir) + sequences = ([0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7]) + utop, fnames = build_trajectories(folder, sequences=sequences,) + u = mda.Universe(utop._topology, fnames, continuous=True) + assert_equal(u.trajectory._start_frames, [0, 2, 4]) + def test_missing(self, tmpdir): folder = str(tmpdir) sequences = ([0, 1, 2, 3], [5, 6, 7, 8, 9]) @@ -262,6 +270,22 @@ def test_missing(self, tmpdir): u = mda.Universe(utop._topology, fnames, continuous=True) assert u.trajectory.n_frames == 9 + def test_warning(self, tmpdir): + folder = str(tmpdir) + # this sequence *should* trigger a warning + sequences = ([0, 1, 2, 3], [5, 6, 7]) + utop, fnames = build_trajectories(folder, sequences=sequences,) + with pytest.warns(UserWarning): + mda.Universe(utop._topology, fnames, continuous=True) + + def test_easy_trigger_warning(self, tmpdir): + folder = str(tmpdir) + # this sequence shouldn't trigger a warning + sequences = ([0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7]) + utop, fnames = build_trajectories(folder, sequences=sequences,) + with no_warning(UserWarning): + mda.Universe(utop._topology, fnames, continuous=True) + def test_single_frames(self, tmpdir): folder = str(tmpdir) sequences = ([0, 1, 2, 3], [5, ]) From 1114acb2d3a87ab4d238590162193e5543378af7 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 30 Jun 2018 14:02:18 +0200 Subject: [PATCH 159/455] fix warning trigger the trigger doesn't have false positives now --- package/MDAnalysis/coordinates/chain.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index 7866e089c19..123dd264c66 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -307,9 +307,9 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): for r1, r2 in zip(self.readers[:-1], self.readers[1:]): r2[0], r1[0] start_time = r2.time - - if start_time > n_frames * dt: - print(start_time, n_frames * dt) + r1[-1] + if r1.time < start_time: + print(r1.time, start_time) print(r1) print(r2) warnings.warn("Missing frame in continuous chain", UserWarning) From cad0ba2b42103734c6f3f3ca8e931332b9663641 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 30 Jun 2018 18:55:02 +0200 Subject: [PATCH 160/455] update docs --- package/MDAnalysis/coordinates/chain.py | 7 ++++--- package/MDAnalysis/core/universe.py | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index 123dd264c66..ba8c4bdc40b 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -210,9 +210,10 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): frames. continuous : bool (optional) treat all trajectories as one single long trajectory. Adds several - checks. Might not work with all trajectory formats! This should - ensure that there is no need to concatenate trajectories of GROMACS - simulations + checks; all trajectories have the same dt, they contain at least 2 + frames, and they are all of the same file-type. Not implemented for + all trajectory formats! This can be used to analyze GROMACS + simulations without concatenating them prior to analysis. **kwargs : dict (optional) all other keyword arguments are passed on to each trajectory reader unchanged diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index 34dc487ba4d..266206ce5de 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -223,8 +223,10 @@ class Universe(object): in_memory_step Only read every nth frame into in-memory representation. continuous : bool, optional - treat as time continues when using several trajectories with time - information + The `continuous` option is used by the + :mod:`ChainReader`, which contains the + functionality to treat independent trajectory files as a single virtual + trajectory. Attributes ---------- From 943df366136af1bbfdf05eec291240a985e66a0e Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sun, 1 Jul 2018 11:39:23 +0200 Subject: [PATCH 161/455] add failing unit test --- testsuite/MDAnalysisTests/coordinates/test_chainreader.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 120177c6f3b..5d528e5fddc 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -278,6 +278,14 @@ def test_warning(self, tmpdir): with pytest.warns(UserWarning): mda.Universe(utop._topology, fnames, continuous=True) + def test_interleaving_error(self, tmpdir): + folder = str(tmpdir) + # interleaving is not supported by chainreader + sequences = ([0, 2, 4, 6], [1, 3, 5, 7]) + utop, fnames = build_trajectories(folder, sequences=sequences,) + with pytest.raises(): + mda.Universe(utop._topology, fnames, continuous=True) + def test_easy_trigger_warning(self, tmpdir): folder = str(tmpdir) # this sequence shouldn't trigger a warning From 82ff0d6502993298856ee13177f787070e11771c Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sun, 1 Jul 2018 12:51:11 +0200 Subject: [PATCH 162/455] check for interleaving and throw error --- package/MDAnalysis/coordinates/chain.py | 10 +++++++--- .../MDAnalysisTests/coordinates/test_chainreader.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index ba8c4bdc40b..56a181ea934 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -307,13 +307,17 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): n_frames = 0 for r1, r2 in zip(self.readers[:-1], self.readers[1:]): r2[0], r1[0] + r1_start_time = r1.time start_time = r2.time r1[-1] if r1.time < start_time: - print(r1.time, start_time) - print(r1) - print(r2) warnings.warn("Missing frame in continuous chain", UserWarning) + + # check for interleaving + r1[1] + if r1_start_time < start_time < r1.time: + raise RuntimeError("Interleaving not supported.") + # find end where trajectory was restarted from for ts in r1[::-1]: if ts.time < start_time: diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 5d528e5fddc..0bf9ce859b8 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -283,7 +283,7 @@ def test_interleaving_error(self, tmpdir): # interleaving is not supported by chainreader sequences = ([0, 2, 4, 6], [1, 3, 5, 7]) utop, fnames = build_trajectories(folder, sequences=sequences,) - with pytest.raises(): + with pytest.raises(RuntimeError): mda.Universe(utop._topology, fnames, continuous=True) def test_easy_trigger_warning(self, tmpdir): From 875090f577422e5cb3bc5c1a1dd8ca7f02b7aed5 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sun, 1 Jul 2018 13:01:12 +0200 Subject: [PATCH 163/455] refactor test --- .../coordinates/test_chainreader.py | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 0bf9ce859b8..fbab061d744 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -237,24 +237,48 @@ def build_trajectories(folder, sequences, fmt='xtc'): class TestChainReaderContinuous(object): + class SequenceInfo(object): + def __init__(self, seq, n_frames, order): + self.seq = seq + self.n_frames = n_frames + self.order = order + @pytest.mark.parametrize('fmt', ('xtc', 'trr')) - @pytest.mark.parametrize('sequences, n_frames', - [ - [([0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7]), 8], - [([0, 1, 2, 4], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 10], - [([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3]), 4], - [([5, 6, 7, 8, 9], [2, 3, 4, 5, 6], [0, 1, 2, 3]), 10], - [([0, 1, 2],) * 3, 3], - [([0, 1, 2, 3,], [3, 4], [4, 5, 6, 7]), 8], - [([5, 6, 7, 8, 9], [2, 3, 4, 5, 6], [0, 1, 2, 3]), 10] - ]) - def test_order(self, sequences, n_frames, tmpdir, fmt): + @pytest.mark.parametrize('seq_info',[ + SequenceInfo(seq=([0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7]), + n_frames=8, + order=[0, 0, 1, 1, 2, 2, 2, 2]), + SequenceInfo(seq=([0, 1, 2, 4], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), + n_frames=10, + order=np.ones(10)), + SequenceInfo(seq=([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3]), + n_frames=4, + order=np.ones(4)), + SequenceInfo(seq=([5, 6, 7, 8, 9], [2, 3, 4, 5, 6], [0, 1, 2, 3]), + n_frames=10, + order=[2, 2, 1, 1, 1, 0, 0, 0, 0, 0]), + SequenceInfo(seq=([0, 1, 2],) * 3, + n_frames=3, + order=[2, 2, 2]), + SequenceInfo(seq=([0, 1, 2, 3,], [3, 4], [4, 5, 6, 7]), + n_frames=8, + order=[0, 0, 0, 1, 2, 2, 2, 2]), + SequenceInfo(seq=([5, 6, 7, 8, 9], [2, 3, 4, 5, 6], [0, 1, 2, 3]), + n_frames=10, + order=[2, 2, 1, 1, 1, 0, 0, 0, 0, 0]), + SequenceInfo(seq=[range(0, 6), range(2, 5), range(2, 5), range(2, 5), range(3, 8)], + n_frames=8, + order=[0, 0, 2, 4, 4, 4, 4, 4]), + ]) + def test_order(self, seq_info, tmpdir, fmt): folder = str(tmpdir) - utop, fnames = build_trajectories(folder, sequences=sequences, fmt=fmt) + utop, fnames = build_trajectories(folder, sequences=seq_info.seq, fmt=fmt) u = mda.Universe(utop._topology, fnames, continuous=True) - assert u.trajectory.n_frames == n_frames + assert u.trajectory.n_frames == seq_info.n_frames for i, ts in enumerate(u.trajectory): assert_almost_equal(i, ts.time, decimal=4) + # check we have used the right trajectory + assert seq_info.order[i] == int(ts.positions[0, 0]) def test_start_frames(self, tmpdir): folder = str(tmpdir) From 9cf39289c160cabbe6167b5980a97194d4e22fbb Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 14:37:52 +0100 Subject: [PATCH 164/455] Minor changes: -return the list rather than require the user to access the internal list -use tau_max variable name which is consistent with the equation, in contrast to dtmax --- package/MDAnalysis/analysis/waterdynamics.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index f2b22b41c80..7bfd46bd02e 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1208,13 +1208,12 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, t0, tf, dtmax): + def __init__(self, universe, selection, t0, tf, tau_max): self.universe = universe self.selection = selection self.t0 = t0 self.tf = tf - self.dtmax = dtmax - self.timeseries = [] + self.tau_max = tau_max def run(self): @@ -1224,15 +1223,15 @@ def run(self): # select all survivors to an array of sets selected = [] - for ts in self.universe.trajectory[self.t0:self.tf]: + for _ in self.universe.trajectory[self.t0:self.tf]: selected.append(set(self.universe.select_atoms(self.selection))) - if len(selected) < self.dtmax: + if len(selected) < self.tau_max: print("ERROR: Cannot select fewer frames than dtmax") return - - for tau in list(range(1, self.dtmax + 1)): + timeseries = [] + for tau in list(range(1, self.tau_max + 1)): deltaP = [] for t in range(len(selected) - tau): @@ -1247,5 +1246,6 @@ def run(self): deltaP.append(Ntau / Nt) # store mean survival probability for each tau - self.timeseries.append(np.mean(np.asarray(deltaP))) + timeseries.append(np.mean(np.asarray(deltaP))) + return timeseries From afb48ac0132064ed37aee7ffa9d7984d975aca97 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 17:05:32 +0100 Subject: [PATCH 165/455] Switch the nested loops. Looping only once over the entire trajectory and more times over tau. This will lead to faster code (local memory/cache optimisation). Additionally, opens the door for combining multiple taus together. --- package/MDAnalysis/analysis/waterdynamics.py | 29 ++++++++------------ 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 7bfd46bd02e..8567b159463 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1200,8 +1200,8 @@ class SurvivalProbability(object): frame where analysis begins tf : int frame where analysis ends - dtmax : int - Maximum dt size, `dtmax` < `tf` or it will crash. + tau_max : int + Maximum dt size, `tau_max` must be < `tf` .. versionadded:: 0.11.0 @@ -1215,10 +1215,9 @@ def __init__(self, universe, selection, t0, tf, tau_max): self.tf = tf self.tau_max = tau_max - def run(self): """ - Analyze trajectory and produce timeseries of the survival probability. + Computes and returns the survival probability timeseries """ # select all survivors to an array of sets @@ -1230,22 +1229,18 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - timeseries = [] - for tau in list(range(1, self.tau_max + 1)): - deltaP = [] - for t in range(len(selected) - tau): + timeseries = [[] for tau in list(range(1, self.tau_max + 1))] + for t in range(len(selected)): + for tau in list(range(1, self.tau_max + 1)): + if tau + t > len(selected) - 1: + break - Nt = float(len(selected[t])) + Nt = len(selected[t]) if Nt == 0: continue - Ntau = len(set.intersection(*selected[t:t+tau])) - - # store survival probability at each t - deltaP.append(Ntau / Nt) - - # store mean survival probability for each tau - timeseries.append(np.mean(np.asarray(deltaP))) - return timeseries + Ntau = len(set.intersection(*selected[t:t + tau])) + timeseries[tau - 1].append( Ntau / float(Nt) ) + return [np.mean(tau_timeseries) for tau_timeseries in timeseries] From d71ed58ae41e6965db5659ca3d4f1f24021481f2 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 17:12:04 +0100 Subject: [PATCH 166/455] No need to check t+tau for any tau if at t it is empty. --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 8567b159463..5bd7a401372 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1238,7 +1238,7 @@ def run(self): Nt = len(selected[t]) if Nt == 0: - continue + break Ntau = len(set.intersection(*selected[t:t + tau])) timeseries[tau - 1].append( Ntau / float(Nt) ) From b711cb2ab8bc8877f02a25ef5b368fd5f7c7f20f Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 17:38:31 +0100 Subject: [PATCH 167/455] If there is no atom at t, this does not need to be checked for each t+tau. Refactoring. --- package/MDAnalysis/analysis/waterdynamics.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 5bd7a401372..54f9ba50318 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1229,18 +1229,18 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - timeseries = [[] for tau in list(range(1, self.tau_max + 1))] + tau_timeseries = [[] for _ in list(range(1, self.tau_max + 1))] for t in range(len(selected)): - for tau in list(range(1, self.tau_max + 1)): - if tau + t > len(selected) - 1: - break + Nt = len(selected[t]) - Nt = len(selected[t]) + if Nt == 0: + continue - if Nt == 0: + for tau in list(range(1, self.tau_max + 1)): + if tau + t > len(selected) - 1: break Ntau = len(set.intersection(*selected[t:t + tau])) - timeseries[tau - 1].append( Ntau / float(Nt) ) - return [np.mean(tau_timeseries) for tau_timeseries in timeseries] + tau_timeseries[tau - 1].append( Ntau / float(Nt) ) + return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] From 8c9326629d7e18ee06c35b42a46acdbf32ef49fa Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sun, 1 Jul 2018 20:49:36 +0200 Subject: [PATCH 168/455] add more test cases --- .../coordinates/test_chainreader.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index fbab061d744..9b2312163a6 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -268,7 +268,7 @@ def __init__(self, seq, n_frames, order): order=[2, 2, 1, 1, 1, 0, 0, 0, 0, 0]), SequenceInfo(seq=[range(0, 6), range(2, 5), range(2, 5), range(2, 5), range(3, 8)], n_frames=8, - order=[0, 0, 2, 4, 4, 4, 4, 4]), + order=[0, 0, 3, 4, 4, 4, 4, 4]), ]) def test_order(self, seq_info, tmpdir, fmt): folder = str(tmpdir) @@ -333,14 +333,18 @@ def test_unsupported_filetypes(self): with pytest.raises(NotImplementedError): mda.Universe(PSF, [DCD, DCD], continuous=True) + @pytest.mark.parametrize('l, ref', ([((0, 3), (3, 3), (4, 7)), (0, 1, 2)], [((0, 9), (0, 4)), (0, 1)], [((0, 3), (2, 2), (3, 3), (2, 6), (5, 9)), (0, 1, 3, 2, 4)], - [((0, 2), (4, 9), (0, 4), (7, 9)), (0, 2, 1, 3)])) + [((0, 2), (4, 9), (0, 4), (7, 9)), (0, 2, 1, 3)], + [((0, 5), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 3, 4)] + )) def test_multilevel_arg_sort(l, ref): indices = mda.coordinates.chain.multi_level_argsort(l) assert_array_equal(indices, ref) + @pytest.mark.parametrize('l, ref', ([((0, 4), (3, 6), (6, 9)), (0, 1, 2)], [((0, 3), (3, 4), (4, 7)), (0, 1, 2)], [((0, 3), (3, 5), (4, 7)), (0, 1, 2)], @@ -349,7 +353,13 @@ def test_multilevel_arg_sort(l, ref): [((0, 3), (0, 3)), (1,)], [((1, 3), (0, 4)), (0,)], [((0, 3), ), (0, )], - [((0, 3), (5, 9)), (0, 1)])) + [((0, 3), (5, 9)), (0, 1)], + [((0, 3), (0, 3), (5, 9)), (1, 2)], + [((0, 3), (0, 3), (0, 3), (5, 9)), (2, 3)], + [((0, 5), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 4)], + [((0, 3), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 3, 4)], + [((0, 3), (2, 4), (4, 7), (4, 7), (4, 7), (6, 9)), (0, 1, 4, 5)], + )) def test_filter_times(l, ref): indices = mda.coordinates.chain.filter_times(l, dt=1) assert_array_equal(indices, ref) From 8eb1854840a5bdd43da877f7f7490daf8273a03a Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 19:58:49 +0100 Subject: [PATCH 169/455] Should the first data point be always 1? In that case first tau = 0. Or should the first data point reflect the first tau which is non-zero and therefore the first change is quantified? I believe it is the latter. This breaks the current tests which, for example, by asking for 4 datapoints, always get the first datapoint for tau=0 that is 1. --- package/MDAnalysis/analysis/waterdynamics.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 54f9ba50318..3f12412d2dd 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1236,11 +1236,14 @@ def run(self): if Nt == 0: continue + survivors = set(selected[t]) + for tau in list(range(1, self.tau_max + 1)): if tau + t > len(selected) - 1: break - Ntau = len(set.intersection(*selected[t:t + tau])) + survivors = survivors.intersection(set(selected[t + tau])) + Ntau = len(survivors) tau_timeseries[tau - 1].append( Ntau / float(Nt) ) return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] From aecda7622d89166a4de6309962b4dc9be858a4c6 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Mon, 2 Jul 2018 18:45:59 +0100 Subject: [PATCH 170/455] code cleanup; added parameters to tests --- .../MDAnalysis/transformations/translate.py | 25 ++++---- .../transformations/test_translate.py | 59 ++++++++++--------- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index f188f37ef16..ce4ea738dc7 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -25,7 +25,7 @@ ====================================================================== Translate the coordinates of a given trajectory by a given vector. -The vector can either be user defined, using the function `translate` +The vector can either be user defined, using the function :func:`translate` or defined by centering an AtomGroup in the unit cell using the function `center_in_box` @@ -56,13 +56,13 @@ def translate(vector): ------- :class:`~MDAnalysis.coordinates.base.Timestep` object - """ + """ + if len(vector)>2: + vector = np.float32(vector) + else: + raise ValueError("{} vector is too short".format(vector)) def wrapped(ts): - if len(vector)>2: - v = np.float32(vector) - ts.positions += v - else: - raise ValueError("{} vector is too short".format(vector)) + ts.positions += vector return ts @@ -72,8 +72,8 @@ def center_in_box(ag, center='geometry', point=None, pbc=False): """ Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` instance so that the center of geometry/mass of the given :class:`~MDAnalysis.core.groups.AtomGroup` - is centered on the unit cell. The unit cell dimensions are taken from the input Timestep object or - can be defined using the `box` argument. + is centered on the unit cell. The unit cell dimensions are taken from the input Timestep object. + If a point is given, the center of the atomgroup will be translated to this point instead. Example ------- @@ -93,7 +93,7 @@ def center_in_box(ag, center='geometry', point=None, pbc=False): point: array-like, optional overrides the unit cell center - the coordinates of the Timestep are translated so that the center of mass/geometry of the given AtomGroup is aligned to this position - instead. Defined as an array of size 3. Example: [1, 2, 3] + instead. Defined as an array of size 3. pbc: bool, optional If `True`, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry. Default is `False`, no changes @@ -127,7 +127,7 @@ def wrapped(ts): if point is None: boxcenter = np.sum(ts.triclinic_dimensions, axis=0) / 2 else: - boxcenter = np.float32(point) + boxcenter = point ag_center = center_method() @@ -137,5 +137,4 @@ def wrapped(ts): return ts return wrapped - - \ No newline at end of file + \ No newline at end of file diff --git a/testsuite/MDAnalysisTests/transformations/test_translate.py b/testsuite/MDAnalysisTests/transformations/test_translate.py index 8303ae624f0..79a5fdf555d 100644 --- a/testsuite/MDAnalysisTests/transformations/test_translate.py +++ b/testsuite/MDAnalysisTests/transformations/test_translate.py @@ -33,51 +33,59 @@ @pytest.fixture() def translate_universes(): # create the Universe objects for the tests + # this universe has no masses and some tests need it as such reference = make_Universe(trajectory=True) transformed = make_Universe(['masses'], trajectory=True) transformed.trajectory.ts.dimensions = np.array([372., 373., 374., 90, 90, 90]) return reference, transformed def test_translate_coords(translate_universes): - ref_u = translate_universes[0] - trans_u = translate_universes[1] + ref_u, trans_u = translate_universes ref = ref_u.trajectory.ts vector = np.float32([1, 2, 3]) ref.positions += vector trans = translate(vector)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) -def test_translate_vector(translate_universes): - # what happens if the vector argument is smaller than 3? +@pytest.mark.parametrize('vector', ( + [0, 1], + [0, 1, 2, 3, 4], + np.array([0, 1]), + np.array([0, 1, 2, 3, 4]), + np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), + np.array([[0], [1], [2]])) +) +def test_translate_vector(translate_universes, vector): + # what happens if the vector argument is of wrong size? ts = translate_universes[0].trajectory.ts - vector = [0, 1] - with pytest.raises(ValueError): - translate(vector)(ts) - # what happens if the vector argument is bigger than 3? - vector = [0, 1, 2, 3] with pytest.raises(ValueError): translate(vector)(ts) def test_center_in_box_bad_ag(translate_universes): - # this universe as a box size zero + # this universe has a box size zero ts = translate_universes[0].trajectory.ts - ag = translate_universes[0].residues[0].atoms # what happens if something other than an AtomGroup is given? bad_ag = 1 with pytest.raises(ValueError): center_in_box(bad_ag)(ts) -def test_center_in_box_bad_point(translate_universes): - # this universe as a box size zero +@pytest.mark.parametrize('point', ( + [0, 1], + [0, 1, 2, 3, 4], + np.array([0, 1]), + np.array([0, 1, 2, 3, 4]), + np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), + np.array([[0], [1], [2]])) +) +def test_center_in_box_bad_point(translate_universes, point): ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms # what if the box is in the wrong format? - bad_point = [1] with pytest.raises(ValueError): - center_in_box(ag, point=bad_point)(ts) + center_in_box(ag, point=point)(ts) def test_center_in_box_bad_pbc(translate_universes): - # this universe as a box size zero + # this universe has a box size zero ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms # is pbc passed to the center methods? @@ -86,7 +94,7 @@ def test_center_in_box_bad_pbc(translate_universes): center_in_box(ag, pbc=True)(ts) def test_center_in_box_bad_center(translate_universes): - # this universe as a box size zero + # this universe has a box size zero ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms # what if a wrong center type name is passed? @@ -95,7 +103,7 @@ def test_center_in_box_bad_center(translate_universes): center_in_box(ag, center=bad_center)(ts) def test_center_in_box_no_masses(translate_universes): - # this universe as a box size zero + # this universe has no masses ts = translate_universes[0].trajectory.ts ag = translate_universes[0].residues[0].atoms # if the universe has no masses and `mass` is passed as the center arg @@ -105,8 +113,7 @@ def test_center_in_box_no_masses(translate_universes): def test_center_in_box_coords_no_options(translate_universes): # what happens when we center the coordinates arround the center of geometry of a residue? - ref_u = translate_universes[0] - trans_u = translate_universes[1] + ref_u, trans_u = translate_universes ref = ref_u.trajectory.ts ref_center = np.float32([6, 7, 8]) box_center = np.float32([186., 186.5, 187.]) @@ -118,9 +125,8 @@ def test_center_in_box_coords_no_options(translate_universes): def test_center_in_box_coords_with_pbc(translate_universes): # what happens when we center the coordinates arround the center of geometry of a residue? # using pbc into account for center of geometry calculation - ref_u = translate_universes[0] + ref_u, trans_u = translate_universes ref = ref_u.trajectory.ts - trans_u = translate_universes[1] trans_u.dimensions = [363., 364., 365., 90., 90., 90.] ag = trans_u.residues[24].atoms box_center = np.float32([181.5, 182., 182.5]) @@ -131,9 +137,8 @@ def test_center_in_box_coords_with_pbc(translate_universes): def test_center_in_box_coords_with_mass(translate_universes): # using masses for calculating the center of the atomgroup - ref_u = translate_universes[0] + ref_u, trans_u = translate_universes ref = ref_u.trajectory.ts - trans_u = translate_universes[1] ag = trans_u.residues[24].atoms box_center = np.float32([186., 186.5, 187.]) ref_center = ag.center_of_mass() @@ -143,9 +148,8 @@ def test_center_in_box_coords_with_mass(translate_universes): def test_center_in_box_coords_with_box(translate_universes): # using masses for calculating the center of the atomgroup - ref_u = translate_universes[0] + ref_u, trans_u = translate_universes ref = ref_u.trajectory.ts - trans_u = translate_universes[1] ag = trans_u.residues[0].atoms newpoint = [1000, 1000, 1000] box_center = np.float32(newpoint) @@ -157,9 +161,8 @@ def test_center_in_box_coords_with_box(translate_universes): def test_center_in_box_coords_all_options(translate_universes): # what happens when we center the coordinates arround the center of geometry of a residue? # using pbc into account for center of geometry calculation - ref_u = translate_universes[0] + ref_u, trans_u = translate_universes ref = ref_u.trajectory.ts - trans_u = translate_universes[1] ag = trans_u.residues[24].atoms newpoint = [1000, 1000, 1000] box_center = np.float32(newpoint) From 7cc6cbc17f9af3c48ce8726ced5e21d350974d92 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Mon, 2 Jul 2018 18:47:51 +0100 Subject: [PATCH 171/455] forgot :func: --- package/MDAnalysis/transformations/translate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index ce4ea738dc7..82283af27dc 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -27,7 +27,7 @@ Translate the coordinates of a given trajectory by a given vector. The vector can either be user defined, using the function :func:`translate` or defined by centering an AtomGroup in the unit cell using the function -`center_in_box` +:func:`center_in_box` """ from __future__ import absolute_import, division From 1d19fc26edca4af9d8c86f13a32531940b5e8482 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Mon, 2 Jul 2018 17:07:24 -0500 Subject: [PATCH 172/455] more GRO benchmarks --- benchmarks/benchmarks/GRO.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/benchmarks/benchmarks/GRO.py b/benchmarks/benchmarks/GRO.py index 9a2cdc37ae4..2c2b52266d4 100644 --- a/benchmarks/benchmarks/GRO.py +++ b/benchmarks/benchmarks/GRO.py @@ -2,12 +2,20 @@ import numpy as np from MDAnalysis.coordinates.GRO import GROReader +from MDAnalysis.topology.GROParser import GROParser from MDAnalysisTests.datafiles import GRO +import MDAnalysis as mda class GROReadBench(object): - def time_read_GRO_file(self): - """Benchmark reading of standard test - suite GRO file. - """ + def time_read_GRO_coordinates(self): + """Benchmark reading of standard testsuite GRO file.""" GROReader(GRO) + + def time_parse_GRO_file(self): + with GROParser(GRO) as p: + top = p.parse() + + def time_create_GRO_universe(self): + """Time to create MDA Universe of GRO""" + u = mda.Universe(GRO) From 42704d78cef5492f1a3524c85301cae86774affd Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 11:25:12 +0100 Subject: [PATCH 173/455] Using the set.intersection argument unpacking: easier to read, neater code and no performance drawbacks. Tests: the user should not be forced to rely on the internal data structures .timeseries. Returning the results with the function run(). --- package/MDAnalysis/analysis/waterdynamics.py | 5 +---- .../MDAnalysisTests/analysis/test_waterdynamics.py | 12 ++++++------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 3f12412d2dd..54f9ba50318 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1236,14 +1236,11 @@ def run(self): if Nt == 0: continue - survivors = set(selected[t]) - for tau in list(range(1, self.tau_max + 1)): if tau + t > len(selected) - 1: break - survivors = survivors.intersection(set(selected[t + tau])) - Ntau = len(survivors) + Ntau = len(set.intersection(*selected[t:t + tau])) tau_timeseries[tau - 1].append( Ntau / float(Nt) ) return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 3b4abbfe7a3..233bd225789 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -91,17 +91,17 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): def test_SurvivalProbability(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 0, 10, 4) - sp.run() - assert_almost_equal(sp.timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) + timeseries = sp.run() + assert_almost_equal(timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) def test_SurvivalProbability_t0Ignored(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 10, 4) - sp.run() - assert_almost_equal(sp.timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) + timeseries = sp.run() + assert_almost_equal(timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) - sp_zero.run() - assert np.isnan(sp_zero.timeseries[1]) + timeseries = sp_zero.run() + assert np.isnan(timeseries[1]) From 9370e8f81858e2a4b8d591a0d5c0b4ad0fa23c81 Mon Sep 17 00:00:00 2001 From: p-j-smith Date: Tue, 3 Jul 2018 14:01:58 +0100 Subject: [PATCH 174/455] Returning the survival probability and the values of tau as numpy arrays. Changed the name of tau_timeseries to sp_timeseries as it is a more accurate descriptor. Removed some of the +/- 1 in indices to improve readability. --- package/MDAnalysis/analysis/waterdynamics.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 54f9ba50318..0f05ab207cf 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -412,6 +412,8 @@ """ from __future__ import print_function, division, absolute_import + +from numpy.core.multiarray import ndarray from six.moves import range, zip_longest import numpy as np @@ -1229,18 +1231,21 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - tau_timeseries = [[] for _ in list(range(1, self.tau_max + 1))] + tau_timeseries = np.arange(1, tau_max + 1) + sp_timeseries = [[] for _ in range(self.tau_max)] + for t in range(len(selected)): Nt = len(selected[t]) if Nt == 0: continue - for tau in list(range(1, self.tau_max + 1)): - if tau + t > len(selected) - 1: + for tau in tau_timeseries: + if t + tau > len(selected): break Ntau = len(set.intersection(*selected[t:t + tau])) - tau_timeseries[tau - 1].append( Ntau / float(Nt) ) - return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] + sp_timeseries[tau - 1].append(Ntau / float(Nt) ) + + return np.asarray(np.mean(sp) for sp in sp_timeseries), tau_timeseries From 87b6d343c6f83babc7f18a50e120f8939a5bd282 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 14:37:03 +0100 Subject: [PATCH 175/455] Adjusting the tests because the return function gives back taus too. --- package/MDAnalysis/analysis/waterdynamics.py | 6 +++--- testsuite/MDAnalysisTests/analysis/test_waterdynamics.py | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 0f05ab207cf..1c45f8e0f40 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1231,7 +1231,7 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - tau_timeseries = np.arange(1, tau_max + 1) + tau_timeseries = np.arange(1, self.tau_max + 1) sp_timeseries = [[] for _ in range(self.tau_max)] for t in range(len(selected)): @@ -1244,8 +1244,8 @@ def run(self): if t + tau > len(selected): break - Ntau = len(set.intersection(*selected[t:t + tau])) + Ntau = len(set.intersection(*selected[t:t + tau + 1])) sp_timeseries[tau - 1].append(Ntau / float(Nt) ) - return np.asarray(np.mean(sp) for sp in sp_timeseries), tau_timeseries + return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 233bd225789..50ae28125a9 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -91,17 +91,18 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): def test_SurvivalProbability(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 0, 10, 4) - timeseries = sp.run() + taus, timeseries = sp.run() + print (timeseries) assert_almost_equal(timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) def test_SurvivalProbability_t0Ignored(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 10, 4) - timeseries = sp.run() + taus, timeseries = sp.run() assert_almost_equal(timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) - timeseries = sp_zero.run() + taus, timeseries = sp_zero.run() assert np.isnan(timeseries[1]) From 3655647f64bd3b4737baf9249bd257615b549726 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 16:36:32 +0100 Subject: [PATCH 176/455] Moving the checks to the constructor. Saving the extracted data for the user to be able to dig deeper, if necessary. --- package/MDAnalysis/analysis/waterdynamics.py | 26 +++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 1c45f8e0f40..7c6805cef7f 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1210,30 +1210,35 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, t0, tf, tau_max): + def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20): self.universe = universe self.selection = selection self.t0 = t0 - self.tf = tf + if tf == -1: + self.tf = len(universe.trajectory) + else: + self.tf = tf self.tau_max = tau_max + if tf - t0 <= self.tau_max: + raise ValueError("ERROR: Cannot select fewer frames than tau_max + 1") + + """ + FIXME - definition explaining each argument + """ + def run(self): """ Computes and returns the survival probability timeseries """ - # select all survivors to an array of sets + # load all frames to an array of sets selected = [] for _ in self.universe.trajectory[self.t0:self.tf]: selected.append(set(self.universe.select_atoms(self.selection))) - if len(selected) < self.tau_max: - print("ERROR: Cannot select fewer frames than dtmax") - return - tau_timeseries = np.arange(1, self.tau_max + 1) sp_timeseries = [[] for _ in range(self.tau_max)] - for t in range(len(selected)): Nt = len(selected[t]) @@ -1241,11 +1246,14 @@ def run(self): continue for tau in tau_timeseries: - if t + tau > len(selected): + if t + tau > len(selected) - 1: break Ntau = len(set.intersection(*selected[t:t + tau + 1])) sp_timeseries[tau - 1].append(Ntau / float(Nt) ) + # user can investigate the distribution and sample size + self.sp_timeseries = sp_timeseries + return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] From c89a690e1b5f084a57d59badce107446d272f3b9 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 17:13:27 +0100 Subject: [PATCH 177/455] verbose mode added + better documentation. --- package/MDAnalysis/analysis/waterdynamics.py | 35 +++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 7c6805cef7f..e575c667933 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1210,22 +1210,40 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20): + def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): + """ + FIXME - definition explaining each argument + tf is inclusive + + Return: + taus, sp_timeseries + + Special: + :param universe: + :param selection: + :param t0: First frame to be analysed + :param tf: Last frame to be analysed (must be below the max number of frames) + :param tau_max: The last tau to be calculated (inclusive), starts from 1 + :param verbose: If True, will highlight the starting point, ending point, progress + """ self.universe = universe self.selection = selection self.t0 = t0 if tf == -1: - self.tf = len(universe.trajectory) - else: + self.tf = len(universe.trajectory) - 1 + elif tf <= len(universe.trajectory): self.tf = tf + else: + raise ValueError("tf cannot be bigger than the number of frames in the simulation") self.tau_max = tau_max + self.verbose = verbose if tf - t0 <= self.tau_max: - raise ValueError("ERROR: Cannot select fewer frames than tau_max + 1") + raise ValueError("cannot select fewer frames than tau_max + 1") - """ - FIXME - definition explaining each argument - """ + def print(self, *args): + if self.verbose: + print(args) def run(self): """ @@ -1243,10 +1261,11 @@ def run(self): Nt = len(selected[t]) if Nt == 0: + self.print("At t=", t, "the selection did not find any molecule. Moving on to the next frame") continue for tau in tau_timeseries: - if t + tau > len(selected) - 1: + if t + tau > len(selected) - 1 - 1: break Ntau = len(set.intersection(*selected[t:t + tau + 1])) From ea1c744cf8f1210d1582a98cfd0c0149bb03d0e7 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 17:32:22 +0100 Subject: [PATCH 178/455] The tf is inclusive. --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index e575c667933..b618b72644c 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1265,7 +1265,7 @@ def run(self): continue for tau in tau_timeseries: - if t + tau > len(selected) - 1 - 1: + if t + tau > len(selected): break Ntau = len(set.intersection(*selected[t:t + tau + 1])) From ae6c2d991bac3c43838bf6be12ff186cb04d640a Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 3 Jul 2018 11:58:36 -0700 Subject: [PATCH 179/455] Stacked decorators in tests --- package/MDAnalysis/lib/distances.py | 11 ++++++----- testsuite/MDAnalysisTests/lib/test_distances.py | 8 ++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 93ae5c45a52..790e540ed08 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -1,4 +1,4 @@ - # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # # MDAnalysis --- https://www.mdanalysis.org @@ -485,15 +485,14 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, box Returns ------- Function object based on the rules and specified method - Currently implemented methods are bruteforce : returns ``_bruteforce_capped`` PKDtree : return ``_pkdtree_capped` """ methods = {'bruteforce': _bruteforce_capped, - 'pkdtree':_pkdtree_capped} - + 'pkdtree': _pkdtree_capped} + if method is not None: return methods[method] @@ -510,7 +509,9 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, box else: size = box.max(axis=0) - box.min(axis=0) - if np.any(size < 10.0*max_cutoff) and len(reference) > 100000 and len(configuration) > 100000: + if (np.any(size < 10.0*max_cutoff) and + len(reference) > 100000 and + len(configuration) > 100000): return methods['bruteforce'] else: return methods['pkdtree'] diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index c9916b117db..0b29dd7f8eb 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -73,9 +73,13 @@ def test_capped_distance_noresults(): size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) -@pytest.mark.parametrize('box, query , method', - itertools.product(boxes_1, query_1, method_1)) +@pytest.mark.parametrize('box', boxes_1) +@pytest.mark.parametrize('query', query_1) +@pytest.mark.parametrize('method', method_1) def test_capped_distance_checkbrute(box, query, method): + np.random.seed(90003) + points = (np.random.uniform(low=0, high=1.0, + size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) max_cutoff = 0.3 # capped distance should be able to handle array of vectors # as well as single vectors. From e0cf20a43737f2519124257130f49a2b975d96b9 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Tue, 3 Jul 2018 22:28:56 +0200 Subject: [PATCH 180/455] Avoid duplicating first frame in the continuous chin reader --- package/MDAnalysis/coordinates/chain.py | 35 ++++++++++--------- .../coordinates/test_chainreader.py | 5 +-- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index 56a181ea934..e849de80cb2 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -121,23 +121,19 @@ def filter_times(times, dt): # more then 2 unique time entries - # special case first times are equal - if not np.allclose(times[0][0], times[1][0]): - used_idx = [0, ] - offset = 1 - else: - used_idx = [1, ] - offset = 2 - - for i, (first, middle, last) in enumerate(zip(times[:-2], times[1:-1], times[2:])): - if not np.allclose(middle[1] - middle[0], dt): + used_idx = [0, ] + + for i, (first, middle, last) in enumerate(zip(times[:-2], times[1:-1], times[2:]), start=1): + if np.allclose(first[0], middle[0]): + used_idx[-1] = i + elif not np.allclose(middle[1] - middle[0], dt): if (middle[0] <= first[1]) and (last[0] <= middle[1]): - used_idx.append(i + offset) + used_idx.append(i) elif (middle[0] <= first[1]): - used_idx.append(i + offset) + used_idx.append(i) # take care of first special case - if offset == 1 and (times[-2][1] <= times[-1][1]): + if times[-2][1] <= times[-1][1]: used_idx.append(len(times) - 1) return used_idx @@ -156,9 +152,16 @@ class ChainReader(base.ProtoReader): colum represents the time and the trajectory segments overlap. With the continuous chainreader only the frames marked with a + will be read. - part01: ++++-- - part02: ++++++- - part03: ++++++++ + :: + + part01: ++++-- + part02: ++++++- + part03: ++++++++ + + .. warning:: + + The order in which trajectories can change what frames are used with + the continuous option. The default chainreader will read all frames. The continuous option is currently only supported for XTC and TRR files. diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 9b2312163a6..8c7e078c705 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -338,7 +338,7 @@ def test_unsupported_filetypes(self): [((0, 9), (0, 4)), (0, 1)], [((0, 3), (2, 2), (3, 3), (2, 6), (5, 9)), (0, 1, 3, 2, 4)], [((0, 2), (4, 9), (0, 4), (7, 9)), (0, 2, 1, 3)], - [((0, 5), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 3, 4)] + [((0, 5), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 1, 2, 3, 4)] )) def test_multilevel_arg_sort(l, ref): indices = mda.coordinates.chain.multi_level_argsort(l) @@ -356,9 +356,10 @@ def test_multilevel_arg_sort(l, ref): [((0, 3), (5, 9)), (0, 1)], [((0, 3), (0, 3), (5, 9)), (1, 2)], [((0, 3), (0, 3), (0, 3), (5, 9)), (2, 3)], - [((0, 5), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 4)], + [((0, 5), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 3, 4)], [((0, 3), (2, 4), (2, 4), (2, 4), (3, 7)), (0, 3, 4)], [((0, 3), (2, 4), (4, 7), (4, 7), (4, 7), (6, 9)), (0, 1, 4, 5)], + [((0, 6), (2, 5), (2, 5), (2, 5), (3, 8)), (0, 3, 4)], )) def test_filter_times(l, ref): indices = mda.coordinates.chain.filter_times(l, dt=1) From c487972b0ecee02261a166bda6d2a0e82c0e7e09 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Mon, 2 Jul 2018 11:36:22 -0700 Subject: [PATCH 181/455] updated GitHub template for issues - add comment that tells user to use the mailing list for questions and says that issues with question will be closed - changed links to user and developer list in CONTRIBUTING to the Google Groups so that we use SSL links instead the forwards to help.mdanalysis.org and developers.mdanalysis.org --- .github/CONTRIBUTING.md | 4 ++-- .github/ISSUE_TEMPLATE.md | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8b600597796..65301cdd05b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -6,10 +6,10 @@ Thanks for contributing to MDAnalysis! If you've found a defect with MDAnalysis we'd love to know so we can fix it. Please follow the Issue template so we can quickly diagnose the problem, in particular the piece of code that causes the problem. -If your issue isn't a defect with the code and instead you require help using MDAnalysis, drop by the [discussion board](http://help.mdanalysis.org). +If your issue isn't a defect with the code and instead you require help using MDAnalysis, drop by the [discussion board](https://groups.google.com/forum/#!forum/mdnalysis-discussion). #### Contributing code If you're contributing code, please check out the [Style guide](https://github.com/MDAnalysis/mdanalysis/wiki/Style-Guide). -MDAnalysis devs are most easily reached through the [development board](http://developers.mdanalysis.org). +MDAnalysis devs are most easily reached through the [development board](https://groups.google.com/forum/#!forum/mdnalysis-devel). diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 8d285c83339..67cbc79c5d2 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,31 @@ + ### Expected behaviour @@ -17,3 +45,4 @@ u = mda.Universe(top, trj) ### Currently version of MDAnalysis: (run `python -c "import MDAnalysis as mda; print(mda.__version__)"`) + From bc6381bdcf56e5cbfd1dea2025a0502e6f5147dc Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Wed, 4 Jul 2018 07:38:43 +0200 Subject: [PATCH 182/455] Make pylint happy --- testsuite/MDAnalysisTests/coordinates/test_chainreader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index 8c7e078c705..dfecc9bf0ef 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -266,7 +266,9 @@ def __init__(self, seq, n_frames, order): SequenceInfo(seq=([5, 6, 7, 8, 9], [2, 3, 4, 5, 6], [0, 1, 2, 3]), n_frames=10, order=[2, 2, 1, 1, 1, 0, 0, 0, 0, 0]), - SequenceInfo(seq=[range(0, 6), range(2, 5), range(2, 5), range(2, 5), range(3, 8)], + SequenceInfo(seq=[list(range(0, 6)), list(range(2, 5)), + list(range(2, 5)), list(range(2, 5)), + list(range(3, 8))], n_frames=8, order=[0, 0, 3, 4, 4, 4, 4, 4]), ]) From 2c6c6d417797f15f6d65dd83db5096094d634234 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Wed, 4 Jul 2018 16:00:17 +0200 Subject: [PATCH 183/455] improve documentation text --- package/MDAnalysis/coordinates/chain.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index e849de80cb2..5dc8716b4f1 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -147,10 +147,18 @@ class ChainReader(base.ProtoReader): typically do not need to use the :class:`ChainReader` explicitly. Chainreader can also handle a continuous trajectory split over several - files. To use this passe the 'continuous == True' keyword argument. An - example take the following trajectory that is split into three parts. The - colum represents the time and the trajectory segments overlap. With the - continuous chainreader only the frames marked with a + will be read. + files. To use this pass the 'continuous == True' keyword argument. Setting + continuous=True will make the reader choose frames from the set of + trajectories in such a way that the trajectory appears to be as continuous + in time as possible, i.e. that time is strictly monotonically increasing. + This means that there will be no duplicate time frames and no jumps + backwards in time. However, there can be gaps in time (e.g., multiple time + steps can appear to be missing). Ultimately, it is the user's + responsibility to ensure that the input trajectories can be virtually + stitched together in a meaningful manner. An example take the following + trajectory that is split into three parts. The colum represents the time + and the trajectory segments overlap. With the continuous chainreader only + the frames marked with a + will be read. :: From 32b2f06e8afb8aa868f51562802a3a8aac9da121 Mon Sep 17 00:00:00 2001 From: ayush Date: Wed, 4 Jul 2018 08:50:48 -0700 Subject: [PATCH 184/455] Removed the seed --- testsuite/MDAnalysisTests/lib/test_distances.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 0b29dd7f8eb..d2a87cbdfd7 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -68,11 +68,6 @@ def test_capped_distance_noresults(): method_1 = ('bruteforce', 'pkdtree') -np.random.seed(90003) -points = (np.random.uniform(low=0, high=1.0, - size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) - - @pytest.mark.parametrize('box', boxes_1) @pytest.mark.parametrize('query', query_1) @pytest.mark.parametrize('method', method_1) From acbbf43032459707f66c986406b930cc4e77323c Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Wed, 4 Jul 2018 17:51:44 +0100 Subject: [PATCH 185/455] pbc argument is now wrap; added tests in the transformations API context ; DummyReader didn't have a _transformations variable --- package/MDAnalysis/coordinates/dummy.py | 1 + .../MDAnalysis/transformations/translate.py | 6 ++-- .../transformations/test_translate.py | 28 +++++++++++++++++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/coordinates/dummy.py b/package/MDAnalysis/coordinates/dummy.py index c4550273c4c..d4ee963be3e 100644 --- a/package/MDAnalysis/coordinates/dummy.py +++ b/package/MDAnalysis/coordinates/dummy.py @@ -53,6 +53,7 @@ def __init__(self, n_atoms=None, velocities=False, forces=False): self.filename = 'DummyReader' self.n_frames = 1 self._read_first_frame(velocities, forces) + self._transformations = [] def _read_first_frame(self, velocities=False, forces=False): ts = self.ts = self._Timestep(self.n_atoms, positions=True, diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 82283af27dc..79960c0d54d 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -68,7 +68,7 @@ def wrapped(ts): return wrapped -def center_in_box(ag, center='geometry', point=None, pbc=False): +def center_in_box(ag, center='geometry', point=None, wrap=False): """ Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` instance so that the center of geometry/mass of the given :class:`~MDAnalysis.core.groups.AtomGroup` @@ -94,7 +94,7 @@ def center_in_box(ag, center='geometry', point=None, pbc=False): overrides the unit cell center - the coordinates of the Timestep are translated so that the center of mass/geometry of the given AtomGroup is aligned to this position instead. Defined as an array of size 3. - pbc: bool, optional + wrap: bool, optional If `True`, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry. Default is `False`, no changes to the atom coordinates are done before calculating the center of the AtomGroup. @@ -105,7 +105,7 @@ def center_in_box(ag, center='geometry', point=None, pbc=False): """ - pbc_arg = pbc + pbc_arg = wrap if point: point = np.asarray(point, np.float32) if point.shape != (3, ) and point.shape != (1, 3): diff --git a/testsuite/MDAnalysisTests/transformations/test_translate.py b/testsuite/MDAnalysisTests/transformations/test_translate.py index 79a5fdf555d..4462107796a 100644 --- a/testsuite/MDAnalysisTests/transformations/test_translate.py +++ b/testsuite/MDAnalysisTests/transformations/test_translate.py @@ -60,6 +60,16 @@ def test_translate_vector(translate_universes, vector): ts = translate_universes[0].trajectory.ts with pytest.raises(ValueError): translate(vector)(ts) + +def test_translate_transformations_api(translate_universes): + # test if the translate transformation works when using the + # on-the-fly transformations API + ref_u, trans_u = translate_universes + ref = ref_u.trajectory.ts + vector = np.float32([1, 2, 3]) + ref.positions += vector + trans_u.trajectory.add_transformations(translate(vector)) + assert_array_almost_equal(trans_u.trajectory.ts.positions, ref.positions, decimal=6) def test_center_in_box_bad_ag(translate_universes): # this universe has a box size zero @@ -91,7 +101,7 @@ def test_center_in_box_bad_pbc(translate_universes): # is pbc passed to the center methods? # if yes it should raise an exception for boxes that are zero in size with pytest.raises(ValueError): - center_in_box(ag, pbc=True)(ts) + center_in_box(ag, wrap=True)(ts) def test_center_in_box_bad_center(translate_universes): # this universe has a box size zero @@ -132,7 +142,7 @@ def test_center_in_box_coords_with_pbc(translate_universes): box_center = np.float32([181.5, 182., 182.5]) ref_center = np.float32([75.6, 75.8, 76.]) ref.positions += box_center - ref_center - trans = center_in_box(ag, pbc=True)(trans_u.trajectory.ts) + trans = center_in_box(ag, wrap=True)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) def test_center_in_box_coords_with_mass(translate_universes): @@ -168,5 +178,17 @@ def test_center_in_box_coords_all_options(translate_universes): box_center = np.float32(newpoint) ref_center = ag.center_of_mass(pbc=True) ref.positions += box_center - ref_center - trans = center_in_box(ag, center='mass', pbc=True, point=newpoint)(trans_u.trajectory.ts) + trans = center_in_box(ag, center='mass', wrap=True, point=newpoint)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + +def test_center_transformations_api(translate_universes): + # test if the translate transformation works when using the + # on-the-fly transformations API + ref_u, trans_u = translate_universes + ref = ref_u.trajectory.ts + ref_center = np.float32([6, 7, 8]) + box_center = np.float32([186., 186.5, 187.]) + ref.positions += box_center - ref_center + ag = trans_u.residues[0].atoms + trans_u.trajectory.add_transformations(center_in_box(ag)) + assert_array_almost_equal(trans_u.trajectory.ts.positions, ref.positions, decimal=6) From 94f0196682757ac1f9bcf879342454321a294e43 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Wed, 4 Jul 2018 18:43:47 +0100 Subject: [PATCH 186/455] style cleanup --- .../MDAnalysis/transformations/translate.py | 3 ++- .../transformations/test_translate.py | 24 +++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/transformations/translate.py b/package/MDAnalysis/transformations/translate.py index 79960c0d54d..f3728294df3 100644 --- a/package/MDAnalysis/transformations/translate.py +++ b/package/MDAnalysis/transformations/translate.py @@ -36,7 +36,6 @@ from functools import partial from ..lib.mdamath import triclinic_vectors -from ..core.groups import AtomGroup def translate(vector): """ @@ -61,6 +60,7 @@ def translate(vector): vector = np.float32(vector) else: raise ValueError("{} vector is too short".format(vector)) + def wrapped(ts): ts.positions += vector @@ -68,6 +68,7 @@ def wrapped(ts): return wrapped + def center_in_box(ag, center='geometry', point=None, wrap=False): """ Translates the coordinates of a given :class:`~MDAnalysis.coordinates.base.Timestep` diff --git a/testsuite/MDAnalysisTests/transformations/test_translate.py b/testsuite/MDAnalysisTests/transformations/test_translate.py index 4462107796a..6ae8b8a39e4 100644 --- a/testsuite/MDAnalysisTests/transformations/test_translate.py +++ b/testsuite/MDAnalysisTests/transformations/test_translate.py @@ -30,6 +30,7 @@ from MDAnalysis.transformations import translate, center_in_box from MDAnalysisTests import make_Universe + @pytest.fixture() def translate_universes(): # create the Universe objects for the tests @@ -37,8 +38,10 @@ def translate_universes(): reference = make_Universe(trajectory=True) transformed = make_Universe(['masses'], trajectory=True) transformed.trajectory.ts.dimensions = np.array([372., 373., 374., 90, 90, 90]) + return reference, transformed + def test_translate_coords(translate_universes): ref_u, trans_u = translate_universes ref = ref_u.trajectory.ts @@ -47,6 +50,7 @@ def test_translate_coords(translate_universes): trans = translate(vector)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + @pytest.mark.parametrize('vector', ( [0, 1], [0, 1, 2, 3, 4], @@ -60,7 +64,8 @@ def test_translate_vector(translate_universes, vector): ts = translate_universes[0].trajectory.ts with pytest.raises(ValueError): translate(vector)(ts) - + + def test_translate_transformations_api(translate_universes): # test if the translate transformation works when using the # on-the-fly transformations API @@ -71,6 +76,7 @@ def test_translate_transformations_api(translate_universes): trans_u.trajectory.add_transformations(translate(vector)) assert_array_almost_equal(trans_u.trajectory.ts.positions, ref.positions, decimal=6) + def test_center_in_box_bad_ag(translate_universes): # this universe has a box size zero ts = translate_universes[0].trajectory.ts @@ -79,6 +85,7 @@ def test_center_in_box_bad_ag(translate_universes): with pytest.raises(ValueError): center_in_box(bad_ag)(ts) + @pytest.mark.parametrize('point', ( [0, 1], [0, 1, 2, 3, 4], @@ -93,7 +100,8 @@ def test_center_in_box_bad_point(translate_universes, point): # what if the box is in the wrong format? with pytest.raises(ValueError): center_in_box(ag, point=point)(ts) - + + def test_center_in_box_bad_pbc(translate_universes): # this universe has a box size zero ts = translate_universes[0].trajectory.ts @@ -103,6 +111,7 @@ def test_center_in_box_bad_pbc(translate_universes): with pytest.raises(ValueError): center_in_box(ag, wrap=True)(ts) + def test_center_in_box_bad_center(translate_universes): # this universe has a box size zero ts = translate_universes[0].trajectory.ts @@ -111,7 +120,8 @@ def test_center_in_box_bad_center(translate_universes): bad_center = " " with pytest.raises(ValueError): center_in_box(ag, center=bad_center)(ts) - + + def test_center_in_box_no_masses(translate_universes): # this universe has no masses ts = translate_universes[0].trajectory.ts @@ -121,6 +131,7 @@ def test_center_in_box_no_masses(translate_universes): with pytest.raises(AttributeError): center_in_box(ag, center=bad_center)(ts) + def test_center_in_box_coords_no_options(translate_universes): # what happens when we center the coordinates arround the center of geometry of a residue? ref_u, trans_u = translate_universes @@ -132,6 +143,7 @@ def test_center_in_box_coords_no_options(translate_universes): trans = center_in_box(ag)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + def test_center_in_box_coords_with_pbc(translate_universes): # what happens when we center the coordinates arround the center of geometry of a residue? # using pbc into account for center of geometry calculation @@ -145,6 +157,7 @@ def test_center_in_box_coords_with_pbc(translate_universes): trans = center_in_box(ag, wrap=True)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + def test_center_in_box_coords_with_mass(translate_universes): # using masses for calculating the center of the atomgroup ref_u, trans_u = translate_universes @@ -156,6 +169,7 @@ def test_center_in_box_coords_with_mass(translate_universes): trans = center_in_box(ag, center="mass")(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + def test_center_in_box_coords_with_box(translate_universes): # using masses for calculating the center of the atomgroup ref_u, trans_u = translate_universes @@ -168,6 +182,7 @@ def test_center_in_box_coords_with_box(translate_universes): trans = center_in_box(ag, point=newpoint)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) + def test_center_in_box_coords_all_options(translate_universes): # what happens when we center the coordinates arround the center of geometry of a residue? # using pbc into account for center of geometry calculation @@ -180,7 +195,8 @@ def test_center_in_box_coords_all_options(translate_universes): ref.positions += box_center - ref_center trans = center_in_box(ag, center='mass', wrap=True, point=newpoint)(trans_u.trajectory.ts) assert_array_almost_equal(trans.positions, ref.positions, decimal=6) - + + def test_center_transformations_api(translate_universes): # test if the translate transformation works when using the # on-the-fly transformations API From ac9533b7f260977734fc36696513725e22038fc9 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Thu, 5 Jul 2018 10:30:37 +0200 Subject: [PATCH 187/455] improve doc texts --- package/MDAnalysis/coordinates/chain.py | 37 +++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/package/MDAnalysis/coordinates/chain.py b/package/MDAnalysis/coordinates/chain.py index 5dc8716b4f1..176a79f29d2 100644 --- a/package/MDAnalysis/coordinates/chain.py +++ b/package/MDAnalysis/coordinates/chain.py @@ -147,16 +147,16 @@ class ChainReader(base.ProtoReader): typically do not need to use the :class:`ChainReader` explicitly. Chainreader can also handle a continuous trajectory split over several - files. To use this pass the 'continuous == True' keyword argument. Setting - continuous=True will make the reader choose frames from the set of - trajectories in such a way that the trajectory appears to be as continuous - in time as possible, i.e. that time is strictly monotonically increasing. - This means that there will be no duplicate time frames and no jumps - backwards in time. However, there can be gaps in time (e.g., multiple time - steps can appear to be missing). Ultimately, it is the user's + files. To use this pass the ``continuous == True`` keyword argument. + Setting ``continuous=True`` will make the reader choose frames from the set + of trajectories in such a way that the trajectory appears to be as + continuous in time as possible, i.e. that time is strictly monotonically + increasing. This means that there will be no duplicate time frames and no + jumps backwards in time. However, there can be gaps in time (e.g., multiple + time steps can appear to be missing). Ultimately, it is the user's responsibility to ensure that the input trajectories can be virtually - stitched together in a meaningful manner. An example take the following - trajectory that is split into three parts. The colum represents the time + stitched together in a meaningful manner. As an example take the following + trajectory that is split into three parts. The column represents the time and the trajectory segments overlap. With the continuous chainreader only the frames marked with a + will be read. @@ -168,8 +168,8 @@ class ChainReader(base.ProtoReader): .. warning:: - The order in which trajectories can change what frames are used with - the continuous option. + The order in which trajectories are given to the chainreader can change + what frames are used with the continuous option. The default chainreader will read all frames. The continuous option is currently only supported for XTC and TRR files. @@ -188,7 +188,7 @@ class ChainReader(base.ProtoReader): :attr:`time` now reports the time summed over each trajectory's frames and individual :attr:`dt`. .. versionchanged:: 0.19.0 - added continuous trajectory option + added ``continuous`` trajectory option """ format = 'CHAIN' @@ -273,12 +273,15 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): if continuous: filetypes = np.unique([r.format for r in self.readers]) if not len(filetypes) == 1: - raise ValueError("Continuous only supported when all files " - "are using the same format. found {}".format(filetypes)) + raise ValueError("ChainReader: continuous=true only supported" + " when all files are using the same format. " + "found {}".format(filetypes)) if np.any(np.array(n_frames) == 1): - raise RuntimeError("Need at least two frames in every trajectory") + raise RuntimeError("ChainReader: Need at least two frames in " + "every trajectory with continuous=True") if filetypes[0] not in ['XTC', 'TRR']: - raise NotImplementedError("continuous only supported for xtc and trr format") + raise NotImplementedError("ChainReader: continuous=True only " + "supported for xtc and trr format") # TODO: allow floating point precision in dt check dt = self._get_same('dt') @@ -327,7 +330,7 @@ def __init__(self, filenames, skip=1, dt=None, continuous=False, **kwargs): # check for interleaving r1[1] if r1_start_time < start_time < r1.time: - raise RuntimeError("Interleaving not supported.") + raise RuntimeError("ChainReader: Interleaving not supported with continuous=True.") # find end where trajectory was restarted from for ts in r1[::-1]: From 820151024002fa6b349064c0b75f42bb02bdc59c Mon Sep 17 00:00:00 2001 From: Max Linke Date: Thu, 5 Jul 2018 10:30:46 +0200 Subject: [PATCH 188/455] update test style --- testsuite/MDAnalysisTests/coordinates/test_chainreader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py index dfecc9bf0ef..d7661e1928e 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_chainreader.py +++ b/testsuite/MDAnalysisTests/coordinates/test_chainreader.py @@ -27,7 +27,7 @@ import pytest -from numpy.testing import (assert_equal, assert_almost_equal, assert_array_almost_equal, assert_array_equal) +from numpy.testing import (assert_equal, assert_almost_equal) import MDAnalysis as mda from MDAnalysis.transformations import translate @@ -344,7 +344,7 @@ def test_unsupported_filetypes(self): )) def test_multilevel_arg_sort(l, ref): indices = mda.coordinates.chain.multi_level_argsort(l) - assert_array_equal(indices, ref) + assert_equal(indices, ref) @pytest.mark.parametrize('l, ref', ([((0, 4), (3, 6), (6, 9)), (0, 1, 2)], @@ -365,4 +365,4 @@ def test_multilevel_arg_sort(l, ref): )) def test_filter_times(l, ref): indices = mda.coordinates.chain.filter_times(l, dt=1) - assert_array_equal(indices, ref) + assert_equal(indices, ref) From 683f1cbfffad7f38e40ac5fecdac680f2045086b Mon Sep 17 00:00:00 2001 From: p-j-smith Date: Thu, 5 Jul 2018 12:24:03 +0100 Subject: [PATCH 189/455] Storing a set of atom ids at each timestep, rather than a set containing an atom group, to reduce the memory load. Updated the docstring. --- package/MDAnalysis/analysis/waterdynamics.py | 51 +++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index b618b72644c..9dcf27f815e 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1199,47 +1199,39 @@ class SurvivalProbability(object): define the region/zone where to analyze, e.g.: "selection_a" and "zone" (see `SP-examples`_ ) t0 : int - frame where analysis begins + Zero-based index of the first frame to be analysed tf : int - frame where analysis ends + Zero-based index of the last frame to be analysed (inclusive) tau_max : int - Maximum dt size, `tau_max` must be < `tf` + Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + verbose : Boolean + If True, prints progress and comments to the console. + Returns + ------- + tau_timeseries : list + tau from 1 to tau_max + sp_timeseries : list + survival probability for each value of `tau` .. versionadded:: 0.11.0 """ def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): - """ - FIXME - definition explaining each argument - tf is inclusive - - Return: - taus, sp_timeseries - - Special: - :param universe: - :param selection: - :param t0: First frame to be analysed - :param tf: Last frame to be analysed (must be below the max number of frames) - :param tau_max: The last tau to be calculated (inclusive), starts from 1 - :param verbose: If True, will highlight the starting point, ending point, progress - """ + + if tf >= len(universe.trajectory): + raise ValueError("\"end\" must be smaller than the number of frames in the trajectory.") + self.universe = universe self.selection = selection self.t0 = t0 - if tf == -1: - self.tf = len(universe.trajectory) - 1 - elif tf <= len(universe.trajectory): - self.tf = tf - else: - raise ValueError("tf cannot be bigger than the number of frames in the simulation") + self.tf = len(universe.trajectory[:tf]) + 1 self.tau_max = tau_max self.verbose = verbose - if tf - t0 <= self.tau_max: - raise ValueError("cannot select fewer frames than tau_max + 1") + if self.tau_max > self.tf - self.t0: + raise ValueError("Too few frames selected for given tau_max.") def print(self, *args): if self.verbose: @@ -1253,15 +1245,16 @@ def run(self): # load all frames to an array of sets selected = [] for _ in self.universe.trajectory[self.t0:self.tf]: - selected.append(set(self.universe.select_atoms(self.selection))) + selected.append(set(self.universe.select_atoms(self.selection).ids)) - tau_timeseries = np.arange(1, self.tau_max + 1) + tau_timeseries = list(range(1, self.tau_max + 1)) sp_timeseries = [[] for _ in range(self.tau_max)] + for t in range(len(selected)): Nt = len(selected[t]) if Nt == 0: - self.print("At t=", t, "the selection did not find any molecule. Moving on to the next frame") + self.print("At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) continue for tau in tau_timeseries: From ebd1b33b568cc93fb82191095a16a33539a5413f Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 5 Jul 2018 17:02:22 +0100 Subject: [PATCH 190/455] tiny bug --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 9dcf27f815e..652d82ba3f2 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1226,7 +1226,7 @@ def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): self.universe = universe self.selection = selection self.t0 = t0 - self.tf = len(universe.trajectory[:tf]) + 1 + self.tf = len(list(universe.trajectory[:tf])) + 1 self.tau_max = tau_max self.verbose = verbose From f3e74c948e5012222de4f1fa4a6cd58000bec05a Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Fri, 6 Jul 2018 15:35:56 +0100 Subject: [PATCH 191/455] changed pbc to wrap --- package/MDAnalysis/transformations/rotate.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index a3644e74e14..a9712d2a44a 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -35,9 +35,8 @@ from functools import partial from ..lib.transformations import rotation_matrix -from ..core.groups import AtomGroup -def rotateby(angle, direction, point=None, center="geometry", pbc=False, ag=None): +def rotateby(angle, direction, point=None, center="geometry", wrap=False, ag=None): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a point. This point can be the center @@ -75,7 +74,7 @@ def rotateby(angle, direction, point=None, center="geometry", pbc=False, ag=None center: str, optional used to choose the method of centering on the given atom group. Can be 'geometry' or 'mass' - pbc: bool, optional + wrap: bool, optional If `True`, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry. Default is `False`, no changes to the atom coordinates are done before calculating the center of the AtomGroup. @@ -93,7 +92,7 @@ def rotateby(angle, direction, point=None, center="geometry", pbc=False, ag=None after rotating the trajectory. ''' - pbc_arg = pbc + pbc_arg = wrap angle = np.deg2rad(angle) if point: point = np.asarray(point, np.float32) From aebdd7bb209f9bb92957e76ad10ac3143f7e958e Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 30 Jun 2018 17:29:53 -0500 Subject: [PATCH 192/455] rewrote _is_contiguous in Cython, approx 2x faster --- package/MDAnalysis/lib/_cutil.pyx | 110 ++++++++++++++++++++- package/MDAnalysis/lib/mdamath.py | 38 +------ package/setup.py | 4 +- testsuite/MDAnalysisTests/lib/test_util.py | 11 ++- 4 files changed, 121 insertions(+), 42 deletions(-) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index 856d3f4a06e..5860d6b7341 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -23,14 +23,16 @@ import cython import numpy as np -cimport numpy as np -__all__ = ['unique_int_1d', ] +from libcpp.set cimport set as cset +from libcpp.map cimport map as cmap + +__all__ = ['unique_int_1d', '_is_contiguous'] @cython.boundscheck(False) # turn off bounds-checking for entire function @cython.wraparound(False) # turn off negative index wrapping for entire function -def unique_int_1d(np.ndarray[np.int64_t, ndim=1] values): +def unique_int_1d(long[:] values): """ Find the unique elements of a 1D array of integers. @@ -38,7 +40,7 @@ def unique_int_1d(np.ndarray[np.int64_t, ndim=1] values): Parameters ---------- - values: np.ndarray + values: np.ndarray of type int64 1D array of int in which to find the unique values. Returns @@ -51,7 +53,7 @@ def unique_int_1d(np.ndarray[np.int64_t, ndim=1] values): cdef int i = 0 cdef int j = 0 cdef int n_values = values.shape[0] - cdef np.ndarray[np.int64_t, ndim=1] result = np.empty(n_values, dtype=np.int64) + cdef long[:] result = np.empty(n_values, dtype=np.int64) if n_values == 0: return result @@ -68,3 +70,101 @@ def unique_int_1d(np.ndarray[np.int64_t, ndim=1] values): result.sort() result = unique_int_1d(result) return result + + +ctypedef cset[int] intset +ctypedef cmap[int, intset] intmap + +@cython.boundscheck(False) +@cython.wraparound(False) +cdef intset difference(intset a, intset b): + """a.difference(b) + + Returns set of values in a which are not in b + """ + cdef intset output + + output = intset() + + for val in a: + if b.count(val) != 1: + output.insert(val) + + return output + + +@cython.boundscheck(False) +@cython.wraparound(False) +def _is_contiguous(int[:] atoms, int[:, :] bonds, int start): + """ + + Parameters + ---------- + atoms : np.ndarray + array of atom indices to consider + bonds : np.ndarray + array of bonds + start : int + where to start walking + + Returns + ------- + result : bool + If entire molecule can be traversed by bonds + """ + cdef bint result + cdef intset seen, done, todo, total + cdef intmap bonding + cdef int i, N, nloops + cdef int x, y + + total = intset() + bonding = intmap() + + # make set of which atoms exist + N = atoms.shape[0] + for i in range(N): + total.insert(atoms[i]) + + if not total.count(start): + raise ValueError + + # build C++ dict of bonds + N = bonds.shape[0] + for i in range(N): + x = bonds[i, 0] + y = bonds[i, 1] + # only add bonds if both atoms are in atoms set + if total.count(x): + if total.count(y): + bonding[x].insert(y) + bonding[y].insert(x) + + seen = intset() + seen.insert(start) + done = intset() + + N = total.size() + + nloops = 0 + while seen.size() < N: + nloops += 1 + if nloops >= N: + break + # todo is set of start points + # can start on anyone that has been seen, but not done yet + todo = difference(seen, done) + + for x in todo: # for each start point + for y in bonding[x]: # add all bonded atoms + seen.insert(y) + # mark as done + done.insert(x) + + # if we saw all Atoms when walking, is_contiguous + if seen.size() == N: + result = True + else: + result = False + + return result diff --git a/package/MDAnalysis/lib/mdamath.py b/package/MDAnalysis/lib/mdamath.py index dd58ea12bab..badc36b92b1 100644 --- a/package/MDAnalysis/lib/mdamath.py +++ b/package/MDAnalysis/lib/mdamath.py @@ -43,7 +43,7 @@ import numpy as np from ..exceptions import NoDataError - +from . import util # geometric functions def norm(v): @@ -249,36 +249,6 @@ def box_volume(dimensions): return np.linalg.det(triclinic_vectors(dimensions)) -def _is_contiguous(atomgroup, atom): - """Walk through atomgroup, starting with atom. - - Returns - ------- - bool - ``True`` if all of *atomgroup* is accessible through walking - along bonds. - ``False`` otherwise. - """ - seen = set([atom]) - walked = set() - ag_set = set(atomgroup) - - nloops = 0 - while len(seen) < len(atomgroup): - nloops += 1 - if nloops > len(atomgroup): - return False - - todo = seen.difference(walked) - for atom in todo: - for other in atom.bonded_atoms: - if other in ag_set: - seen.add(other) - walked.add(atom) - - return True - - def make_whole(atomgroup, reference_atom=None): """Move all atoms in a single molecule so that bonds don't split over images @@ -329,7 +299,7 @@ def make_whole(atomgroup, reference_atom=None): ------- Make fragments whole:: - from MDAnalysis.util.mdamath import make_whole + from MDAnalysis.lib.mdamath import make_whole # This algorithm requires bonds, these can be guessed! u = mda.Universe(......, guess_bonds=True) @@ -364,7 +334,9 @@ def make_whole(atomgroup, reference_atom=None): raise ValueError("Reference atom not in atomgroup") # Check all of atomgroup is accessible from ref - if not _is_contiguous(atomgroup, ref): + if not util._is_contiguous(atomgroup.indices.astype(np.int32), + atomgroup.bonds.to_indices(), + ref.index): raise ValueError("atomgroup not contiguous from bonds") # Not sure if this is actually a requirement... diff --git a/package/setup.py b/package/setup.py index ca7cd30edce..3596540d83e 100755 --- a/package/setup.py +++ b/package/setup.py @@ -341,9 +341,11 @@ def extensions(config): extra_compile_args=extra_compile_args) cutil = MDAExtension('MDAnalysis.lib._cutil', sources=['MDAnalysis/lib/_cutil' + source_suffix], + language='c++', include_dirs=include_dirs, define_macros=define_macros, - extra_compile_args=extra_compile_args) + extra_compile_args=[a for a in extra_compile_args + if not a.startswith('-std')]) encore_utils = MDAExtension('MDAnalysis.analysis.encore.cutils', diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index 4f1243f9deb..6a0abcf2009 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -289,12 +289,17 @@ def test_impossible_solve(self, universe): def test_walk_1(self, universe, ag): # self.ag is contiguous - assert mdamath._is_contiguous(ag, universe.residues[0].atoms[0]) + assert util._is_contiguous( + ag.atoms.ix.astype(np.int32), + ag.bonds.to_indices(), + universe.residues[0].atoms[0].index) def test_walk_2(self, universe): # u.atoms isnt all contiguous - assert not mdamath._is_contiguous(universe.atoms, - universe.residues[0].atoms[0]) + assert not util._is_contiguous( + universe.atoms.ix.astype(np.int32), + universe.atoms.bonds.to_indices(), + universe.residues[0].atoms[0].index) def test_solve_1(self, universe, ag): # regular usage of function From 4cd8be365e0a92d0f5640b51c4407bad072436ab Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sun, 1 Jul 2018 17:33:41 +0200 Subject: [PATCH 193/455] add osx compilation --- package/MDAnalysis/lib/_cutil.pyx | 37 ++++++++++--------------------- package/setup.py | 10 +++++++-- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index 5860d6b7341..0589da5554d 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -23,6 +23,7 @@ import cython import numpy as np +cimport numpy as np from libcpp.set cimport set as cset from libcpp.map cimport map as cmap @@ -32,7 +33,7 @@ __all__ = ['unique_int_1d', '_is_contiguous'] @cython.boundscheck(False) # turn off bounds-checking for entire function @cython.wraparound(False) # turn off negative index wrapping for entire function -def unique_int_1d(long[:] values): +def unique_int_1d(np.int64_t[:] values): """ Find the unique elements of a 1D array of integers. @@ -53,11 +54,11 @@ def unique_int_1d(long[:] values): cdef int i = 0 cdef int j = 0 cdef int n_values = values.shape[0] - cdef long[:] result = np.empty(n_values, dtype=np.int64) + cdef np.int64_t[:] result = np.empty(n_values, dtype=np.int64) if n_values == 0: return result - + result[0] = values[0] for i in range(1, n_values): if values[i] != result[j]: @@ -67,29 +68,23 @@ def unique_int_1d(long[:] values): is_monotonic = False result = result[:j + 1] if not is_monotonic: - result.sort() - result = unique_int_1d(result) - return result + result = unique_int_1d(np.sort(result)) + + return np.array(result) ctypedef cset[int] intset ctypedef cmap[int, intset] intmap -@cython.boundscheck(False) -@cython.wraparound(False) cdef intset difference(intset a, intset b): """a.difference(b) Returns set of values in a which are not in b """ cdef intset output - - output = intset() - for val in a: if b.count(val) != 1: output.insert(val) - return output @@ -135,10 +130,9 @@ def _is_contiguous(int[:] atoms, int[:, :] bonds, int start): x = bonds[i, 0] y = bonds[i, 1] # only add bonds if both atoms are in atoms set - if total.count(x): - if total.count(y): - bonding[x].insert(y) - bonding[y].insert(x) + if total.count(x) and total.count(y): + bonding[x].insert(y) + bonding[y].insert(x) seen = intset() seen.insert(start) @@ -147,10 +141,8 @@ def _is_contiguous(int[:] atoms, int[:, :] bonds, int start): N = total.size() nloops = 0 - while seen.size() < N: + while seen.size() < N and nloops < N: nloops += 1 - if nloops >= N: - break # todo is set of start points # can start on anyone that has been seen, but not done yet todo = difference(seen, done) @@ -162,9 +154,4 @@ def _is_contiguous(int[:] atoms, int[:, :] bonds, int start): done.insert(x) # if we saw all Atoms when walking, is_contiguous - if seen.size() == N: - result = True - else: - result = False - - return result + return seen.size() == N diff --git a/package/setup.py b/package/setup.py index 3596540d83e..cd5e3b0aaaa 100755 --- a/package/setup.py +++ b/package/setup.py @@ -51,6 +51,7 @@ import shutil import tempfile import warnings +import platform # Make sure I have the right Python version. if sys.version_info[:2] < (2, 7): @@ -255,6 +256,12 @@ def extensions(config): if arch: extra_compile_args.append('-march={}'.format(arch)) + cpp_extra_compile_args = [a for a in extra_compile_args if 'std' not in a] + cpp_extra_compile_args.append('-std=c++11') + # needed to specify c++ runtime library on OSX + if platform.system() == 'Darwin': + cpp_extra_compile_args.append('-stdlib=libc++') + # Needed for large-file seeking under 32bit systems (for xtc/trr indexing # and access). largefile_macros = [ @@ -344,8 +351,7 @@ def extensions(config): language='c++', include_dirs=include_dirs, define_macros=define_macros, - extra_compile_args=[a for a in extra_compile_args - if not a.startswith('-std')]) + extra_compile_args=cpp_extra_compile_args) encore_utils = MDAExtension('MDAnalysis.analysis.encore.cutils', From 9ea632861aa6cd7a9618bcc28930b1accf586a7c Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 1 Jul 2018 14:58:31 -0500 Subject: [PATCH 194/455] rewrote make_whole in Cython lib.mdamath.make_whole now supports triclinic boxes renamed from new to avoid cpp name conflict in calc_distances.h added fullerene test case for make_whole --- package/CHANGELOG | 1 + package/MDAnalysis/lib/_cutil.pyx | 211 +++++++++++++----- .../MDAnalysis/lib/include/calc_distances.h | 18 +- package/MDAnalysis/lib/mdamath.py | 153 +------------ package/setup.py | 3 +- .../MDAnalysisTests/data/fullerene.pdb.gz | Bin 0 -> 1074 bytes testsuite/MDAnalysisTests/datafiles.py | 2 + testsuite/MDAnalysisTests/lib/test_util.py | 73 +++--- 8 files changed, 210 insertions(+), 251 deletions(-) create mode 100644 testsuite/MDAnalysisTests/data/fullerene.pdb.gz diff --git a/package/CHANGELOG b/package/CHANGELOG index 5f99db203b0..971776bc469 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -42,6 +42,7 @@ Enhancements default True. (Issue #1938) * ChainReader can correctly handle continuous trajectories split into multiple files, generated with gromacs -noappend (PR #1728) + * MDAnalysis.lib.mdamath now supports triclinic boxes and rewrote in Cython (PR #1965) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index 0589da5554d..0463cf15cef 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -25,10 +25,20 @@ import cython import numpy as np cimport numpy as np +from MDAnalysis import NoDataError + from libcpp.set cimport set as cset from libcpp.map cimport map as cmap -__all__ = ['unique_int_1d', '_is_contiguous'] +__all__ = ['unique_int_1d', 'make_whole'] + +cdef extern from "calc_distances.h": + ctypedef float coordinate[3] + void minimum_image(double *x, float *box, float *inverse_box) + void minimum_image_triclinic(double *dx, coordinate *box) + +ctypedef cset[int] intset +ctypedef cmap[int, intset] intmap @cython.boundscheck(False) # turn off bounds-checking for entire function @@ -73,9 +83,6 @@ def unique_int_1d(np.int64_t[:] values): return np.array(result) -ctypedef cset[int] intset -ctypedef cmap[int, intset] intmap - cdef intset difference(intset a, intset b): """a.difference(b) @@ -90,68 +97,168 @@ cdef intset difference(intset a, intset b): @cython.boundscheck(False) @cython.wraparound(False) -def _is_contiguous(int[:] atoms, int[:, :] bonds, int start): - """ +def make_whole(atomgroup, reference_atom=None): + """Move all atoms in a single molecule so that bonds don't split over images + + Atom positions are modified in place. + + This function is most useful when atoms have been packed into the primary + unit cell, causing breaks mid molecule, with the molecule then appearing + on either side of the unit cell. This is problematic for operations + such as calculating the center of mass of the molecule. :: + + +-----------+ +-----------+ + | | | | + | 6 3 | | 3 | 6 + | ! ! | | ! | ! + |-5-8 1-2-| -> | 1-2-|-5-8 + | ! ! | | ! | ! + | 7 4 | | 4 | 7 + | | | | + +-----------+ +-----------+ + Parameters ---------- - atoms : np.ndarray - array of atom indices to consider - bonds : np.ndarray - array of bonds - start : int - where to start walking + atomgroup : AtomGroup + The :class:`MDAnalysis.core.groups.AtomGroup` to work with. + The positions of this are modified in place. All these atoms + must belong in the same molecule or fragment. + reference_atom : :class:`~MDAnalysis.core.groups.Atom` + The atom around which all other atoms will be moved. + Defaults to atom 0 in the atomgroup. - Returns + Raises + ------ + NoDataError + There are no bonds present. + (See :func:`~MDAnalysis.topology.core.guess_bonds`) + + ValueError + The algorithm fails to work. This is usually + caused by the atomgroup not being a single fragment. + (ie the molecule can't be traversed by following bonds) + + + Example ------- - result : bool - If entire molecule can be traversed by bonds + Make fragments whole:: + + from MDAnalysis.lib.mdamath import make_whole + + # This algorithm requires bonds, these can be guessed! + u = mda.Universe(......, guess_bonds=True) + + # MDAnalysis can split molecules into their fragments + # based on bonding information. + # Note that this function will only handle a single fragment + # at a time, necessitating a loop. + for frag in u.fragments: + make_whole(frag) + + Alternatively, to keep a single atom in place as the anchor:: + + # This will mean that atomgroup[10] will NOT get moved, + # and all other atoms will move (if necessary). + make_whole(atomgroup, reference_atom=atomgroup[10]) + + + .. versionadded:: 0.11.0 """ - cdef bint result - cdef intset seen, done, todo, total + cdef intset agset, refpoints, todo, done + cdef int i, nloops, ref, atom, other cdef intmap bonding - cdef int i, N, nloops - cdef int x, y + cdef int[:, :] bonds + cdef float[:, :] oldpos, newpos + cdef bint ortho + cdef float[:] box + cdef float tri_box[3][3] + cdef float inverse_box[3] + cdef double vec[3] + + if reference_atom is None: + ref = atomgroup[0].index + else: + # Sanity check + if not reference_atom in atomgroup: + raise ValueError("Reference atom not in atomgroup") + ref = reference_atom.index + + box = atomgroup.dimensions - total = intset() - bonding = intmap() + for i in range(3): + if box[i] == 0.0: + raise ValueError("One or more dimensions was zero. " + "You can set dimensions using 'atomgroup.dimensions='") - # make set of which atoms exist - N = atoms.shape[0] - for i in range(N): - total.insert(atoms[i]) + ortho = True + for i in range(3, 6): + if box[i] != 90.0: + ortho = False - if not total.count(start): - raise ValueError + if ortho: + for i in range(3): + inverse_box[i] = 1.0 / box[i] + else: + from .mdamath import triclinic_vectors + tri_box = triclinic_vectors(box) - # build C++ dict of bonds - N = bonds.shape[0] - for i in range(N): - x = bonds[i, 0] - y = bonds[i, 1] + # set of indices in AtomGroup + agset = intset() + for i in atomgroup.indices.astype(np.int32): + agset.insert(i) + # C++ dict of bonds + try: + bonds = atomgroup.bonds.to_indices() + except (AttributeError, NoDataError): + raise NoDataError("The atomgroup is required to have bonds") + for i in range(bonds.shape[0]): + atom = bonds[i, 0] + other = bonds[i, 1] # only add bonds if both atoms are in atoms set - if total.count(x) and total.count(y): - bonding[x].insert(y) - bonding[y].insert(x) + if agset.count(atom) and agset.count(other): + bonding[atom].insert(other) + bonding[other].insert(atom) - seen = intset() - seen.insert(start) - done = intset() + oldpos = atomgroup.positions + newpos = np.zeros((oldpos.shape[0], 3), dtype=np.float32) - N = total.size() + done = intset() # Who have I already done? + refpoints = intset() # Who is safe to use as reference point? + # initially we have one starting atom whose position we trust + refpoints.insert(ref) + for i in range(3): + newpos[ref, i] = oldpos[ref, i] nloops = 0 - while seen.size() < N and nloops < N: + while refpoints.size() < agset.size() and nloops < agset.size(): nloops += 1 - # todo is set of start points - # can start on anyone that has been seen, but not done yet - todo = difference(seen, done) - - for x in todo: # for each start point - for y in bonding[x]: # add all bonded atoms - seen.insert(y) - # mark as done - done.insert(x) - - # if we saw all Atoms when walking, is_contiguous - return seen.size() == N + + # We want to iterate over atoms that are good to use as reference + # points, but haven't been done yet. + todo = difference(refpoints, done) + for atom in todo: + for other in bonding[atom]: + # If other is already a refpoint, leave alone + if refpoints.count(other): + continue + # Draw vector from atom to other + for i in range(3): + vec[i] = oldpos[other, i] - oldpos[atom, i] + # Apply periodic boundary conditions to this vector + if ortho: + minimum_image(&vec[0], &box[0], &inverse_box[0]) + else: + minimum_image_triclinic(&vec[0], &tri_box[0]) + # Then define position of other based on this vector + for i in range(3): + newpos[other, i] = newpos[atom, i] + vec[i] + + # This other atom can now be used as a reference point + refpoints.insert(other) + done.insert(atom) + + if refpoints.size() < agset.size(): + raise ValueError("AtomGroup was not contiguous from bonds, process failed") + else: + atomgroup.positions = newpos diff --git a/package/MDAnalysis/lib/include/calc_distances.h b/package/MDAnalysis/lib/include/calc_distances.h index 72a45c2d6ae..701b52a8973 100644 --- a/package/MDAnalysis/lib/include/calc_distances.h +++ b/package/MDAnalysis/lib/include/calc_distances.h @@ -310,25 +310,25 @@ static void _calc_self_distance_array_triclinic(coordinate* ref, int numref, void _coord_transform(float coords[][3], int numCoords, float box[][3]) { int i, j, k; - float new[3]; + float newpos[3]; // Matrix multiplication inCoords * box = outCoords // Multiplication done in place using temp array 'new' // Used to transform coordinates to/from S/R space in trilinic boxes #ifdef PARALLEL -#pragma omp parallel for private(i, j, k, new) shared(coords) +#pragma omp parallel for private(i, j, k, newpos) shared(coords) #endif for (i=0; i < numCoords; i++){ - new[0] = 0.0; - new[1] = 0.0; - new[2] = 0.0; + newpos[0] = 0.0; + newpos[1] = 0.0; + newpos[2] = 0.0; for (j=0; j<3; j++){ for (k=0; k<3; k++){ - new[j] += coords[i][k] * box[k][j]; + newpos[j] += coords[i][k] * box[k][j]; } } - coords[i][0] = new[0]; - coords[i][1] = new[1]; - coords[i][2] = new[2]; + coords[i][0] = newpos[0]; + coords[i][1] = newpos[1]; + coords[i][2] = newpos[2]; } } diff --git a/package/MDAnalysis/lib/mdamath.py b/package/MDAnalysis/lib/mdamath.py index badc36b92b1..8d8f87badbd 100644 --- a/package/MDAnalysis/lib/mdamath.py +++ b/package/MDAnalysis/lib/mdamath.py @@ -44,6 +44,7 @@ from ..exceptions import NoDataError from . import util +from ._cutil import make_whole # geometric functions def norm(v): @@ -249,158 +250,6 @@ def box_volume(dimensions): return np.linalg.det(triclinic_vectors(dimensions)) -def make_whole(atomgroup, reference_atom=None): - """Move all atoms in a single molecule so that bonds don't split over images - - Atoms are modified in place. - - This function is most useful when atoms have been packed into the primary - unit cell, causing breaks mid molecule, with the molecule then appearing - on either side of the unit cell. This is problematic for operations - such as calculating the center of mass of the molecule. :: - - +-----------+ +-----------+ - | | | | - | 6 3 | | 3 | 6 - | ! ! | | ! | ! - |-5-8 1-2-| -> | 1-2-|-5-8 - | ! ! | | ! | ! - | 7 4 | | 4 | 7 - | | | | - +-----------+ +-----------+ - - - Parameters - ---------- - atomgroup : AtomGroup - The :class:`MDAnalysis.core.groups.AtomGroup` to work with. - The positions of this are modified in place. All these atoms - must belong in the same molecule or fragment. - reference_atom : :class:`~MDAnalysis.core.groups.Atom` - The atom around which all other atoms will be moved. - Defaults to atom 0 in the atomgroup. - - Raises - ------ - NoDataError - There are no bonds present. - (See :func:`~MDAnalysis.topology.core.guess_bonds`) - - ValueError - The algorithm fails to work. This is usually - caused by the atomgroup not being a single fragment. - (ie the molecule can't be traversed by following bonds) - - Note - ---- - Only orthogonal boxes are currently supported. - - Example - ------- - Make fragments whole:: - - from MDAnalysis.lib.mdamath import make_whole - - # This algorithm requires bonds, these can be guessed! - u = mda.Universe(......, guess_bonds=True) - - # MDAnalysis can split molecules into their fragments - # based on bonding information. - # Note that this function will only handle a single fragment - # at a time, necessitating a loop. - for frag in u.fragments: - make_whole(frag) - - Alternatively, to keep a single atom in place as the anchor:: - - # This will mean that atomgroup[10] will NOT get moved, - # and all other atoms will move (if necessary). - make_whole(atomgroup, reference_atom=atomgroup[10]) - - - .. versionadded:: 0.11.0 - """ - try: - b = atomgroup.bonds - except (AttributeError, NoDataError): - raise NoDataError("The atomgroup is required to have bonds") - - if reference_atom is None: - ref = atomgroup[0] - else: - ref = reference_atom - # Sanity check - if not ref in atomgroup: - raise ValueError("Reference atom not in atomgroup") - - # Check all of atomgroup is accessible from ref - if not util._is_contiguous(atomgroup.indices.astype(np.int32), - atomgroup.bonds.to_indices(), - ref.index): - raise ValueError("atomgroup not contiguous from bonds") - - # Not sure if this is actually a requirement... - # I think application of pbc would need to be changed for triclinic boxes - # but that's all? How does minimum bond length criteria change? - if not all(atomgroup.dimensions[3:] == 90.0): - raise ValueError("Non orthogonal boxes are not supported") - box = atomgroup.dimensions[:3] - - if all(box == 0.0): - raise ValueError("Supplied box had zero size") - - box_length = box.min() / 2.0 - - bondlengths = atomgroup.bonds.bonds(pbc=True) - if bondlengths.min() * 1.4 > box_length: - raise ValueError("Box lengths are too small relative to bond lengths") - - # All checks done, let's continue - # If bond lengths don't change after pbc applied, then no bonds - # straddle the box boundaries - if np.allclose(atomgroup.bonds.bonds(), bondlengths): - return - # Can't reuse this calculation of bond lengths as we're changing - # stuff as we go. - - processed = set() # Who have I already done? - ref_points = set([ref]) # Who is safe to use as reference point? - - ag_set = set(atomgroup) - nres = len(atomgroup) # total size of the problem - nloops = 0 - while len(ref_points) < nres: # While all atoms aren't correct - nloops += 1 - if nloops > nres: # To prevent infinite loop - # This point probable isn't reachable with the above _is_contiguous - # check, but better safe than sorry. - raise ValueError("Algorithm couldn't traverse atomgroup. " - "Perhaps the atomgroup isn't fully connected") - - # We want to iterate over atoms that are good to use as reference - # points, but haven't been processed yet. - todo = ref_points.difference(processed) - for atom in todo: - for b in atom.bonds: - other = b.partner(atom) - # Avoid atoms not in our scope - if other not in ag_set: - continue - if other in ref_points: - continue - if b.length(pbc=False) > box_length: - # Vector from ref atom to other - vec = other.position - ref.position - # Apply pbc to this vector - vec -= np.rint(vec/box) * box - # Define the position of other based on this vector - other.position = ref.position + vec - # This atom can now be used as a reference point - ref_points.add(other) - - processed.add(atom) - - def one_to_many_pointers(Ni, Nj, i2j): """Based on a many to one mapping of i to j, create the reverse mapping diff --git a/package/setup.py b/package/setup.py index cd5e3b0aaaa..4712e674d89 100755 --- a/package/setup.py +++ b/package/setup.py @@ -349,7 +349,8 @@ def extensions(config): cutil = MDAExtension('MDAnalysis.lib._cutil', sources=['MDAnalysis/lib/_cutil' + source_suffix], language='c++', - include_dirs=include_dirs, + libraries=mathlib, + include_dirs=include_dirs + ['MDAnalysis/lib/include'], define_macros=define_macros, extra_compile_args=cpp_extra_compile_args) diff --git a/testsuite/MDAnalysisTests/data/fullerene.pdb.gz b/testsuite/MDAnalysisTests/data/fullerene.pdb.gz new file mode 100644 index 0000000000000000000000000000000000000000..828096e83e76f05d49833a1c8f0d2835312f7a09 GIT binary patch literal 1074 zcmV-21kL*&iwFo7n>t$n17>w>Y-Ms~Ze=cTWMTlFm@#tWFbqZeoWd87M z%GYrm?e*`!KihM8*!N#vH^F2VE>8uADt&7X&F1_mqBzAVuPy z((e$YNF=3lI5Z0?NRdcN*G4|0i5CB@YiULnH9LpQH=B_)$j%{a%VuP~#pRHt zU^B8j;&LcI_XT#Gs~4-pW=v~6T}aE4(zWU+CN*uq`i_##9E<9^m-(gx*1&f!Ys(z5 z-oB$)iZu~hbrj3a)v^_Q_p(Y{5-aDsSMye{x}$Wvx6-`tDAiKR)uGG0P9^iS;k#Go sQe`H}ca$!rD7n4^=(RM!x@4F6X)N_x*R{O7ef)a)4+wRQCR7;!01oT+9RL6T literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 704efeb52cf..b616f8e4870 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -130,6 +130,7 @@ "waterPSF","waterDCD","rmsfArray", "HoomdXMLdata", "Make_Whole", # for testing the function lib.mdamath.make_whole, has 9 atoms + "fullerene", # for make_whole, a nice friendly C60 with bonds "Plength", "COORDINATES_XYZ", "COORDINATES_XYZ_BZ2", @@ -395,6 +396,7 @@ HoomdXMLdata = resource_filename(__name__, 'data/C12x64.xml.bz2') Make_Whole = resource_filename(__name__, 'data/make_whole.gro') +fullerene = resource_filename(__name__, 'data/fullerene.pdb.gz') Plength = resource_filename(__name__, 'data/plength.gro') Martini_membrane_gro = resource_filename(__name__, 'data/martini_dppc_chol_bilayer.gro') diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index 6a0abcf2009..abbf78a0148 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -39,7 +39,7 @@ from MDAnalysis.exceptions import NoDataError, DuplicateWarning -from MDAnalysisTests.datafiles import Make_Whole +from MDAnalysisTests.datafiles import Make_Whole, TPR, GRO, fullerene def convert_aa_code_long_data(): @@ -239,6 +239,8 @@ class TestMakeWhole(object): +-----------+ """ + prec = 5 + @pytest.fixture() def universe(self): universe = mda.Universe(Make_Whole) @@ -258,25 +260,11 @@ def test_no_bonds(self): with pytest.raises(NoDataError): mdamath.make_whole(ag) - def test_not_orthogonal(self, universe, ag): - # Not an orthogonal unit cell - - universe.dimensions = [10., 10., 10., 80., 80., 80] - with pytest.raises(ValueError): - mdamath.make_whole(ag) - def test_zero_box_size(self, universe, ag): universe.dimensions = [0., 0., 0., 90., 90., 90.] with pytest.raises(ValueError): mdamath.make_whole(ag) - def test_too_small_box_size(self, universe, ag): - # Set the z dimensions to 0.5, which is small compared to the - # bonds (1-2) - universe.dimensions = [100.0, 100.0, 0.5, 90., 90., 90.] - with pytest.raises(ValueError): - mdamath.make_whole(ag) - def test_wrong_reference_atom(self, universe, ag): # Reference atom not in atomgroup with pytest.raises(ValueError): @@ -287,20 +275,6 @@ def test_impossible_solve(self, universe): with pytest.raises(ValueError): mdamath.make_whole(universe.atoms) - def test_walk_1(self, universe, ag): - # self.ag is contiguous - assert util._is_contiguous( - ag.atoms.ix.astype(np.int32), - ag.bonds.to_indices(), - universe.residues[0].atoms[0].index) - - def test_walk_2(self, universe): - # u.atoms isnt all contiguous - assert not util._is_contiguous( - universe.atoms.ix.astype(np.int32), - universe.atoms.bonds.to_indices(), - universe.residues[0].atoms[0].index) - def test_solve_1(self, universe, ag): # regular usage of function @@ -310,13 +284,13 @@ def test_solve_1(self, universe, ag): assert_array_almost_equal(universe.atoms[:4].positions, refpos) assert_array_almost_equal(universe.atoms[4].position, - np.array([110.0, 50.0, 0.0])) + np.array([110.0, 50.0, 0.0]), decimal=self.prec) assert_array_almost_equal(universe.atoms[5].position, - np.array([110.0, 60.0, 0.0])) + np.array([110.0, 60.0, 0.0]), decimal=self.prec) assert_array_almost_equal(universe.atoms[6].position, - np.array([110.0, 40.0, 0.0])) + np.array([110.0, 40.0, 0.0]), decimal=self.prec) assert_array_almost_equal(universe.atoms[7].position, - np.array([120.0, 50.0, 0.0])) + np.array([120.0, 50.0, 0.0]), decimal=self.prec) def test_solve_2(self, universe, ag): # use but specify the center atom @@ -327,13 +301,13 @@ def test_solve_2(self, universe, ag): assert_array_almost_equal(universe.atoms[4:8].positions, refpos) assert_array_almost_equal(universe.atoms[0].position, - np.array([-20.0, 50.0, 0.0])) + np.array([-20.0, 50.0, 0.0]), decimal=self.prec) assert_array_almost_equal(universe.atoms[1].position, - np.array([-10.0, 50.0, 0.0])) + np.array([-10.0, 50.0, 0.0]), decimal=self.prec) assert_array_almost_equal(universe.atoms[2].position, - np.array([-10.0, 60.0, 0.0])) + np.array([-10.0, 60.0, 0.0]), decimal=self.prec) assert_array_almost_equal(universe.atoms[3].position, - np.array([-10.0, 40.0, 0.0])) + np.array([-10.0, 40.0, 0.0]), decimal=self.prec) def test_solve_3(self, universe): # put in a chunk that doesn't need any work @@ -369,6 +343,31 @@ def test_double_frag_short_bonds(self, universe, ag): with pytest.raises(ValueError): mdamath.make_whole(universe.atoms) + def test_make_whole_triclinic(self): + u = mda.Universe(TPR, GRO) + thing = u.select_atoms('not resname SOL NA+') + mdamath.make_whole(thing) + + blengths = thing.bonds.values() + + assert blengths.max() < 2.0 + + def test_make_whole_fullerene(self): + # lots of circular bonds as a nice pathological case + u = mda.Universe(fullerene) + + bbox = u.atoms.bbox() + u.dimensions[:3] = bbox[1] - bbox[0] + u.dimensions[3:] = 90.0 + + blengths = u.atoms.bonds.values() + # kaboom + u.atoms[::2].translate([u.dimensions[0], -2 * u.dimensions[1], 0.0]) + u.atoms[1::2].translate([0.0, 7 * u.dimensions[1], -5 * u.dimensions[2]]) + + mdamath.make_whole(u.atoms) + + assert_array_almost_equal(u.atoms.bonds.values(), blengths, decimal=self.prec) class Class_with_Caches(object): def __init__(self): From 5ed599f1ffb47dff76257a1e9831a68e512d7286 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Fri, 6 Jul 2018 22:33:30 +0100 Subject: [PATCH 195/455] updated tests --- testsuite/MDAnalysisTests/transformations/test_rotate.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 20d82a765fc..f22e7771770 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -120,7 +120,7 @@ def test_rotateby_atomgroup_cog_pbc(rotate_universes): center_pos = selection.center_of_geometry(pbc=True) matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] ref.positions = np.dot(ref.positions, matrix) - transformed = rotateby(angle, vector, ag=selection, center='geometry', pbc=True)(trans) + transformed = rotateby(angle, vector, ag=selection, center='geometry', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_com_pbc(rotate_universes): @@ -136,7 +136,7 @@ def test_rotateby_atomgroup_com_pbc(rotate_universes): center_pos = selection.center_of_mass(pbc=True) matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] ref.positions = np.dot(ref.positions, matrix) - transformed = rotateby(angle, vector, ag=selection, center='mass', pbc=True)(trans) + transformed = rotateby(angle, vector, ag=selection, center='mass', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_bad_ag(rotate_universes): @@ -169,7 +169,7 @@ def test_rotateby_bad_pbc(rotate_universes): angle = 90 vector = [0, 0, 1] with pytest.raises(ValueError): - rotateby(angle, vector, ag = ag, pbc=True)(ts) + rotateby(angle, vector, ag = ag, wrap=True)(ts) def test_rotateby_bad_center(rotate_universes): # this universe as a box size zero From 5595681741c1b1b4855d44f7073a7ce339916086 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Tue, 12 Jun 2018 12:34:24 +0200 Subject: [PATCH 196/455] Frame iterables returned when indexing trajectories Replaces the iterators returned by the proto reader __getitem__ by an iterable class. That class has a __len__ method to adress #1894. In the current implementation, each type of input for the proto reader's __getitem__ returns a different class. This allow to test for the correct behavior only once. Ideally, the iterables should be imutable to avoid inconsistencies. Fixes #1894 --- package/MDAnalysis/coordinates/__init__.py | 9 +- package/MDAnalysis/coordinates/base.py | 237 ++++++++++++++++-- .../coordinates/test_reader_api.py | 91 ++++++- 3 files changed, 315 insertions(+), 22 deletions(-) diff --git a/package/MDAnalysis/coordinates/__init__.py b/package/MDAnalysis/coordinates/__init__.py index 6246672c589..2706f492151 100644 --- a/package/MDAnalysis/coordinates/__init__.py +++ b/package/MDAnalysis/coordinates/__init__.py @@ -502,7 +502,7 @@ class can choose an appropriate reader automatically. ``__getitem__(arg)`` advance to time step `arg` = `frame` and return :class:`Timestep`; or if `arg` is a - slice, then return an iterator over that part of the trajectory. + slice, then return an iterable over that part of the trajectory. The first functionality allows one to randomly access frames in the trajectory:: @@ -524,6 +524,9 @@ class can choose an appropriate reader automatically. The last example starts reading the trajectory at frame 1000 and reads every 100th frame until the end. + A sequence of indices or a mask of booleans can also be provided to index + a trajectory. + The performance of the ``__getitem__()`` method depends on the underlying trajectory reader and if it can implement random access to frames. In many cases this is not easily (or reliably) implementable and thus one is @@ -537,6 +540,10 @@ class can choose an appropriate reader automatically. :class:`MDAnalysis.coordinates.base.ProtoReader.__iter__` (which is always implemented) and other slices raise :exc:`TypeError`. + When indexed with a slice, a sequence of indices, or a mask of booleans, + the return value is an instance of :class:`FrameIteratorSliced` or + :class:`FrameIteratorIndices`. + ``parse_n_atoms(filename, **kwargs)`` Provide the number of atoms in the trajectory file, allowing the Reader to be used to provide an extremely minimal Topology. diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index 859f7a29c80..0add0954e3f 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -859,6 +859,205 @@ def time(self): del self.data['time'] +class FrameIteratorBase(object): + """ + Base iterable over the frames of a trajectory. + + A frame iterable has a length that can be accessed with the :func:`len` + function, and can be indexed similarly to a full trajectory. When indexed, + indices are resolved relative to the iterable and not relative to the + trajectory. + + Parameters + ---------- + trajectory: ProtoReader + The trajectory over which to iterate. + + .. versionadded:: 0.19.0 + + """ + def __init__(self, trajectory): + self._trajectory = trajectory + + def __len__(self): + raise NotImplementedError() + + @staticmethod + def _avoid_bool_list(frames): + if isinstance(frames, list) and frames and isinstance(frames[0], bool): + return np.array(frames, dtype=bool) + return frames + + @property + def trajectory(self): + return self._trajectory + + +class FrameIteratorSliced(FrameIteratorBase): + """ + Iterable over the frames of a trajectory on the basis of a slice. + + Parameters + ---------- + trajectory: ProtoReader + The trajectory over which to iterate. + frames: slice + A slice to select the frames of interest. + + See Also + -------- + FrameIteratorBase + + .. versionadded:: 0.19.0 + + """ + def __init__(self, trajectory, frames): + # It would be easier to store directly a range object, as it would + # store its parameters in a single place, calculate its length, and + # take care of most the indexing. Though, doing so is not compatible + # with python 2 where xrange (or range with six) is only an iterator. + super(FrameIteratorSliced, self).__init__(trajectory) + self._start, self._stop, self._step = trajectory.check_slice_indices( + frames.start, frames.stop, frames.step, + ) + + def __len__(self): + start, stop, step = self.start, self.stop, self.step + if (step > 0 and start < stop): + # We go from a lesser number to a larger one. + return int(1 + (stop - 1 - start) // step) + elif (step < 0 and start > stop): + # We count backward from a larger number to a lesser one. + return int(1 + (start - 1 - stop) // (-step)) + else: + # The range is empty. + return 0 + + def __iter__(self): + for i in range(self.start, self.stop, self.step): + yield self.trajectory._read_frame_with_aux(i) + self.trajectory.rewind() + + def __getitem__(self, frame): + if isinstance(frame, numbers.Integral): + length = len(self) + if not -length < frame < length: + raise IndexError('Index {} is out of range of the range of length {}.' + .format(frame, length)) + if frame < 0: + frame = len(self) + frame + frame = self.start + frame * self.step + return self.trajectory._read_frame_with_aux(frame) + elif isinstance(frame, slice): + start = self.start + (frame.start or 0) * self.step + if frame.stop is None: + stop = self.stop + else: + stop = self.start + (frame.stop or 0) * self.step + step = (frame.step or 1) * self.step + + if step > 0: + start = max(0, start) + else: + stop = max(0, stop) + + new_slice = slice(start, stop, step) + return FrameIteratorSliced(self.trajectory, new_slice) + else: + # Indexing with a lists of bools does not behave the same in all + # version of numpy. + frame = self._avoid_bool_list(frame) + frames = np.array(list(range(self.start, self.stop, self.step)))[frame] + return FrameIteratorIndices(self.trajectory, frames) + + @property + def start(self): + return self._start + + @property + def stop(self): + return self._stop + + @property + def step(self): + return self._step + + +class FrameIteratorAll(FrameIteratorBase): + """ + Iterable over all the frames of a trajectory. + + Parameters + ---------- + trajectory: ProtoReader + The trajectory over which to iterate. + + See Also + -------- + FrameIteratorBase + + .. versionadded:: 0.19.0 + + """ + def __init__(self, trajectory): + super(FrameIteratorAll, self).__init__(trajectory) + + def __len__(self): + return self.trajectory.n_frames + + def __iter__(self): + return iter(self.trajectory) + + def __getitem__(self, frame): + return self.trajectory[frame] + + +class FrameIteratorIndices(FrameIteratorBase): + """ + Iterable over the frames of a trajectory listed in a sequence of indices. + + Parameters + ---------- + trajectory: ProtoReader + The trajectory over which to iterate. + frames: sequence + A sequence of indices. + + See Also + -------- + FrameIteratorBase + """ + def __init__(self, trajectory, frames): + super(FrameIteratorIndices, self).__init__(trajectory) + self._frames = [] + for frame in frames: + if not isinstance(frame, numbers.Integral): + raise TypeError("Frames indices must be integers.") + frame = trajectory._apply_limits(frame) + self._frames.append(frame) + self._frames = tuple(self._frames) + + def __len__(self): + return len(self.frames) + + def __iter__(self): + for frame in self.frames: + yield self.trajectory._read_frame_with_aux(frame) + + def __getitem__(self, frame): + if isinstance(frame, numbers.Integral): + frame = self.frames[frame] + return self.trajectory._read_frame_with_aux(frame) + else: + frame = self._avoid_bool_list(frame) + frames = np.array(self.frames)[frame] + return FrameIteratorIndices(self.trajectory, frames) + + @property + def frames(self): + return self._frames + + class IOBase(object): """Base class bundling common functionality for trajectory I/O. @@ -1299,6 +1498,14 @@ def _reopen(self): """ pass + def _apply_limits(self, frame): + if frame < 0: + frame += len(self) + if frame < 0 or frame >= len(self): + raise IndexError("Index {} exceeds length of trajectory ({})." + "".format(frame, len(self))) + return frame + def __getitem__(self, frame): """Return the Timestep corresponding to *frame*. @@ -1312,17 +1519,8 @@ def __getitem__(self, frame): ---- *frame* is a 0-based frame index. """ - - def apply_limits(frame): - if frame < 0: - frame += len(self) - if frame < 0 or frame >= len(self): - raise IndexError("Index {} exceeds length of trajectory ({})." - "".format(frame, len(self))) - return frame - if isinstance(frame, numbers.Integral): - frame = apply_limits(frame) + frame = self._apply_limits(frame) return self._read_frame_with_aux(frame) elif isinstance(frame, (list, np.ndarray)): if isinstance(frame[0], (bool, np.bool_)): @@ -1331,20 +1529,21 @@ def apply_limits(frame): # Convert bool array to int array frame = np.arange(len(self))[frame] - def listiter(frames): - for f in frames: - if not isinstance(f, numbers.Integral): - raise TypeError("Frames indices must be integers") - yield self._read_frame_with_aux(apply_limits(f)) - - return listiter(frame) + #def listiter(frames): + # for f in frames: + # if not isinstance(f, numbers.Integral): + # raise TypeError("Frames indices must be integers") + # yield self._read_frame_with_aux(apply_limits(f)) + # + #return listiter(frame) + return FrameIteratorIndices(self, frame) elif isinstance(frame, slice): start, stop, step = self.check_slice_indices( frame.start, frame.stop, frame.step) if start == 0 and stop == len(self) and step == 1: - return self.__iter__() + return FrameIteratorAll(self) else: - return self._sliced_iter(start, stop, step) + return FrameIteratorSliced(self, frame) else: raise TypeError("Trajectories must be an indexed using an integer," " slice or list of indices") diff --git a/testsuite/MDAnalysisTests/coordinates/test_reader_api.py b/testsuite/MDAnalysisTests/coordinates/test_reader_api.py index 6f236b3e2ac..60e4f0889d9 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_reader_api.py +++ b/testsuite/MDAnalysisTests/coordinates/test_reader_api.py @@ -59,6 +59,10 @@ def _read_next_timestep(self): return self.ts def _read_frame(self, frame): + if frame < 0: + frame = self.n_frames + frame + if not (0 <= frame < self.n_frames): + raise IOError self.ts.frame = frame return self.ts @@ -149,6 +153,8 @@ class TestMultiFrameReader(_Multi): (2, 5, None), # start & end (None, None, 2), # set skip (None, None, -1), # backwards skip + (None, -1, -1), + (10, 0, -1), (0, 10, 1), (0, 10, 2), (None, 20, None), # end beyond real end @@ -187,7 +193,6 @@ def sl(): with pytest.raises(TypeError): sl() - @pytest.mark.parametrize('slice_cls', [list, np.array]) @pytest.mark.parametrize('sl', [ [0, 1, 4, 5], @@ -207,6 +212,76 @@ def test_getitem(self, slice_cls, sl, reader): assert_equal(res, ref) + @pytest.mark.parametrize('sl', [ + [0, 1, 2, 3], # ordered list of indices without duplicates + [1, 3, 4, 2, 9], # disordered list of indices without duplicates + [0, 1, 1, 2, 2, 2], # ordered list with duplicates + [-1, -2, 3, -1, 0], # disordered list with duplicates + [True, ] * 10, + [False, ] * 10, + [True, False, ] * 5, + slice(None, None, None), + slice(0, 10, 1), + slice(None, None, -1), + slice(10, 0, -1), + slice(2, 7, 2), + slice(7, 2, -2), + ]) + def test_getitem_len(self, sl, reader): + traj_iterable = reader[sl] + if not isinstance(sl, slice): + sl = np.array(sl) + ref = self.reference[sl] + assert len(traj_iterable) == len(ref) + + # All the sl1 slice must be 5 frames long so that the sl2 can be a mask + @pytest.mark.parametrize('sl1', [ + [0, 1, 2, 3, 4], + [1, 1, 1, 1, 1], + [True, False, ] * 5, + slice(None, None, 2), + slice(None, None, -2), + ]) + @pytest.mark.parametrize('sl2', [ + [0, -1, 2], + [-1,-1, -1], + [True, False, True, True, False], + np.array([True, False, True, True, False]), + slice(None, None, None), + slice(None, 3, None), + slice(4, 0, -1), + ]) + def test_double_getitem(self, sl1, sl2, reader): + traj_iterable = reader[sl1][sl2] + # Old versions of numpy do not behave the same when indexing with a + # list or with an array. + if not isinstance(sl1, slice): + sl1 = np.asarray(sl1) + if not isinstance(sl2, slice): + sl2 = np.asarray(sl2) + print(sl1, sl2, type(sl1), type(sl2)) + ref = self.reference[sl1][sl2] + res = [ts.frame for ts in traj_iterable] + assert_equal(res, ref) + assert len(traj_iterable) == len(ref) + + @pytest.mark.parametrize('sl1', [ + [0, 1, 2, 3, 4], + [1, 1, 1, 1, 1], + [True, False, ] * 5, + slice(None, None, 2), + slice(None, None, -2), + ]) + @pytest.mark.parametrize('idx2', [0, 2, 4, -1, -2, -4]) + def test_double_getitem_int(self, sl1, idx2, reader): + ts = reader[sl1][idx2] + # Old versions of numpy do not behave the same when indexing with a + # list or with an array. + if not isinstance(sl1, slice): + sl1 = np.asarray(sl1) + ref = self.reference[sl1][idx2] + assert ts.frame == ref + def test_list_TE(self, reader): def sl(): return list(reader[[0, 'a', 5, 6]]) @@ -214,7 +289,6 @@ def sl(): with pytest.raises(TypeError): sl() - def test_array_TE(self, reader): def sl(): return list(reader[np.array([1.2, 3.4, 5.6])]) @@ -222,6 +296,19 @@ def sl(): with pytest.raises(TypeError): sl() + @pytest.mark.parametrize('sl1', [ + [0, 1, 2, 3, 4], + [1, 1, 1, 1, 1], + [True, False, ] * 5, + slice(None, None, 2), + slice(None, None, -2), + ]) + @pytest.mark.parametrize('idx2', [5, -6]) + def test_getitem_IE(self, sl1, idx2, reader): + partial_reader = reader[sl1] + with pytest.raises(IndexError): + partial_reader[idx2] + class _Single(_TestReader): n_frames = 1 From 15222e3588bfb25390b15edb4851e82a3d6920db Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sun, 17 Jun 2018 09:34:07 +0200 Subject: [PATCH 197/455] Fixes #1944 --- package/MDAnalysis/coordinates/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index 0add0954e3f..28bd3ede310 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -1663,7 +1663,7 @@ def check_slice_indices(self, start, stop, step): if start < 0: start = 0 - if step < 0 and start > nframes: + if step < 0 and start >= nframes: start = nframes - 1 if stop is None: From 1ef80100577f8dc5457679ea17460e37413b56b5 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sun, 8 Jul 2018 13:22:42 +0200 Subject: [PATCH 198/455] Allow ag.write to write trajectory and selected frames Fixes #1037 --- package/MDAnalysis/coordinates/base.py | 5 ++ package/MDAnalysis/core/groups.py | 55 +++++++++++++++---- .../MDAnalysisTests/core/test_atomgroup.py | 48 +++++++++++++++- 3 files changed, 96 insertions(+), 12 deletions(-) diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index 28bd3ede310..34e79e02135 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -1450,6 +1450,11 @@ def time(self): """ return self.ts.time + @property + def trajectory(self): + # Makes a reader effectively commpatible with a FrameIteratorBase + return self + def Writer(self, filename, **kwargs): """A trajectory writer with the same properties as this trajectory.""" raise NotImplementedError( diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 68217167934..6bddd71f9f3 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -2531,7 +2531,7 @@ def improper(self): return topologyobjects.ImproperDihedral(self.ix, self.universe) def write(self, filename=None, file_format="PDB", - filenamefmt="{trjname}_{frame}", **kwargs): + filenamefmt="{trjname}_{frame}", frames=None, **kwargs): """Write `AtomGroup` to a file. The output can either be a coordinate file or a selection, depending on @@ -2554,19 +2554,46 @@ def write(self, filename=None, file_format="PDB", ``"conect"``: write only the CONECT records defined in the original file. ``"all"``: write out all bonds, both the original defined and those guessed by MDAnalysis. ``None``: do not write out bonds. - Default os ``"conect"``. + Default is ``"conect"``. + frames: + An ensemble of frames to write. The ensemble can be an list or + array of frame indices, a mask of booleans, an instance of + :class:`slice`, or an indexed trajectory. By default, 'frames' is + set to ``None`` and only the current frame is written. .. versionchanged:: 0.9.0 Merged with write_selection. This method can now write both selections out. + .. versionchanged:: 0.19.0 + Can write multiframe trajectories with the 'frames' argument. """ # check that AtomGroup actually has any atoms (Issue #434) if len(self.atoms) == 0: raise IndexError("Cannot write an AtomGroup with 0 atoms") trj = self.universe.trajectory # unified trajectory API - - if trj.n_frames == 1: + if frames is None: + trj_frames = trj[::] + else: + try: + test_trajectory = frames.trajectory + except AttributeError: + trj_frames = trj[frames] + else: + if test_trajectory is not trj: + raise ValueError( + 'The trajectory of {} provided to the frames keyword ' + 'attribute is different from the trajectory of the ' + 'AtomGroup.'.format(frames) + ) + trj_frames = frames + if len(trj_frames) > 1 and kwargs.get("multiframe") == False: + raise ValueError( + 'Cannot explicitely set "multiframe" to False and request ' + 'more than 1 frame with the "frames" keyword argument.' + ) + + if len(trj_frames) == 1: kwargs.setdefault("multiframe", False) if filename is None: @@ -2590,23 +2617,29 @@ def write(self, filename=None, file_format="PDB", writer = get_writer_for(filename, format=format, multiframe=multiframe) #MDAnalysis.coordinates.writer(filename, **kwargs) - coords = True except (ValueError, TypeError): - coords = False + pass + else: + with writer(filename, n_atoms=self.n_atoms, **kwargs) as w: + if frames is None: + w.write(self.atoms) + else: + for _ in trj_frames: + w.write(self.atoms) + return try: # here `file_format` is only used as default, # anything pulled off `filename` will be used preferentially writer = get_selection_writer_for(filename, file_format) - selection = True except (TypeError, NotImplementedError): - selection = False - - if not (coords or selection): - raise ValueError("No writer found for format: {}".format(filename)) + pass else: with writer(filename, n_atoms=self.n_atoms, **kwargs) as w: w.write(self.atoms) + return + + raise ValueError("No writer found for format: {}".format(filename)) class ResidueGroup(GroupBase): diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index c5e88fb4d97..4c98d4beeee 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -30,6 +30,7 @@ from numpy.testing import ( assert_almost_equal, assert_equal, + assert_array_almost_equal, ) import MDAnalysis as mda @@ -111,7 +112,7 @@ def test_write_no_args(self, u, tmpdir): name = path.splitext(path.basename(DCD))[0] assert_equal(files[0], "{}_0.pdb".format(name)) - def test_raises(self, u, tmpdir): + def test_raises_unknown_format(self, u, tmpdir): with tmpdir.as_cwd(): with pytest.raises(ValueError): u.atoms.write('useless.format123') @@ -120,6 +121,51 @@ def test_write_coordinates(self, u, tmpdir): with tmpdir.as_cwd(): u.atoms.write("test.xtc") + @pytest.mark.parametrize('frames', ( + [4], + [2, 3, 3, 1], + slice(2, 6, 1), + )) + def test_write_frames(self, u, tmpdir, frames): + destination = str(tmpdir / 'test.dcd') + selection = u.trajectory[frames] + ref_positions = np.stack([ts.positions for ts in selection]) + u.atoms.write(destination, frames=frames) + + u_new = mda.Universe(destination) + new_positions = np.stack([ts.positions for ts in u_new.trajectory]) + + assert_array_almost_equal(new_positions, ref_positions) + + @pytest.mark.parametrize('frames', ( + [4], + [2, 3, 3, 1], + slice(2, 6, 1), + )) + def test_write_frame_iterator(self, u, tmpdir, frames): + destination = str(tmpdir / 'test.dcd') + selection = u.trajectory[frames] + ref_positions = np.stack([ts.positions for ts in selection]) + u.atoms.write(destination, frames=selection) + + u_new = mda.Universe(destination) + new_positions = np.stack([ts.positions for ts in u_new.trajectory]) + + assert_array_almost_equal(new_positions, ref_positions) + + def test_incompatible_arguments(self, u, tmpdir): + destination = str(tmpdir / 'test.dcd') + with pytest.raises(ValueError): + u.atoms.write(destination, frames=[0, 1, 2], multiframe=False) + + def test_incompatible_trajectories(self, tmpdir): + destination = str(tmpdir / 'test.dcd') + u1 = make_Universe(trajectory=True) + u2 = make_Universe(trajectory=True) + destination = str(tmpdir / 'test.dcd') + with pytest.raises(ValueError): + u1.atoms.write(destination, frames=u2.trajectory) + def test_write_selection(self, u, tmpdir): with tmpdir.as_cwd(): u.atoms.write("test.vmd") From 65423742a59ac11b4da12558242f3675d80827f0 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Tue, 3 Jul 2018 16:27:17 +0200 Subject: [PATCH 199/455] Update changelog --- package/CHANGELOG | 3 +++ package/MDAnalysis/coordinates/base.py | 8 -------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index d54408d699a..2010db12ca0 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -45,6 +45,7 @@ Enhancements * ChainReader can correctly handle continuous trajectories split into multiple files, generated with gromacs -noappend (PR #1728) * MDAnalysis.lib.mdamath now supports triclinic boxes and rewrote in Cython (PR #1965) + * AtomGroup.write can write a trajectory of selected frames (Issue #1037) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) @@ -70,6 +71,8 @@ Changes *Group.unique will always return the same object unless the group is updated or modified. (PR #1922) * The TPR parser reads SETTLE constraints as bonds. (Issue #1949) + * Indexing a trajectory with a slice or an array now returns an iterable + (Issue #1894) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index 34e79e02135..ca64969d289 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -1533,14 +1533,6 @@ def __getitem__(self, frame): frame = np.asarray(frame, dtype=np.bool) # Convert bool array to int array frame = np.arange(len(self))[frame] - - #def listiter(frames): - # for f in frames: - # if not isinstance(f, numbers.Integral): - # raise TypeError("Frames indices must be integers") - # yield self._read_frame_with_aux(apply_limits(f)) - # - #return listiter(frame) return FrameIteratorIndices(self, frame) elif isinstance(frame, slice): start, stop, step = self.check_slice_indices( From 67425318f688b40d6f208eff2ecfeb6f11aad0c2 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 7 Jul 2018 17:10:57 -0500 Subject: [PATCH 200/455] fixes Issue #1974 zero length TG now behave properly --- package/CHANGELOG | 2 ++ package/MDAnalysis/core/topologyobjects.py | 29 +++++++++---------- .../core/test_topologyobjects.py | 12 ++++++++ testsuite/MDAnalysisTests/lib/test_util.py | 13 +++++++++ 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index d54408d699a..f667c4c1245 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -59,6 +59,8 @@ Fixes pack_into_box() (Issue #1911) * Fixed format of MODEL number in PDB file writing (Issue #1950) * PDBWriter now properly sets start value + * Zero length TopologyGroup now return proper shape array via to_indices + (Issue #1974) Changes * TopologyAttrs are now statically typed (Issue #1876) diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index 0844efa987e..a118d3c522a 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -466,6 +466,9 @@ def __contains__(self, other): return other in self.dict or other[::-1] in self.dict +_BTYPE_TO_SHAPE = {'bond': 2, 'angle': 3, 'dihedral': 4, 'improper': 4} + + class TopologyGroup(object): """A container for a groups of bonds. @@ -515,6 +518,9 @@ class TopologyGroup(object): .. versionchanged:: 0.11.0 Added `values` method to return the size of each object in this group Deprecated selectBonds method in favour of select_bonds + .. versionchanged:: 0.18.1 + Empty TopologyGroup now returns correctly shaped empty array via + indices property and to_indices() """ _allowed_types = {'bond', 'angle', 'dihedral', 'improper'} @@ -546,12 +552,6 @@ def __init__(self, bondidx, universe, btype=None, type=None, guessed=None, if order is None: order = np.repeat(None, nbonds).reshape(nbonds, 1) - # TODO: why has this been defined? - split_index = {'bond': 2, - 'angle': 3, - 'dihedral': 4, - 'improper': 4}[self.btype] - if nbonds > 0: uniq, uniq_idx = util.unique_rows(bondidx, return_index=True) @@ -655,7 +655,12 @@ def indices(self): -------- to_indices : function that just returns `indices` """ - return self._bix + if not self: + # empty TG + shape = _BTYPE_TO_SHAPE[self.btype] + return np.zeros((0, shape), dtype=np.int32) + else: + return self._bix def to_indices(self): """Return a data structure with atom indices describing the bonds. @@ -807,10 +812,7 @@ def atom3(self): try: return self._ags[2] except IndexError: - nvert = {'bond': 2, - 'angle': 3, - 'dihedral': 4, - 'improper': 4}[self.btype] + nvert = _BTYPE_TO_SHAPE[self.btype] raise IndexError("TopologyGroup of {}s only has {} vertical AtomGroups" "".format(self.btype, nvert)) @@ -820,10 +822,7 @@ def atom4(self): try: return self._ags[3] except IndexError: - nvert = {'bond': 2, - 'angle': 3, - 'dihedral': 4, - 'improper': 4}[self.btype] + nvert = _BTYPE_TO_SHAPE[self.btype] raise IndexError("TopologyGroup of {}s only has {} vertical AtomGroups" "".format(self.btype, nvert)) diff --git a/testsuite/MDAnalysisTests/core/test_topologyobjects.py b/testsuite/MDAnalysisTests/core/test_topologyobjects.py index 244771bcfd0..cf260134272 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyobjects.py +++ b/testsuite/MDAnalysisTests/core/test_topologyobjects.py @@ -720,3 +720,15 @@ def test_cross_universe_eq(): u2 = mda.Universe(PSF) assert not (u1.bonds[0] == u2.bonds[0]) + +def test_zero_size_TG_indices(): + u = mda.Universe.empty(10) + + u.add_TopologyAttr('bonds', values=[(1, 2), (2, 3)]) + + ag = u.atoms[[0]] + + idx = ag.bonds.to_indices() + + assert idx.shape == (0, 3) + assert idx.dtype == np.int32 diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index abbf78a0148..fa1db74dc43 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -248,6 +248,19 @@ def universe(self): universe.add_TopologyAttr(Bonds(bondlist)) return universe + def test_single_atom_no_bonds(self): + # Call make_whole on single atom with no bonds, shouldn't move + u = mda.Universe(Make_Whole) + # Atom0 is isolated + bondlist = [(1, 2), (1, 3), (1, 4), (4, 5), (4, 6), (4, 7)] + u.add_TopologyAttr(Bonds(bondlist)) + + ag = u.atoms[[0]] + refpos = ag.positions.copy() + mdamath.make_whole(ag) + + assert_array_almost_equal(ag.positions, refpos) + @staticmethod @pytest.fixture() def ag(universe): From 10685787f641fbab6ece1349b85df3551aad4948 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 10 Jul 2018 18:15:05 -0700 Subject: [PATCH 201/455] Modified Changelog --- package/CHANGELOG | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index d54408d699a..0f72cd2cb7d 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,12 +14,14 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, - VOD555, davidercruz, jbarnoud + VOD555, davidercruz, jbarnoud, ayushsuhane * 0.18.1 Enhancements + * Added capped_distance function for automatic selection of + distance evaluation method (PR #1941) * Added a rotation coordinate transformation (PR #1937) * Added a box centering trajectory transformation (PR #1946) * Added a on-the-fly trajectory transformations API and a coordinate translation From a8016fd010f8a39a2a8e010858f3a87dbaa873f3 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Wed, 11 Jul 2018 01:21:17 -0700 Subject: [PATCH 202/455] switched from coverall to codecov fix ##1445 (and restores full coverage reporting) --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ec7592a6efc..24d19d8ca6c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,14 +21,14 @@ env: # Set default python version to avoid repetition later - PYTHON_VERSION=3.5 - BUILD_DOCS=false - - COVERALLS=false + - CODECOV=false - PYTEST_FLAGS="--disable-pytest-warnings --numprocesses 2 --durations=50" - PYTEST_LIST="testsuite/MDAnalysisTests" - MAIN_CMD="pytest ${PYTEST_LIST}" - SETUP_CMD="${PYTEST_FLAGS}" - BUILD_CMD="pip install -v package/ && pip install testsuite/" - - CONDA_MIN_DEPENDENCIES="mmtf-python mock six biopython networkx cython joblib matplotlib scipy griddataformats hypothesis gsd" - - CONDA_DEPENDENCIES="${CONDA_MIN_DEPENDENCIES} seaborn>=0.7.0 clustalw=2.1 netcdf4 scikit-learn coveralls" + - CONDA_MIN_DEPENDENCIES="mmtf-python mock six biopython networkx cython joblib matplotlib scipy griddataformats hypothesis gsd codecov" + - CONDA_DEPENDENCIES="${CONDA_MIN_DEPENDENCIES} seaborn>=0.7.0 clustalw=2.1 netcdf4 scikit-learn" - CONDA_CHANNELS='biobuilds conda-forge' - CONDA_CHANNEL_PRIORITY=True - PIP_DEPENDENCIES="duecredit sphinx-sitemap" @@ -37,7 +37,7 @@ env: matrix: # Run a coverage test - - COVERALLS="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" + - CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - PYTHON_VERSION=3.6 - PYTHON_VERSION=3.4 - PYTHON_VERSION=2.7 @@ -104,8 +104,8 @@ script: after_success: - | - if [[ $COVERALLS == 'true' ]]; then \ - coveralls; \ + if [[ $CODECOV == 'true' ]]; then \ + codecov; \ fi # can't use test here since this leads to travis fails even though the build passes - if [[ ${TRAVIS_PULL_REQUEST} == "false" ]] && [[ ${BUILD_DOCS} == "true" ]] && [[ ${TRAVIS_BRANCH} == ${GH_DOC_BRANCH} ]]; then From 0b02e16724f4dec1098907c62c51fc16c747c2ab Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Wed, 11 Jul 2018 02:25:19 -0700 Subject: [PATCH 203/455] generate coverage for python 2.7 - merge coverage for 2.7 and 3.5 with codecov - only install sphinx-sitemap (and sphinx) for the doc building target --- .travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 24d19d8ca6c..414dfde220c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,16 +31,16 @@ env: - CONDA_DEPENDENCIES="${CONDA_MIN_DEPENDENCIES} seaborn>=0.7.0 clustalw=2.1 netcdf4 scikit-learn" - CONDA_CHANNELS='biobuilds conda-forge' - CONDA_CHANNEL_PRIORITY=True - - PIP_DEPENDENCIES="duecredit sphinx-sitemap" + - PIP_DEPENDENCIES="duecredit" - NUMPY_VERSION=stable - INSTALL_HOLE="true" matrix: - # Run a coverage test + # Run a coverage test for 3.5 and 2.7 - CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - - PYTHON_VERSION=3.6 + - PYTHON_VERSION=3.6 - PYTHON_VERSION=3.4 - - PYTHON_VERSION=2.7 + - PYTHON_VERSION=2.7 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - NUMPY_VERSION=1.10.4 - NUMPY_VERSION=dev EVENT_TYPE="cron" @@ -53,6 +53,7 @@ matrix: BUILD_DOCS=true BUILD_CMD="cd ${TRAVIS_BUILD_DIR}/package && python setup.py build_ext --inplace" INSTALL_HOLE="false" + PIP_DEPENDENCIES="${PIP_DEPENDENCIES} sphinx-sitemap" - env: NAME="Lint" PYLINTRC="${TRAVIS_BUILD_DIR}/package/.pylintrc" From b1939326ef031fc80d26b816287744d005d9b6ee Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Wed, 11 Jul 2018 02:37:39 -0700 Subject: [PATCH 204/455] replaced coveralls URL with codecov URL - badges - links to site - minor formatting of reST indentation --- README.rst | 18 +++++++++--------- package/SUMMARY.txt | 18 +++++++++--------- testsuite/README | 10 +++++----- testsuite/setup.py | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/README.rst b/README.rst index 069ec44afc1..9aff2028aea 100644 --- a/README.rst +++ b/README.rst @@ -102,17 +102,17 @@ to find uncovered code. :target: https://www.mdanalysis.org/mdanalysis/ .. |build| image:: https://travis-ci.org/MDAnalysis/mdanalysis.svg?branch=develop - :alt: Build Status - :target: https://travis-ci.org/MDAnalysis/mdanalysis + :alt: Build Status + :target: https://travis-ci.org/MDAnalysis/mdanalysis -.. |cov| image:: https://coveralls.io/repos/MDAnalysis/mdanalysis/badge.svg?branch=develop - :alt: Coverage Status - :target: https://coveralls.io/r/MDAnalysis/mdanalysis?branch=develop +.. |cov| image:: https://codecov.io/gh/MDAnalysis/mdanalysis/branch/develop/graph/badge.svg + :alt: Coverage Status + :target: https://codecov.io/gh/MDAnalysis/mdanalysis .. |anaconda| image:: https://anaconda.org/conda-forge/mdanalysis/badges/version.svg - :alt: Anaconda - :target: https://anaconda.org/conda-forge/mdanalysis + :alt: Anaconda + :target: https://anaconda.org/conda-forge/mdanalysis .. |mybinder| image:: https://mybinder.org/badge.svg - :alt: My Binder - :target: https://mybinder.org/v2/gh/MDAnalysis/binder-notebook/master + :alt: My Binder + :target: https://mybinder.org/v2/gh/MDAnalysis/binder-notebook/master diff --git a/package/SUMMARY.txt b/package/SUMMARY.txt index 9e7d893ed78..9e9a7c81b80 100644 --- a/package/SUMMARY.txt +++ b/package/SUMMARY.txt @@ -121,18 +121,18 @@ For citations of included algorithms and sub-modules please see the references_. :target: https://docs.mdanalysis.org .. |build| image:: https://travis-ci.org/MDAnalysis/mdanalysis.svg?branch=develop - :alt: Build Status - :target: https://travis-ci.org/MDAnalysis/mdanalysis + :alt: Build Status + :target: https://travis-ci.org/MDAnalysis/mdanalysis -.. |cov| image:: https://coveralls.io/repos/MDAnalysis/mdanalysis/badge.svg?branch=develop - :alt: Coverage Status - :target: https://coveralls.io/r/MDAnalysis/mdanalysis?branch=develop +.. |cov| image:: https://codecov.io/gh/MDAnalysis/mdanalysis/branch/develop/graph/badge.svg + :alt: Coverage Status + :target: https://codecov.io/gh/MDAnalysis/mdanalysis .. |anaconda| image:: https://anaconda.org/conda-forge/mdanalysis/badges/version.svg - :alt: Anaconda - :target: https://anaconda.org/conda-forge/mdanalysis + :alt: Anaconda + :target: https://anaconda.org/conda-forge/mdanalysis .. |mybinder| image:: https://mybinder.org/badge.svg - :alt: My Binder - :target: https://mybinder.org/v2/gh/MDAnalysis/binder-notebook/master + :alt: My Binder + :target: https://mybinder.org/v2/gh/MDAnalysis/binder-notebook/master diff --git a/testsuite/README b/testsuite/README index ebc78b15536..d1c116b7163 100644 --- a/testsuite/README +++ b/testsuite/README @@ -41,12 +41,12 @@ Help is also available through the mailing list at https://groups.google.com/gro .. badges .. |build| image:: https://travis-ci.org/MDAnalysis/mdanalysis.svg?branch=develop - :alt: Build Status - :target: https://travis-ci.org/MDAnalysis/mdanalysis + :alt: Build Status + :target: https://travis-ci.org/MDAnalysis/mdanalysis -.. |cov| image:: https://coveralls.io/repos/MDAnalysis/mdanalysis/badge.svg?branch=develop - :alt: Coverage Status - :target: https://coveralls.io/r/MDAnalysis/mdanalysis?branch=develop +.. |cov| image:: https://codecov.io/gh/MDAnalysis/mdanalysis/branch/develop/graph/badge.svg + :alt: Coverage Status + :target: https://codecov.io/gh/MDAnalysis/mdanalysis .. |devdocs| image:: https://img.shields.io/badge/docs-development-yellow.svg :alt: Documentation (development version) diff --git a/testsuite/setup.py b/testsuite/setup.py index 8b73a641456..15912d67843 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -170,7 +170,7 @@ def dynamic_author_list(): download_url='https://github.com/MDAnalysis/mdanalysis/releases', project_urls={'Documentation': 'https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests', 'CI Tests': 'https://travis-ci.org/MDAnalysis/mdanalysis', - 'CI Coverage': 'https://coveralls.io/r/MDAnalysis/mdanalysis?branch=develop', + 'CI Coverage': 'https://codecov.io/gh/MDAnalysis/mdanalysis', 'Developer Group': 'https://groups.google.com/forum/#!forum/mdnalysis-devel', 'Issue Tracker': 'https://github.com/mdanalysis/mdanalysis/issues', 'Source': 'https://github.com/mdanalysis/mdanalysis', From aed747a6eb32206134641c02dc885a5413fd1bd9 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Wed, 11 Jul 2018 03:02:27 -0700 Subject: [PATCH 205/455] try coverage merge for most Linux runs (2.7, 3.x, minimal) --- .travis.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 414dfde220c..5ebc7461165 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,10 +36,10 @@ env: - INSTALL_HOLE="true" matrix: - # Run a coverage test for 3.5 and 2.7 + # Run a coverage test for most versions - CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - - PYTHON_VERSION=3.6 - - PYTHON_VERSION=3.4 + - PYTHON_VERSION=3.6 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" + - PYTHON_VERSION=3.4 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - PYTHON_VERSION=2.7 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - NUMPY_VERSION=1.10.4 - NUMPY_VERSION=dev EVENT_TYPE="cron" @@ -72,6 +72,8 @@ matrix: - env: NAME='minimal' CONDA_DEPENDENCIES=${CONDA_MIN_DEPENDENCIES} INSTALL_HOLE="false" + CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" + allow_failures: - env: NUMPY_VERSION=dev EVENT_TYPE="cron" From 7c996654b8d791373f9f632a3b370a1aa4ef61eb Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Wed, 11 Jul 2018 10:42:11 -0500 Subject: [PATCH 206/455] tabs to spaces? --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5ebc7461165..957cbb219d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,7 +53,7 @@ matrix: BUILD_DOCS=true BUILD_CMD="cd ${TRAVIS_BUILD_DIR}/package && python setup.py build_ext --inplace" INSTALL_HOLE="false" - PIP_DEPENDENCIES="${PIP_DEPENDENCIES} sphinx-sitemap" + PIP_DEPENDENCIES="${PIP_DEPENDENCIES} sphinx-sitemap" - env: NAME="Lint" PYLINTRC="${TRAVIS_BUILD_DIR}/package/.pylintrc" @@ -72,8 +72,8 @@ matrix: - env: NAME='minimal' CONDA_DEPENDENCIES=${CONDA_MIN_DEPENDENCIES} INSTALL_HOLE="false" - CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - + CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" + allow_failures: - env: NUMPY_VERSION=dev EVENT_TYPE="cron" From c23c3b414b9b78caa97d5a3336e9fac097a64b03 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Wed, 11 Jul 2018 11:24:12 -0500 Subject: [PATCH 207/455] Update test_topologyobjects.py --- .../MDAnalysisTests/core/test_topologyobjects.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/core/test_topologyobjects.py b/testsuite/MDAnalysisTests/core/test_topologyobjects.py index cf260134272..a322d619b73 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyobjects.py +++ b/testsuite/MDAnalysisTests/core/test_topologyobjects.py @@ -721,7 +721,7 @@ def test_cross_universe_eq(): assert not (u1.bonds[0] == u2.bonds[0]) -def test_zero_size_TG_indices(): +def test_zero_size_TG_indices_bonds(): u = mda.Universe.empty(10) u.add_TopologyAttr('bonds', values=[(1, 2), (2, 3)]) @@ -730,5 +730,17 @@ def test_zero_size_TG_indices(): idx = ag.bonds.to_indices() + assert idx.shape == (0, 2) + assert idx.dtype == np.int32 + +def test_zero_size_TG_indices_angles(): + u = mda.Universe.empty(10) + + u.add_TopologyAttr('angles', values=[(1, 2, 3), (2, 3, 4)]) + + ag = u.atoms[[0]] + + idx = ag.bonds.to_indices() + assert idx.shape == (0, 3) assert idx.dtype == np.int32 From 724cc0471435405e625a2830963cd1fb4875119a Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Wed, 11 Jul 2018 11:39:22 -0500 Subject: [PATCH 208/455] bit more tidying of topologyobjects.py --- package/MDAnalysis/core/topologyobjects.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index a118d3c522a..ef707f90555 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -522,8 +522,6 @@ class TopologyGroup(object): Empty TopologyGroup now returns correctly shaped empty array via indices property and to_indices() """ - _allowed_types = {'bond', 'angle', 'dihedral', 'improper'} - def __init__(self, bondidx, universe, btype=None, type=None, guessed=None, order=None): if btype is None: @@ -533,11 +531,11 @@ def __init__(self, bondidx, universe, btype=None, type=None, guessed=None, self.btype = {2: 'bond', 3: 'angle', 4: 'dihedral'}[len(bondidx[0])] - elif btype in self._allowed_types: + elif btype in _BTYPE_TO_SHAPE: self.btype = btype else: - raise ValueError("Unsupported btype, use one of {}" - "".format(self._allowed_types)) + raise ValueError("Unsupported btype, use one of '{}'" + "".format(', '.join(_BTYPE_TO_SHAPE))) nbonds = len(bondidx) # remove duplicate bonds From 221868656d2acab93829ec8b30167a1fc71b8bfb Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Wed, 11 Jul 2018 15:05:31 -0500 Subject: [PATCH 209/455] Update CHANGELOG --- package/CHANGELOG | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 0f72cd2cb7d..207eeb6dec5 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,8 +20,8 @@ The rules for this file: Enhancements - * Added capped_distance function for automatic selection of - distance evaluation method (PR #1941) + * Added lib.distances.capped_distance function to quickly calculate all distances + up to a given maximum distance (PR #1941) * Added a rotation coordinate transformation (PR #1937) * Added a box centering trajectory transformation (PR #1946) * Added a on-the-fly trajectory transformations API and a coordinate translation From fc326358126b848605edba928eb14512c18cbe22 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Wed, 11 Jul 2018 22:09:25 +0200 Subject: [PATCH 210/455] Fix a typo in test_zero_size_TG_indices_angles --- testsuite/MDAnalysisTests/core/test_topologyobjects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/core/test_topologyobjects.py b/testsuite/MDAnalysisTests/core/test_topologyobjects.py index a322d619b73..7aeaa7a249b 100644 --- a/testsuite/MDAnalysisTests/core/test_topologyobjects.py +++ b/testsuite/MDAnalysisTests/core/test_topologyobjects.py @@ -740,7 +740,7 @@ def test_zero_size_TG_indices_angles(): ag = u.atoms[[0]] - idx = ag.bonds.to_indices() + idx = ag.angles.to_indices() assert idx.shape == (0, 3) assert idx.dtype == np.int32 From 89d6f2b3298f84b58737d733400f6468e2581684 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Sat, 7 Jul 2018 12:12:36 -0700 Subject: [PATCH 211/455] add our own lib.util.deprecate The numpy.lib.util.deprecate() function messes up our doc strings. See https://github.com/MDAnalysis/mdanalysis/pull/1763#issuecomment-403231136 Our deprecate() function (and _Deprecate) is based on the numpy code with the additional enhancements - add util.deprecate() and util._Deprecate class - add util.dedent_docstring() function - requires release kwarg: note the release in which it was deprecated - optional remove kwarg: release for which feature removal is scheduled - properly formats the restructure doc text of the function - add a sphinx .. deprecated:: release markup at the end of the docs - extensive tests --- package/MDAnalysis/lib/util.py | 247 ++++++++++++++++++++- testsuite/MDAnalysisTests/lib/test_util.py | 81 ++++++- 2 files changed, 326 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/lib/util.py b/package/MDAnalysis/lib/util.py index e970ce0f4ae..264b4b3498b 100644 --- a/package/MDAnalysis/lib/util.py +++ b/package/MDAnalysis/lib/util.py @@ -138,6 +138,14 @@ .. autofunction:: cached + +Code management +--------------- + +.. autofunction:: deprecate +.. autoclass:: _Deprecate +.. autofunction:: dedent_docstring + .. Rubric:: Footnotes .. [#NamedStreamClose] The reason why :meth:`NamedStream.close` does @@ -171,10 +179,13 @@ import io import warnings import collections +import functools from functools import wraps +import textwrap + import mmtf import numpy as np -import functools + from numpy.testing import assert_equal import inspect @@ -1804,3 +1815,237 @@ def wrapper(group, *args, **kwargs): warn_if_not_unique.warned = False return result return wrapper + + +#------------------------------------------------------------------ +# +# our own deprecate function, derived from numpy (see +# https://github.com/MDAnalysis/mdanalysis/pull/1763#issuecomment-403231136) +# +# From numpy/lib/utils.py 1.14.5 (used under the BSD 3-clause licence, +# https://www.numpy.org/license.html#license) and modified + +def _set_function_name(func, name): + func.__name__ = name + return func + +class _Deprecate(object): + """ + Decorator class to deprecate old functions. + + Refer to `deprecate` for details. + + See Also + -------- + deprecate + + + .. versionadded:: 0.19.0 + """ + + def __init__(self, old_name=None, new_name=None, + release=None, remove=None, message=None): + self.old_name = old_name + self.new_name = new_name + if release is None: + raise ValueError("deprecate: provide release in which " + "feature was deprecated.") + self.release = str(release) + self.remove = str(remove) if remove is not None else remove + self.message = message + + def __call__(self, func, *args, **kwargs): + """ + Decorator call. Refer to ``decorate``. + + """ + old_name = self.old_name + new_name = self.new_name + message = self.message + release = self.release + remove = self.remove + + if old_name is None: + try: + old_name = func.__name__ + except AttributeError: + old_name = func.__name__ + if new_name is None: + depdoc = "`{0}` is deprecated!".format(old_name) + else: + depdoc = "`{0}` is deprecated, use `{1}` instead!".format( + old_name, new_name) + + warn_message = depdoc + + remove_text = "" + if remove is not None: + remove_text = "`{0}` will be removed in release {1}.".format( + old_name, remove) + warn_message += "\n" + remove_text + if message is not None: + warn_message += "\n" + message + + def newfunc(*args, **kwds): + """This function is deprecated.""" + warnings.warn(warn_message, DeprecationWarning, stacklevel=2) + return func(*args, **kwds) + + newfunc = _set_function_name(newfunc, old_name) + + # Build the doc string + # First line: func is deprecated, use newfunc instead! + # Normal docs follows. + # Last: .. deprecated:: + + # make sure that we do not mess up indentation, otherwise sphinx + # docs do not build properly + try: + doc = dedent_docstring(func.__doc__) + except TypeError: + doc = "" + + deprecation_text = dedent_docstring("""\n\n + .. deprecated:: {0} + {1} + {2} + """.format(release, + message if message else depdoc, + remove_text)) + + doc = "{0}\n\n{1}\n{2}\n".format(depdoc, doc, deprecation_text) + + newfunc.__doc__ = doc + try: + d = func.__dict__ + except AttributeError: + pass + else: + newfunc.__dict__.update(d) + return newfunc + +def deprecate(*args, **kwargs): + """Issues a DeprecationWarning, adds warning to `old_name`'s + docstring, rebinds ``old_name.__name__`` and returns the new + function object. + + This function may also be used as a decorator. + + It adds a restructured text ``.. deprecated:: release`` block with + the sphinx deprecated role to the end of the docs. The `message` + is added under the deprecation block and contains the `release` in + which the function was deprecated. + + Parameters + ---------- + func : function + The function to be deprecated. + old_name : str, optional + The name of the function to be deprecated. Default is None, in + which case the name of `func` is used. + new_name : str, optional + The new name for the function. Default is None, in which case the + deprecation message is that `old_name` is deprecated. If given, the + deprecation message is that `old_name` is deprecated and `new_name` + should be used instead. + release : str + Release in which the function was deprecated. This is given as + a keyword argument for technical reasons but is required; a + :exc:`ValueError` is raised if it is missing. + remove : str, optional + Release for which removal of the feature is planned. + message : str, optional + Additional explanation of the deprecation. Displayed in the + docstring after the warning. + + Returns + ------- + old_func : function + The deprecated function. + + Examples + -------- + When :func:`deprecate` is used as a function as in the following + example, + + .. code-block:: python + + oldfunc = deprecate(func, release="0.19.0", remove="1.0", + message="Do it yourself instead.") + + then ``oldfunc`` will return a value after printing + :exc:`DeprecationWarning`; ``func`` is still available as it was + before. + + When used as a decorator, ``func`` will be changed and issue the + warning and contain the deprecation note in the do string. + + .. code-block:: python + + @deprecate(release="0.19.0", remove="1.0", + message="Do it yourself instead.") + def func(): + \"\"\"Just pass\"\"\" + pass + + The resulting doc string (``help(func)``) will look like: + + .. code-block:: reST + + `func` is deprecated! + + Just pass. + + .. deprecated:: 0.19.0 + Do it yourself instead. + `func` will be removed in 1.0. + + (It is possible but confusing to change the name of ``func`` with + the decorator so it is not recommended to use the `new_func` + keyword argument with the decorator.) + + .. versionadded:: 0.19.0 + + """ + # Deprecate may be run as a function or as a decorator + # If run as a function, we initialise the decorator class + # and execute its __call__ method. + + if args: + fn = args[0] + args = args[1:] + return _Deprecate(*args, **kwargs)(fn) + else: + return _Deprecate(*args, **kwargs) +# +#------------------------------------------------------------------ + +def dedent_docstring(text): + """Dedent typical python doc string. + + Parameters + ---------- + text : str + string, typically something like ``func.__doc__``. + + Returns + ------- + str + string with the leading common whitespace removed from each + line + + See Also + -------- + textwrap.dedent + + + .. versionadded:: 0.19.0 + """ + lines = text.splitlines() + if len(lines) < 2: + return text.lstrip() + + # treat first line as special (typically no leading whitespace!) which messes up dedent + return lines[0].lstrip() + "\n" + textwrap.dedent("\n".join(lines[1:])) + + diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index fa1db74dc43..ed226ceced2 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -26,6 +26,8 @@ import pytest import os import warnings +import re +import textwrap import numpy as np from numpy.testing import (assert_equal, assert_almost_equal, @@ -1283,7 +1285,7 @@ def test_warn_if_not_unique_fails_for_non_groupmethods(self): @warn_if_not_unique def func(group): pass - + class dummy(object): pass @@ -1303,3 +1305,80 @@ def func(group): func(atoms) assert not w.list assert len(record) == 0 + +@pytest.mark.parametrize("old_name", (None, "MDAnalysis.Universe")) +@pytest.mark.parametrize("new_name", (None, "Multiverse")) +@pytest.mark.parametrize("remove", (None, "99.0.0", 2099)) +@pytest.mark.parametrize("message", (None, "use the new stuff")) +def test_deprecate(old_name, new_name, remove, message, release="2.7.1"): + def AlternateUniverse(anything): + # important: first line needs to be """\ so that textwrap.dedent() + # works + """\ + AlternateUniverse provides a true view of the Universe. + + Parameters + ---------- + anything : object + + Returns + ------- + truth + + """ + return True + + oldfunc = util.deprecate(AlternateUniverse, old_name=old_name, + new_name=new_name, + release=release, remove=remove, + message=message) + with pytest.warns(DeprecationWarning, match_expr="`.+` is deprecated"): + oldfunc(42) + + doc = oldfunc.__doc__ + name = old_name if old_name else AlternateUniverse.__name__ + + deprecation_line_1 = ".. deprecated:: {0}".format(release) + assert re.search(deprecation_line_1, doc) + + if message: + deprecation_line_2 = message + else: + if new_name is None: + default_message = "`{0}` is deprecated!".format(name) + else: + default_message = "`{0}` is deprecated, use `{1}` instead!".format( + name, new_name) + deprecation_line_2 = default_message + assert re.search(deprecation_line_2, doc) + + if remove: + deprecation_line_3 = "`{0}` will be removed in release {1}".format( + name, remove) + assert re.search(deprecation_line_3, doc) + + # check that the old docs are still present + assert re.search(textwrap.dedent(AlternateUniverse.__doc__), doc) + + +def test_deprecate_missing_release_ValueError(): + with pytest.raises(ValueError): + util.deprecate(mda.Universe) + +def test_set_function_name(name="bar"): + def foo(): + pass + util._set_function_name(foo, name) + assert foo.__name__ == name + +@pytest.mark.parametrize("text", + ("", + "one line text", + " one line with leading space", + "multiline\n\n with some\n leading space", + " multiline\n\n with all\n leading space")) +def test_dedent_docstring(text): + doc = util.dedent_docstring(text) + for line in doc.splitlines(): + assert line == line.lstrip() + From bba488a8a284528fe2f011ba4be1850b5be542d6 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Sun, 21 Jan 2018 15:57:40 -0700 Subject: [PATCH 212/455] deprecated save*() methods (#1972) - fix #1972 - important: use own util.deprecate() instead of the numpy version - deprecated save() methods in align and contacts (#1972) - deprecations updated 0.17.0 --> 0.19.0 - deprecated save() in lineardensity and necesscary doc update - deprecated save() (#1972) - added docs explaining the results data structure (needed anyway, but in particular when user does not get the dated in separate datafiles) - deprecated save() in rms (#1972) - deprecated save() in hole (#1972) - deprecated save() in diffusion map (#1972) - deprecated save_table() and save_results() in all hbond analysis clases (#1972) - doc updates for deprecations in hbonds - removed save_table() from wbridge analysis and use it from the parent class - deprecated save_result() PSA (#1972) - updated CHANGELOG for #1972 --- package/CHANGELOG | 5 +++ package/MDAnalysis/analysis/align.py | 5 ++- package/MDAnalysis/analysis/contacts.py | 4 +-- package/MDAnalysis/analysis/diffusionmap.py | 17 +++++++--- .../analysis/hbonds/hbond_analysis.py | 14 +++++--- .../analysis/hbonds/hbond_autocorrel.py | 19 +++++++---- .../analysis/hbonds/wbridge_analysis.py | 23 ++----------- package/MDAnalysis/analysis/hole.py | 8 +++-- package/MDAnalysis/analysis/lineardensity.py | 28 ++++++++++------ package/MDAnalysis/analysis/psa.py | 32 +++++++++++++++---- package/MDAnalysis/analysis/rms.py | 18 +++++++++-- package/MDAnalysis/core/selection.py | 2 +- 12 files changed, 112 insertions(+), 63 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index f667c4c1245..ecf90605dc5 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -73,6 +73,11 @@ Changes updated or modified. (PR #1922) * The TPR parser reads SETTLE constraints as bonds. (Issue #1949) +Deprecations + * almost all "save()", "save_results()", "save_table()" methods in + analysis classes were deprecated and will be removed in 1.0 (Issue + #1972 and #1745) + 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, orbeckst, xiki-tempula, navyakhare, zemanj, ayushsuhane, davidercruz, diff --git a/package/MDAnalysis/analysis/align.py b/package/MDAnalysis/analysis/align.py index 6c3dbccf195..09fa2e3497c 100644 --- a/package/MDAnalysis/analysis/align.py +++ b/package/MDAnalysis/analysis/align.py @@ -204,7 +204,7 @@ from MDAnalysis.exceptions import SelectionError, SelectionWarning import MDAnalysis.analysis.rms as rms from MDAnalysis.coordinates.memory import MemoryReader -from MDAnalysis.lib.util import get_weights +from MDAnalysis.lib.util import get_weights, deprecate from .base import AnalysisBase @@ -679,7 +679,10 @@ def _conclude(self): if not self._verbose: logging.disable(logging.NOTSET) + @deprecate(release="0.19.0", remove="1.0") def save(self, rmsdfile): + """save rmsd as a numpy array + """ # these are the values of the new rmsd between the aligned trajectory # and reference structure np.savetxt(rmsdfile, self.rmsd) diff --git a/package/MDAnalysis/analysis/contacts.py b/package/MDAnalysis/analysis/contacts.py index 6b2370f8add..e5a6ec7c30a 100644 --- a/package/MDAnalysis/analysis/contacts.py +++ b/package/MDAnalysis/analysis/contacts.py @@ -208,13 +208,12 @@ def is_any_closer(r, r0, dist=2.5): import bz2 import numpy as np -from numpy.lib.utils import deprecate import logging import MDAnalysis import MDAnalysis.lib.distances -from MDAnalysis.lib.util import openany +from MDAnalysis.lib.util import openany, deprecate from MDAnalysis.analysis.distances import distance_array from MDAnalysis.core.groups import AtomGroup from .base import AnalysisBase @@ -454,6 +453,7 @@ def _single_frame(self): def _conclude(self): self.timeseries = np.array(self.timeseries, dtype=float) + @deprecate(release="0.19.0", remove="1.0.0") def save(self, outfile): """save contacts timeseries diff --git a/package/MDAnalysis/analysis/diffusionmap.py b/package/MDAnalysis/analysis/diffusionmap.py index 20d36d12762..aac0cc94576 100644 --- a/package/MDAnalysis/analysis/diffusionmap.py +++ b/package/MDAnalysis/analysis/diffusionmap.py @@ -170,11 +170,12 @@ import logging import warnings -from MDAnalysis.core.universe import Universe import numpy as np +from MDAnalysis.core.universe import Universe from .rms import rmsd from .base import AnalysisBase +from MDAnalysis.lib.util import deprecate logger = logging.getLogger("MDAnalysis.analysis.diffusionmap") @@ -195,10 +196,6 @@ class DistanceMatrix(AnalysisBase): Array of all possible ij metric distances between frames in trajectory. This matrix is symmetric with zeros on the diagonal. - Methods - ------- - save(filename) - Save the `dist_matrix` to a given filename """ def __init__(self, u, select='all', metric=rmsd, cutoff=1E0-5, weights=None, start=None, stop=None, step=None, @@ -276,7 +273,17 @@ def _single_frame(self): def _conclude(self): self._calculated = True + @deprecate(release="0.19.0", remove="1.0.0", + message="Use ``np.save(filename, DistanceMatrix.dist_matrix)`` instead.") def save(self, filename): + """save squared distance matrix + + Parameters + ---------- + outfile : str + file to save distance matrix + + """ np.save(filename, self.dist_matrix) logger.info("Wrote the distance-squared matrix to file %r", filename) diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index ac38eceb8a9..f39744b74fe 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -83,9 +83,8 @@ Using the :meth:`HydrogenBondAnalysis.generate_table` method one can reformat the results as a flat "normalised" table that is easier to import into a -database or dataframe for further processing. -:meth:`HydrogenBondAnalysis.save_table` saves the table to a pickled file. The -table itself is a :class:`numpy.recarray`. +database or dataframe for further processing. The table itself is a +:class:`numpy.recarray`. .. _Detection-of-hydrogen-bonds: @@ -320,15 +319,17 @@ class HydrogenBondAnalysis_OtherFF(HydrogenBondAnalysis): import six from six.moves import range, zip, map, cPickle -from collections import defaultdict -import numpy as np import warnings import logging +from collections import defaultdict + +import numpy as np from MDAnalysis import MissingDataWarning, NoDataError, SelectionError, SelectionWarning from MDAnalysis.lib.log import ProgressMeter, _set_verbose from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch from MDAnalysis.lib import distances +from MDAnalysis.lib.util import deprecate logger = logging.getLogger('MDAnalysis.analysis.hbonds') @@ -1168,6 +1169,9 @@ def generate_table(self): self.table = out.view(np.recarray) logger.debug("HBond: Stored results as table with %(num_records)d entries.", vars()) + @deprecate(release="0.19.0", remove="1.0.0", + message="You can instead use ``np.save(filename, " + "HydrogendBondAnalysis.table)``.") def save_table(self, filename="hbond_table.pickle"): """Saves :attr:`~HydrogenBondAnalysis.table` to a pickled file. diff --git a/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py b/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py index 59fb59b12aa..05f20abfc17 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_autocorrel.py @@ -30,7 +30,7 @@ .. versionadded:: 0.9.0 Description ---------------- +----------- Calculates the time autocorrelation function, :math:`C_x(t)`, for the hydrogen bonds in the selections passed to it. The population of hydrogen bonds at a @@ -142,18 +142,17 @@ plt.show() -.. autoclass:: HydrogenBondAutoCorrel - - .. automethod:: run - - .. automethod:: solve +Classes +------- - .. automethod:: save_results +.. autoclass:: HydrogenBondAutoCorrel + :members: """ from __future__ import division, absolute_import from six.moves import zip + import numpy as np import scipy.optimize @@ -161,6 +160,7 @@ from MDAnalysis.lib.log import ProgressMeter from MDAnalysis.lib.distances import distance_array, calc_angles, calc_bonds +from MDAnalysis.lib.util import deprecate from MDAnalysis.due import due, Doi due.cite(Doi("10.1063/1.4922445"), @@ -403,6 +403,10 @@ def _single_run(self, start, stop): return results + @deprecate(release="0.19.0", remove="1.0.0", + message="You can instead use " + "``np.savez(filename, time=HydrogenBondAutoCorrel.solution['time'], " + "results=HydrogenBondAutoCorrel.solution['results'])``.") def save_results(self, filename='hbond_autocorrel'): """Saves the results to a numpy zipped array (.npz, see np.savez) @@ -412,6 +416,7 @@ def save_results(self, filename='hbond_autocorrel'): ---------- filename : str, optional The desired filename [hbond_autocorrel] + """ if self.solution['results'] is not None: np.savez(filename, time=self.solution['time'], diff --git a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py index e55272c7a2a..b6bcc7f9449 100644 --- a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py @@ -285,10 +285,11 @@ class WaterBridgeAnalysis_OtherFF(WaterBridgeAnalysis): import six from collections import defaultdict -import numpy as np import logging import warnings +import numpy as np + from .hbond_analysis import HydrogenBondAnalysis from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch from MDAnalysis.lib.log import ProgressMeter, _set_verbose @@ -844,26 +845,6 @@ def generate_table(self): """ super(WaterBridgeAnalysis, self).generate_table() - def save_table(self, filename="wbridge_table.pickle"): - """Saves :attr:`~WaterBridgeAnalysis.table` to a pickled file. - - If :attr:`~WaterBridgeAnalysis.table` does not exist yet, - :meth:`generate_table` is called first. - - Parameters - ---------- - filename : str (optional) - path to the filename - - Example - ------- - Load with :: - - import cPickle - table = cPickle.load(open(filename)) - """ - super(WaterBridgeAnalysis, self).save_table(filename) - def count_by_type(self): """Counts the frequency of water bridge of a specific type. diff --git a/package/MDAnalysis/analysis/hole.py b/package/MDAnalysis/analysis/hole.py index 7982115f13d..c7596350ef7 100644 --- a/package/MDAnalysis/analysis/hole.py +++ b/package/MDAnalysis/analysis/hole.py @@ -275,8 +275,8 @@ from MDAnalysis import Universe from MDAnalysis.exceptions import ApplicationError -from MDAnalysis.lib.util import which, realpath, asiterable -from MDAnalysis.lib.util import FORTRANReader +from MDAnalysis.lib.util import (which, realpath, asiterable, + FORTRANReader, deprecate) from ..due import due, Doi @@ -388,6 +388,9 @@ def seq2str(v): class BaseHOLE(object): """Baseclass for HOLE analysis, providing plotting and utility functions""" + @deprecate(release="0.19.0", remove="1.0.0", + message="You can instead use " + "``cPickle.dump(HOLE.profiles, open(filename, 'wb'))``.") def save(self, filename="hole.pickle"): """Save :attr:`profiles` as a Python pickle file *filename*. @@ -396,6 +399,7 @@ def save(self, filename="hole.pickle"): import cPickle profiles = cPickle.load(open(filename)) + """ cPickle.dump(self.profiles, open(filename, "wb"), cPickle.HIGHEST_PROTOCOL) diff --git a/package/MDAnalysis/analysis/lineardensity.py b/package/MDAnalysis/analysis/lineardensity.py index 291920141a8..dba1caf5e86 100644 --- a/package/MDAnalysis/analysis/lineardensity.py +++ b/package/MDAnalysis/analysis/lineardensity.py @@ -30,19 +30,19 @@ from __future__ import division, absolute_import import os.path as path + import numpy as np from MDAnalysis.analysis.base import AnalysisBase - +from MDAnalysis.lib.util import deprecate class LinearDensity(AnalysisBase): """Linear density profile - LinearDensity(selection, grouping='atoms', binsize=0.25) Parameters ---------- selection : AtomGroup - Any atomgroup + any atomgroup grouping : str {'atoms', 'residues', 'segments', 'fragments'} Density profiles will be computed on the center of geometry of a selected group of atoms ['atoms'] @@ -60,6 +60,13 @@ class LinearDensity(AnalysisBase): Show detailed progress of the calculation if set to ``True``; the default is ``False``. + Attributes + ---------- + results : dict + Keys 'x', 'y', and 'z' for the three directions. Under these + keys, find 'pos', 'pos_std' (mass-weighted density and + standard deviation), 'char', 'char_std' (charge density and + its standard deviation), 'slice_volume' (volume of bin). Example ------- @@ -69,15 +76,9 @@ class LinearDensity(AnalysisBase): ldens = LinearDensity(selection) ldens.run() - Density profiles can be written to file through the `save` method:: - - ldens.save(description='mydensprof', form='txt') - - which will output the density profiles in a file named - `.mydensprof_.ldens`. - Results can be saved in npz format by specifying `form='npz'` .. versionadded:: 0.14.0 + """ def __init__(self, selection, grouping='atoms', binsize=0.25, **kwargs): @@ -190,8 +191,12 @@ def _conclude(self): self.results[dim]['pos_std'] /= self.results[dim]['slice volume'] * k self.results[dim]['char_std'] /= self.results[dim]['slice volume'] * k + @deprecate(release="0.19.0", remove="1.0.0", + message="Instead save the :attr:`results` dictionary directly in " + "your favorite format (pickle, json, hdf5, ...).") def save(self, description='', form='txt'): """Save density profile to file + Allows to save the density profile to either a ASCII txt file or a binary numpy npz file. Output file has extension 'ldens' and begins with the name of the trajectory file. @@ -214,6 +219,7 @@ def save(self, description='', form='txt'): which will output the linear density profiles in a file named `.mydensprof_.ldens`. + """ # Take root of trajectory filename for output file naming trajname = path.splitext(path.basename( @@ -230,6 +236,7 @@ def save(self, description='', form='txt'): raise ValueError('form argument must be either txt or npz') def _savetxt(self, filename): + # DEPRECATED: remove in 1.0.0 bins = np.linspace(0.0, max(self.dimensions), num=self.nbins) # Create list of results which will be output @@ -253,6 +260,7 @@ def _savetxt(self, filename): header=header) def _savez(self, filename): + # DEPRECATED: remove in 1.0.0 bins = np.linspace(0.0, max(self.dimensions), num=self.nbins) dictionary = {'bins': bins} diff --git a/package/MDAnalysis/analysis/psa.py b/package/MDAnalysis/analysis/psa.py index 96df84bf67e..05c2e1dd75a 100644 --- a/package/MDAnalysis/analysis/psa.py +++ b/package/MDAnalysis/analysis/psa.py @@ -216,19 +216,19 @@ from six.moves import range, cPickle from six import string_types +import os +import warnings +import numbers + import numpy as np from scipy import spatial, cluster from scipy.spatial.distance import directed_hausdorff import matplotlib -import warnings -import numbers - import MDAnalysis import MDAnalysis.analysis.align from MDAnalysis import NoDataError - -import os +from MDAnalysis.lib.util import deprecate import logging logger = logging.getLogger('MDAnalysis.analysis.psa') @@ -1506,14 +1506,27 @@ def run(self, **kwargs): store : bool if ``True`` then writes :attr:`PSAnalysis.D` to text and compressed npz (numpy) files [``True``] + + .. deprecated:: 0.19.0 + `store` will be removed together with :meth:`save_results` in 1.0.0. + filename : str string, filename to save :attr:`PSAnalysis.D` + .. deprecated:: 0.19.0 + `filename` will be removed together with :meth:`save_results` in 1.0.0. + + """ metric = kwargs.pop('metric', 'hausdorff') start = kwargs.pop('start', None) stop = kwargs.pop('stop', None) step = kwargs.pop('step', None) + # DEPRECATED 0.19.0: remove in 1.0 + if 'store' in kwargs: + warnings.warn("PSAnalysis.run(): 'store' was deprecated in 0.19.0 " + "and will be removed in 1.0", + category=DeprecationWarning) store = kwargs.pop('store', True) if isinstance(metric, string_types): @@ -1531,6 +1544,11 @@ def run(self, **kwargs): D[j,i] = D[i,j] self.D = D if store: + # DEPRECATED 0.19.0: remove in 1.0 + if 'filename' in kwargs: + warnings.warn("PSAnalysis.run(): 'filename' was deprecated in " + "0.19.0 and will be removed in 1.0", + category=DeprecationWarning) filename = kwargs.pop('filename', metric) if not isinstance(metric, string_types): filename = 'custom_metric' @@ -1594,7 +1612,9 @@ def run_pairs_analysis(self, **kwargs): self._HP.append(pp.get_hausdorff_pair()) self.D = D - + @deprecate(release="0.19.0", remove="1.0.0", + message="You can save the distance matrix :attr:`D` to a numpy " + "file with ``np.save(filename, PSAnalysis.D)``.") def save_result(self, filename=None): """Save distance matrix :attr:`PSAnalysis.D` to a numpy compressed npz file and text file. diff --git a/package/MDAnalysis/analysis/rms.py b/package/MDAnalysis/analysis/rms.py index b28da093c2a..21fd9efcf3f 100644 --- a/package/MDAnalysis/analysis/rms.py +++ b/package/MDAnalysis/analysis/rms.py @@ -136,16 +136,17 @@ from six.moves import zip from six import string_types + import numpy as np + import logging import warnings - import MDAnalysis.lib.qcprot as qcp from MDAnalysis.analysis.base import AnalysisBase from MDAnalysis.exceptions import SelectionError, NoDataError from MDAnalysis.lib.log import ProgressMeter, _set_verbose -from MDAnalysis.lib.util import asiterable, iterable, get_weights +from MDAnalysis.lib.util import asiterable, iterable, get_weights, deprecate logger = logging.getLogger('MDAnalysis.analysis.rmsd') @@ -325,6 +326,7 @@ class RMSD(AnalysisBase): def __init__(self, atomgroup, reference=None, select='all', groupselections=None, filename="rmsd.dat", weights=None, tol_mass=0.1, ref_frame=0, **kwargs): + # DEPRECATION: remove filename kwarg in 1.0 r"""Parameters ---------- atomgroup : AtomGroup or Universe @@ -379,6 +381,10 @@ def __init__(self, atomgroup, reference=None, select='all', step between frames, default ``None`` becomes 1. filename : str (optional) write RMSD into file with :meth:`RMSD.save` + + .. deprecated:; 0.19.0 + `filename` will be removed together with :meth:`save` in 1.0. + weights : {"mass", ``None``} or array_like (optional) choose weights. With ``"mass"`` uses masses as weights; with ``None`` weigh each atom equally. If a float array of the same length as @@ -460,6 +466,8 @@ def __init__(self, atomgroup, reference=None, select='all', .. versionchanged:: 0.17.0 removed deprecated `mass_weighted` keyword; `groupselections` are *not* rotationally superimposed any more. + .. deprecated:: 0.19.0 + `filename` will be removed in 1.0 """ super(RMSD, self).__init__(atomgroup.universe.trajectory, @@ -473,7 +481,7 @@ def __init__(self, atomgroup, reference=None, select='all', self.weights = weights self.tol_mass = tol_mass self.ref_frame = ref_frame - self.filename = filename + self.filename = filename # DEPRECATED in 0.19.0, remove in 1.0.0 self.ref_atoms = self.reference.select_atoms(*select['reference']) self.mobile_atoms = self.atomgroup.select_atoms(*select['mobile']) @@ -645,6 +653,9 @@ def _single_frame(self): self._pm.rmsd = self.rmsd[self._frame_index, 2] + @deprecate(release="0.19.0", remove="1.0.0", + message="You can instead use " + "``np.savetxt(filename, RMSD.rmsd)``.") def save(self, filename=None): """Save RMSD from :attr:`RMSD.rmsd` to text file *filename*. @@ -653,6 +664,7 @@ def save(self, filename=None): filename : str (optional) if no filename is given the default provided to the constructor is used. + """ filename = filename or self.filename if filename is not None: diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index 55ae5ee71aa..a6b9d43ba15 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -585,7 +585,7 @@ def apply(self, group): mask = np.in1d(group.indices, self.grp.indices) return group[mask] - +# TODO: remove in 1.0 (should have been removed in 0.15.0) class FullSelgroupSelection(Selection): token = 'fullgroup' From cea2c379e5f82746d1c9390a2e32906d34ed1525 Mon Sep 17 00:00:00 2001 From: ayush Date: Wed, 11 Jul 2018 19:35:12 -0700 Subject: [PATCH 213/455] Added tests for minimum cutoff --- .../MDAnalysisTests/lib/test_distances.py | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index d2a87cbdfd7..e9ff40f6777 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -68,10 +68,14 @@ def test_capped_distance_noresults(): method_1 = ('bruteforce', 'pkdtree') +min_cutoff_1 = (None, 0.1) + + @pytest.mark.parametrize('box', boxes_1) @pytest.mark.parametrize('query', query_1) @pytest.mark.parametrize('method', method_1) -def test_capped_distance_checkbrute(box, query, method): +@pytest.mark.parametrize('min_cutoff', min_cutoff_1) +def test_capped_distance_checkbrute(box, query, method, min_cutoff): np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) @@ -81,15 +85,19 @@ def test_capped_distance_checkbrute(box, query, method): pairs, dist = mda.lib.distances.capped_distance(query, points, max_cutoff, + min_cutoff=min_cutoff, box=box, method=method) if(query.shape[0] == 3): - distances = mda.lib.distances.distance_array(query[None, :], - points, box=box) - else: - distances = mda.lib.distances.distance_array(query, + query = query.reshape((1, 3)) + + distances = mda.lib.distances.distance_array(query, points, box=box) - indices = np.where(distances < max_cutoff) + + if min_cutoff is None: + min_cutoff = 0. + + indices = np.where((distances < max_cutoff) & (distances > min_cutoff)) assert_equal(pairs[:, 1], indices[1]) From 7e25ea3ea1d0b88f9a1a296bc06f960f40553afb Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 12 Jul 2018 01:03:55 -0700 Subject: [PATCH 214/455] added few more tests --- .../MDAnalysisTests/lib/test_distances.py | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index e9ff40f6777..acbf375c61b 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -54,13 +54,17 @@ def test_capped_distance_noresults(): assert_equal(len(pairs), 0) +npoints_1 = (1, 100) + boxes_1 = (np.array([1, 2, 3, 90, 90, 90], dtype=np.float32), # ortho np.array([1, 2, 3, 30, 45, 60], dtype=np.float32), # tri_box triclinic_vectors( # tri_vecs np.array([1, 2, 3, 90, 90, 45], dtype=np.float32)), np.array([[0.5, 0.9, 1.9], # tri_vecs_bad [2.0, 0.4, 0.1], - [0.0, 0.6, 0.5]], dtype=np.float32)) + [0.0, 0.6, 0.5]], dtype=np.float32), + None, # Non Periodic + ) query_1 = (np.array([0.1, 0.1, 0.1], dtype=np.float32), np.array([[0.1, 0.1, 0.1], @@ -70,15 +74,15 @@ def test_capped_distance_noresults(): min_cutoff_1 = (None, 0.1) - +@pytest.mark.parametrize('npoints', npoints_1) @pytest.mark.parametrize('box', boxes_1) @pytest.mark.parametrize('query', query_1) @pytest.mark.parametrize('method', method_1) @pytest.mark.parametrize('min_cutoff', min_cutoff_1) -def test_capped_distance_checkbrute(box, query, method, min_cutoff): +def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, - size=(100, 3))*(boxes_1[0][:3])).astype(np.float32) + size=(npoints, 3))*(boxes_1[0][:3])).astype(np.float32) max_cutoff = 0.3 # capped distance should be able to handle array of vectors # as well as single vectors. @@ -88,18 +92,22 @@ def test_capped_distance_checkbrute(box, query, method, min_cutoff): min_cutoff=min_cutoff, box=box, method=method) + if pairs.shape != (0, ): + found_pairs = pairs[:, 1] + else: + found_pairs = list() + if(query.shape[0] == 3): query = query.reshape((1, 3)) distances = mda.lib.distances.distance_array(query, - points, box=box) + points, box=box) if min_cutoff is None: min_cutoff = 0. - indices = np.where((distances < max_cutoff) & (distances > min_cutoff)) - - assert_equal(pairs[:, 1], indices[1]) + + assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1],axis=0)) # different boxlengths to shift a coordinate From edc5b2dcfb06350c6ea8bff36d7a3836aeabc864 Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 12 Jul 2018 01:58:13 -0700 Subject: [PATCH 215/455] more tests --- .../MDAnalysisTests/lib/test_distances.py | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index acbf375c61b..f6e0dadf2cf 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -29,7 +29,7 @@ import MDAnalysis as mda -from MDAnalysis.lib.mdamath import triclinic_vectors +from MDAnalysis.lib.mdamath import triclinic_vectors, triclinic_box @pytest.mark.parametrize('coord_dtype', (np.float32, np.float64)) def test_transform_StoR_pass(coord_dtype): @@ -63,9 +63,10 @@ def test_capped_distance_noresults(): np.array([[0.5, 0.9, 1.9], # tri_vecs_bad [2.0, 0.4, 0.1], [0.0, 0.6, 0.5]], dtype=np.float32), - None, # Non Periodic + None, # Non Periodic ) + query_1 = (np.array([0.1, 0.1, 0.1], dtype=np.float32), np.array([[0.1, 0.1, 0.1], [0.2, 0.1, 0.1]], dtype=np.float32)) @@ -74,6 +75,7 @@ def test_capped_distance_noresults(): min_cutoff_1 = (None, 0.1) + @pytest.mark.parametrize('npoints', npoints_1) @pytest.mark.parametrize('box', boxes_1) @pytest.mark.parametrize('query', query_1) @@ -96,7 +98,7 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): found_pairs = pairs[:, 1] else: found_pairs = list() - + if(query.shape[0] == 3): query = query.reshape((1, 3)) @@ -106,8 +108,40 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): if min_cutoff is None: min_cutoff = 0. indices = np.where((distances < max_cutoff) & (distances > min_cutoff)) - - assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1],axis=0)) + + assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1], axis=0)) + + +npoints_2 = (1, 6000, 200000) + +cutoff_2 = (0.02, 0.2) + +methods = ( + '_bruteforce_capped', + '_bruteforce_capped', + '_pkdtree_capped', + '_pkdtree_capped', + '_pkdtree_capped', + '_bruteforce_capped', + ) + + +@pytest.mark.parametrize('ncm', zip(itertools.product(npoints_2, cutoff_2), methods)) +def test_method_selection(ncm): + np.random.seed(90003) + box = np.array([1, 1, 1, 90, 90, 90], dtype=np.float32) + points = (np.random.uniform(low=0, high=1.0, + size=(ncm[0][0], 3))*(box[:3])).astype(np.float32) + if box is not None: + boxtype = mda.lib.distances._box_check(box) + # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] + if (boxtype == 'tri_box'): + box = triclinic_vectors(box) + if (boxtype == 'tri_vecs_bad'): + box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) + method = mda.lib.distances._determine_method(points, points, + ncm[0][1], box=box) + assert_equal(method.__name__, ncm[1]) # different boxlengths to shift a coordinate From 9d3a2fc15efd3f99e8f5bd62610a92b06b4fa1e0 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Thu, 12 Jul 2018 10:06:35 -0500 Subject: [PATCH 216/455] Update test_distances.py --- .../MDAnalysisTests/lib/test_distances.py | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index f6e0dadf2cf..f61a30a2e37 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -112,26 +112,18 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1], axis=0)) -npoints_2 = (1, 6000, 200000) - -cutoff_2 = (0.02, 0.2) - -methods = ( - '_bruteforce_capped', - '_bruteforce_capped', - '_pkdtree_capped', - '_pkdtree_capped', - '_pkdtree_capped', - '_bruteforce_capped', - ) - - -@pytest.mark.parametrize('ncm', zip(itertools.product(npoints_2, cutoff_2), methods)) -def test_method_selection(ncm): +@pytest.mark.parametrize('npoints,cutoff,meth', + [(1, 0.02, '_bruteforce_capped'), + (1, 0.2, '_bruteforce_capped'), + (6000, 0.02, '_pkdtree_capped'), + (6000, 0.2, '_pkdtree_capped'), + (200000, 0.02, '_pkdtree_capped'), + (200000, 0.2, '_bruteforce_capped')]) +def test_method_selection(npoints, cutoff, meth): np.random.seed(90003) box = np.array([1, 1, 1, 90, 90, 90], dtype=np.float32) points = (np.random.uniform(low=0, high=1.0, - size=(ncm[0][0], 3))*(box[:3])).astype(np.float32) + size=(npoints, 3)) * (box[:3])).astype(np.float32) if box is not None: boxtype = mda.lib.distances._box_check(box) # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] @@ -140,8 +132,8 @@ def test_method_selection(ncm): if (boxtype == 'tri_vecs_bad'): box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) method = mda.lib.distances._determine_method(points, points, - ncm[0][1], box=box) - assert_equal(method.__name__, ncm[1]) + cutoff, box=box) + assert_equal(method.__name__, meth) # different boxlengths to shift a coordinate From fec060c7b122d16bef7a3a83e4eb6c17c41443f8 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Thu, 12 Jul 2018 10:17:24 -0500 Subject: [PATCH 217/455] Update GRO.py --- benchmarks/benchmarks/GRO.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/benchmarks/GRO.py b/benchmarks/benchmarks/GRO.py index 2c2b52266d4..0b4c31bf7ca 100644 --- a/benchmarks/benchmarks/GRO.py +++ b/benchmarks/benchmarks/GRO.py @@ -7,14 +7,14 @@ import MDAnalysis as mda class GROReadBench(object): - def time_read_GRO_coordinates(self): """Benchmark reading of standard testsuite GRO file.""" GROReader(GRO) def time_parse_GRO_file(self): - with GROParser(GRO) as p: - top = p.parse() + """Time to create topology from GRO file""" + p = GROParser(GRO) + top = p.parse() def time_create_GRO_universe(self): """Time to create MDA Universe of GRO""" From 06e386fcd69bddfdaf6e49a2d32fda0425a86ac2 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Thu, 12 Jul 2018 02:04:45 +0200 Subject: [PATCH 218/455] Address comments from @orbeckst on #1934 --- package/MDAnalysis/coordinates/base.py | 4 +- package/MDAnalysis/core/groups.py | 74 +++++++++++++------ .../coordinates/test_reader_api.py | 13 +++- .../MDAnalysisTests/core/test_atomgroup.py | 32 ++++++++ 4 files changed, 98 insertions(+), 25 deletions(-) diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index ca64969d289..c22db65db92 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -935,7 +935,7 @@ def __len__(self): def __iter__(self): for i in range(self.start, self.stop, self.step): - yield self.trajectory._read_frame_with_aux(i) + yield self.trajectory[i] self.trajectory.rewind() def __getitem__(self, frame): @@ -1528,7 +1528,7 @@ def __getitem__(self, frame): frame = self._apply_limits(frame) return self._read_frame_with_aux(frame) elif isinstance(frame, (list, np.ndarray)): - if isinstance(frame[0], (bool, np.bool_)): + if len(frame) != 0 and isinstance(frame[0], (bool, np.bool_)): # Avoid having list of bools frame = np.asarray(frame, dtype=np.bool) # Convert bool array to int array diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 6bddd71f9f3..f7af77f7b8b 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -2535,17 +2535,27 @@ def write(self, filename=None, file_format="PDB", """Write `AtomGroup` to a file. The output can either be a coordinate file or a selection, depending on - the `format`. Only single-frame coordinate files are supported. If you - need to write out a trajectory, see :mod:`MDAnalysis.coordinates`. + the format. + + Examples + -------- + + >>> ag = u.atoms + >>> ag.write('selection.ndx') # Write a gromacs index file + >>> ag.write('coordinates.pdb') # Write the current frame as PDB + >>> # Write the trajectory in XTC format + >>> ag.write('trajectory.xtc', frames='all') + >>> # Write every other frame of the trajectory in PBD format + >>> ag.write('trajectory.pdb', frames=u.trajectory[::2]) Parameters ---------- filename : str, optional ``None``: create TRJNAME_FRAME.FORMAT from filenamefmt [``None``] file_format : str, optional - PDB, CRD, GRO, VMD (tcl), PyMol (pml), Gromacs (ndx) CHARMM (str) - Jmol (spt); case-insensitive and can also be supplied as the - filename extension [PDB] + The name or extension of a coordinate, trajectory, or selection + file format such as PDB, CRD, GRO, VMD (tcl), PyMol (pml), Gromacs + (ndx) CHARMM (str) or Jmol (spt); case-insensitive [PDB] filenamefmt : str, optional format string for default filename; use substitution tokens 'trjname' and 'frame' ["%(trjname)s_%(frame)d"] @@ -2555,11 +2565,13 @@ def write(self, filename=None, file_format="PDB", file. ``"all"``: write out all bonds, both the original defined and those guessed by MDAnalysis. ``None``: do not write out bonds. Default is ``"conect"``. - frames: + frames: array-like or slice or FrameIteratorBase or str, optional An ensemble of frames to write. The ensemble can be an list or array of frame indices, a mask of booleans, an instance of - :class:`slice`, or an indexed trajectory. By default, 'frames' is - set to ``None`` and only the current frame is written. + :class:`slice`, or the value returned when a trajectory is indexed. + By default, `frames` is set to ``None`` and only the current frame + is written. If `frames` is set to "all", then all the frame from + trajectory are written. .. versionchanged:: 0.9.0 Merged with write_selection. This method can @@ -2567,13 +2579,19 @@ def write(self, filename=None, file_format="PDB", .. versionchanged:: 0.19.0 Can write multiframe trajectories with the 'frames' argument. """ + # TODO: Add a 'verbose' option alongside 'frames'. + # check that AtomGroup actually has any atoms (Issue #434) if len(self.atoms) == 0: raise IndexError("Cannot write an AtomGroup with 0 atoms") trj = self.universe.trajectory # unified trajectory API - if frames is None: + if frames is None or frames == 'all': trj_frames = trj[::] + elif isinstance(frames, numbers.Integral): + # We accept everything that indexes a trajectory and returns a + # subset of it. Though, numbers return a Timestep instead. + raise TypeError('The "frames" argument cannot be a number.') else: try: test_trajectory = frames.trajectory @@ -2587,20 +2605,31 @@ def write(self, filename=None, file_format="PDB", 'AtomGroup.'.format(frames) ) trj_frames = frames - if len(trj_frames) > 1 and kwargs.get("multiframe") == False: - raise ValueError( - 'Cannot explicitely set "multiframe" to False and request ' - 'more than 1 frame with the "frames" keyword argument.' - ) - - if len(trj_frames) == 1: - kwargs.setdefault("multiframe", False) if filename is None: trjname, ext = os.path.splitext(os.path.basename(trj.filename)) filename = filenamefmt.format(trjname=trjname, frame=trj.frame) filename = util.filename(filename, ext=file_format.lower(), keep=True) + # Some writer behave differently when they are given a "multiframe" + # argument. It is the case of the PDB writer tht writes models when + # "multiframe" is True. + # We want to honor what the user provided with the argument if + # provided explicitly. If not, then we need to figure out if we write + # multiple frames or not. + multiframe = kwargs.pop('multiframe', None) + if len(trj_frames) > 1 and multiframe == False: + raise ValueError( + 'Cannot explicitely set "multiframe" to False and request ' + 'more than 1 frame with the "frames" keyword argument.' + ) + elif multiframe is None: + if frames is None: + # By default we only write the current frame. + multiframe = False + else: + multiframe = len(trj_frames) > 1 + # From the following blocks, one must pass. # Both can't pass as the extensions don't overlap. # Try and select a Class using get_ methods (becomes `writer`) @@ -2613,10 +2642,7 @@ def write(self, filename=None, file_format="PDB", format = format or file_format format = format.strip().upper() - multiframe = kwargs.pop('multiframe', None) - writer = get_writer_for(filename, format=format, multiframe=multiframe) - #MDAnalysis.coordinates.writer(filename, **kwargs) except (ValueError, TypeError): pass else: @@ -2624,8 +2650,12 @@ def write(self, filename=None, file_format="PDB", if frames is None: w.write(self.atoms) else: - for _ in trj_frames: - w.write(self.atoms) + current_frame = trj.ts.frame + try: + for _ in trj_frames: + w.write(self.atoms) + finally: + trj[current_frame] return try: diff --git a/testsuite/MDAnalysisTests/coordinates/test_reader_api.py b/testsuite/MDAnalysisTests/coordinates/test_reader_api.py index 60e4f0889d9..8552a7283fa 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_reader_api.py +++ b/testsuite/MDAnalysisTests/coordinates/test_reader_api.py @@ -170,7 +170,9 @@ class TestMultiFrameReader(_Multi): (1, 5, -1), # Stop less than start (-100, None, None), (100, None, None), # Outside of range of trajectory - (-2, 10, -2) + (-2, 10, -2), + (0, 0, 1), # empty + (10, 1, 2), # empty ]) def test_slice(self, start, stop, step, reader): """Compare the slice applied to trajectory, to slice of list""" @@ -226,6 +228,8 @@ def test_getitem(self, slice_cls, sl, reader): slice(10, 0, -1), slice(2, 7, 2), slice(7, 2, -2), + slice(7, 2, 1), # empty + slice(0, 0, 1), # empty ]) def test_getitem_len(self, sl, reader): traj_iterable = reader[sl] @@ -234,6 +238,12 @@ def test_getitem_len(self, sl, reader): ref = self.reference[sl] assert len(traj_iterable) == len(ref) + @pytest.mark.parametrize('iter_type', (list, np.array)) + def test_getitem_len_empty(self, reader, iter_type): + # Indexing a numpy array with an empty array tends to break. + traj_iterable = reader[iter_type([])] + assert len(traj_iterable) == 0 + # All the sl1 slice must be 5 frames long so that the sl2 can be a mask @pytest.mark.parametrize('sl1', [ [0, 1, 2, 3, 4], @@ -271,6 +281,7 @@ def test_double_getitem(self, sl1, sl2, reader): [True, False, ] * 5, slice(None, None, 2), slice(None, None, -2), + slice(None, None, None), ]) @pytest.mark.parametrize('idx2', [0, 2, 4, -1, -2, -4]) def test_double_getitem_int(self, sl1, idx2, reader): diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index 4c98d4beeee..e1c7e115cd1 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -153,6 +153,31 @@ def test_write_frame_iterator(self, u, tmpdir, frames): assert_array_almost_equal(new_positions, ref_positions) + @pytest.mark.parametrize('extension', ('xtc', 'dcd', 'pdb', 'xyz')) + def test_write_frame_none(self, u, tmpdir, extension): + destination = str(tmpdir / 'test.' + extension) + u.atoms.write(destination, frames=None) + u_new = mda.Universe(destination) + new_positions = np.stack([ts.positions for ts in u_new.trajectory]) + # Most format only save 3 decimals; XTC even has only 2. + assert_array_almost_equal( + u.atoms.positions[None, ...], new_positions, decimal=2 + ) + + def test_write_frames_all(self, u, tmpdir): + destination = str(tmpdir / 'test.dcd') + u.atoms.write(destination, frames='all') + u_new = mda.Universe(destination) + ref_positions = np.stack([ts.positions for ts in u.trajectory]) + new_positions = np.stack([ts.positions for ts in u_new.trajectory]) + assert_array_almost_equal(new_positions, ref_positions) + + @pytest.mark.parametrize('frames', ('invalid', 8, True, False, 3.2)) + def test_write_frames_invalid(self, u, tmpdir, frames): + destination = str(tmpdir / 'test.dcd') + with pytest.raises(TypeError): + u.atoms.write(destination, frames=frames) + def test_incompatible_arguments(self, u, tmpdir): destination = str(tmpdir / 'test.dcd') with pytest.raises(ValueError): @@ -166,6 +191,13 @@ def test_incompatible_trajectories(self, tmpdir): with pytest.raises(ValueError): u1.atoms.write(destination, frames=u2.trajectory) + def test_write_no_traj_move(self, u, tmpdir): + destination = str(tmpdir / 'test.dcd') + u.trajectory[10] + u.atoms.write(destination, frames=[1, 2, 3]) + assert u.trajectory.ts.frame == 10 + + def test_write_selection(self, u, tmpdir): with tmpdir.as_cwd(): u.atoms.write("test.vmd") From 62a194f2895bca7b66f8198bbc001ab6df820ad0 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Tue, 10 Jul 2018 14:41:39 -0700 Subject: [PATCH 219/455] First commit of dihedrals.py --- package/MDAnalysis/analysis/dihedrals.py | 60 ++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 package/MDAnalysis/analysis/dihedrals.py diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py new file mode 100644 index 00000000000..612d55ec1bf --- /dev/null +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -0,0 +1,60 @@ +def dihedral_calc(atomgroups): + """Calculates phi and psi angles for a list of AtomGroups over trajectory. + + Parameters + ---------- + atomgroups : list of AtomGroups + must be a list of one or more AtomGroups containing 5 atoms in the + correct order (i.e. C-N-CA-C-N) + + Returns + ------- + angles : numpy.ndarray + An array of time steps which contain (phi,psi) for all AtomGroups. + """ + + dihedrals = [atomgroup.dihedral for atomgroup in atomgroups] + angles = np.array([dih.value() for dih in dihedrals]) + + return angles + + +class Ramachandran(AnalysisBase): + """ + """ + def __init__(self, atomgroup, **kwargs): + r""" + """ + super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) + self.atomgroup = atomgroup + + def run(self, start=None, stop=None, step=None, verbose=None, quiet=None): + """Perform the analysis.""" + + if any([el is not None for el in (start, stop, step, quiet)]): + warnings.warn("run arguments are deprecated. Please pass them at " + "class construction. These options will be removed in 0.17.0", + category=DeprecationWarning) + verbose = _set_verbose(verbose, quiet, default=False) + # regenerate class with correct args + super(Ramachandran, self).__init__(self.atomgroup.universe.trajectory, + start=start, stop=stop, step=step, + verbose=verbose) + return super(RMSF, self).run() + + def _prepare(self): + self.protein = self.atomgroup.universe.atoms.select_atoms("protein") + self.resids = self.atomgroup.residues.resids + self.phi_atoms = [self.protein.residues[resid-1].phi_selection() + for resid in self.resids + if 1 < resid < len(self.protein.residues)] + self.psi_atoms = [self.protein.rseidues[resid-1].psi_selection() + for resid in self.resids + if 1 < resid < len(self.protein.residues)] + + def _single_frame(self): + self.phi_angles = [dihedral_calc(atoms) for atoms in self.phi_atoms] + self.psi_angles = [dihedral_calc(atoms) for atoms in self.psi_atoms] + + def _conclude(self): + self.angles = np.array(self.phi_angles,self.psi_angles) From 30da78311e2ac87d6d83852d8127f5ff5605dada Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Tue, 10 Jul 2018 14:50:23 -0700 Subject: [PATCH 220/455] added imports to dihedrals.py --- package/MDAnalysis/analysis/dihedrals.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 612d55ec1bf..2a52112fad0 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -1,3 +1,17 @@ +from six.moves import zip +from six import string_types +import numpy as np +import logging +import warnings + + +import MDAnalysis.lib.qcprot as qcp +from MDAnalysis.analysis.base import AnalysisBase +from MDAnalysis.exceptions import SelectionError, NoDataError +from MDAnalysis.lib.log import ProgressMeter, _set_verbose +from MDAnalysis.lib.util import asiterable, iterable, get_weights + + def dihedral_calc(atomgroups): """Calculates phi and psi angles for a list of AtomGroups over trajectory. From 1f149adffa70538be6a4297c8f149670117273b5 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Tue, 10 Jul 2018 16:28:28 -0700 Subject: [PATCH 221/455] fixed calculation errors and added plot function --- package/MDAnalysis/analysis/dihedrals.py | 29 +++++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 2a52112fad0..db15a1d8802 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -12,6 +12,8 @@ from MDAnalysis.lib.util import asiterable, iterable, get_weights +import numpy as np + def dihedral_calc(atomgroups): """Calculates phi and psi angles for a list of AtomGroups over trajectory. @@ -28,7 +30,7 @@ def dihedral_calc(atomgroups): """ dihedrals = [atomgroup.dihedral for atomgroup in atomgroups] - angles = np.array([dih.value() for dih in dihedrals]) + angles = [dih.value() for dih in dihedrals] return angles @@ -54,7 +56,7 @@ def run(self, start=None, stop=None, step=None, verbose=None, quiet=None): super(Ramachandran, self).__init__(self.atomgroup.universe.trajectory, start=start, stop=stop, step=step, verbose=verbose) - return super(RMSF, self).run() + return super(Ramachandran, self).run() def _prepare(self): self.protein = self.atomgroup.universe.atoms.select_atoms("protein") @@ -62,13 +64,28 @@ def _prepare(self): self.phi_atoms = [self.protein.residues[resid-1].phi_selection() for resid in self.resids if 1 < resid < len(self.protein.residues)] - self.psi_atoms = [self.protein.rseidues[resid-1].psi_selection() + self.psi_atoms = [self.protein.residues[resid-1].psi_selection() for resid in self.resids if 1 < resid < len(self.protein.residues)] + self.angles = [] def _single_frame(self): - self.phi_angles = [dihedral_calc(atoms) for atoms in self.phi_atoms] - self.psi_angles = [dihedral_calc(atoms) for atoms in self.psi_atoms] + self.phi_angles = dihedral_calc(self.phi_atoms) + self.psi_angles = dihedral_calc(self.psi_atoms) + self.angles.append((self.phi_angles,self.psi_angles)) def _conclude(self): - self.angles = np.array(self.phi_angles,self.psi_angles) + self.angles = np.array(self.angles) + + def plot(self): + fig = plt.figure(figsize=(10,10)) + ax1 = plt.subplot(111) + ax1.axis([-180,180,-180,180]) + ax1.axhline(0, color='k', lw=1) + ax1.axvline(0, color='k', lw=1) + plt.xticks(np.arange(-180,181,60)) + plt.yticks(np.arange(-180,181,60)) + plt.xlabel(r"$\phi$ (deg)") + plt.ylabel(r"$\psi$ (deg)") + for angles in self.angles: + ax1.plot(angles[0],angles[1],'ks') From 13ee8a0fa9eeea4f1ab30d3deec37c70607f38e0 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 11 Jul 2018 09:30:29 -0700 Subject: [PATCH 222/455] Added docstring to dihedrals function --- package/MDAnalysis/analysis/dihedrals.py | 41 +++++++++++++++--------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index db15a1d8802..d773bb659ca 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -1,18 +1,7 @@ -from six.moves import zip -from six import string_types -import numpy as np -import logging -import warnings - - -import MDAnalysis.lib.qcprot as qcp from MDAnalysis.analysis.base import AnalysisBase -from MDAnalysis.exceptions import SelectionError, NoDataError -from MDAnalysis.lib.log import ProgressMeter, _set_verbose -from MDAnalysis.lib.util import asiterable, iterable, get_weights - - import numpy as np +import matplotlib.pyplot as plt + def dihedral_calc(atomgroups): """Calculates phi and psi angles for a list of AtomGroups over trajectory. @@ -36,10 +25,32 @@ def dihedral_calc(atomgroups): class Ramachandran(AnalysisBase): - """ + """Calculate phi and psi dihedral angles of specified residues. + + Note + ---- + Run the analysis with :meth:`Ramachandran.run()`, which stores the results + in the array :attr:`Ramachandran.angles`. A basic plot can be obtained + with :meth: `Ramachandran.run().plot()`. + """ def __init__(self, atomgroup, **kwargs): - r""" + r"""Parameters + ---------- + atomgroup : Atomgroup + atoms for residues for which phi and psi are calculated + start : int (optional) + starting frame, default None becomes 0. + stop : int (optional) + Frame index to stop analysis. Default: None becomes + n_frames. Iteration stops *before* this frame number, + which means that the trajectory would be read until the end. + step : int (optional) + step between frames, default None becomes 1. + verbose : bool (optional) + Show detailed progress of the calculation if set to ``True``; the + default is ``False``. + """ super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) self.atomgroup = atomgroup From 50d8687f07ac978ba18219e0a3f873015617dac6 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Thu, 12 Jul 2018 16:45:25 -0700 Subject: [PATCH 223/455] Update issue templates GitHub provides more fine grained control over issue templates. I used our standard template for *Bug report*, used their suggestion for *Feature request*, and created one for *Questions* which tells people to use the mailing list! --- .github/ISSUE_TEMPLATE/bug_report.md | 35 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 17 +++++++++++ .github/ISSUE_TEMPLATE/questions.md | 24 ++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/questions.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000000..318de99eb9e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,35 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**Expected behavior** + +A clear and concise description of what you want to do and what you think should happen. (Code to reproduce the behavior can be added below). + + +**Actual behavior** + +What happened instead. Add as much detail as you can. Include (copy and paste) stack traces and any output. + + +**Code to reproduce the behavior** + +Show us how to reproduce the failiure. If you can, use trajectory files from the test data. + +``` python +import MDAnalysis as mda +from MDAnalysis.tests.datafiles import PSF, DCD, GRO, PDB, TPR, XTC, TRR, PRMncdf, NCDF + +u = mda.Universe(PSF, DCD) + +.... + +``` + +**Currently version of MDAnalysis** + +- Which version are you using? (run `python -c "import MDAnalysis as mda; print(mda.__version__)"`) +- Which version of Python (`python -V`)? +- Which operating system? diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..066b2d920a2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/questions.md b/.github/ISSUE_TEMPLATE/questions.md new file mode 100644 index 00000000000..d8d1762199b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/questions.md @@ -0,0 +1,24 @@ +--- +name: Questions +about: If you want to ask a question please use the mailing list! + +--- + +If you have a **QUESTION** such as + +- how to use MDAnalysis in general +- how to accomplish something specific, +- what output means +- ... or similar questions related to USING MDAnalysis + +then please *ask this question on the user mailing list* + + https://groups.google.com/forum/#!forum/mdnalysis-discussion + +The issue tracker is meant for DEFECTS ("BUGS"), new FEATURES, and decisions on the API. In order to keep the volume of work on the issue tracker manageable for our volunteer developers, we will IMMEDIATELY CLOSE ISSUES THAT ARE BETTER ANSWERED ON THE USER MAILINGLIST. + +We really appreciate you as a user getting in touch with us --- no matter what you want to discuss. But we need your help keeping the amount of work manageable so please use the mailing list for questions and the issue tracker for code-related issues. + +Thank you! + +The MDAnalysis Development Team From abbc3efb3bcf95125ef8c0d566ae67e8cb388272 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 13 Jul 2018 14:33:40 -0700 Subject: [PATCH 224/455] updated plot function, simplified preparation --- package/MDAnalysis/analysis/dihedrals.py | 87 ++++++++++++------------ 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index d773bb659ca..3b8a24f1c42 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -1,7 +1,7 @@ -from MDAnalysis.analysis.base import AnalysisBase import numpy as np import matplotlib.pyplot as plt +from MDAnalysis.analysis.base import AnalysisBase def dihedral_calc(atomgroups): """Calculates phi and psi angles for a list of AtomGroups over trajectory. @@ -30,8 +30,8 @@ class Ramachandran(AnalysisBase): Note ---- Run the analysis with :meth:`Ramachandran.run()`, which stores the results - in the array :attr:`Ramachandran.angles`. A basic plot can be obtained - with :meth: `Ramachandran.run().plot()`. + in the array :attr:`Ramachandran.angles`. A axes object can be obtained + with :meth: `Ramachandran.run().plot()`. """ def __init__(self, atomgroup, **kwargs): @@ -39,45 +39,23 @@ def __init__(self, atomgroup, **kwargs): ---------- atomgroup : Atomgroup atoms for residues for which phi and psi are calculated - start : int (optional) + start : int, optional starting frame, default None becomes 0. - stop : int (optional) + stop : int, optional Frame index to stop analysis. Default: None becomes n_frames. Iteration stops *before* this frame number, which means that the trajectory would be read until the end. - step : int (optional) + step : int, optional step between frames, default None becomes 1. - verbose : bool (optional) - Show detailed progress of the calculation if set to ``True``; the - default is ``False``. """ super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) self.atomgroup = atomgroup - def run(self, start=None, stop=None, step=None, verbose=None, quiet=None): - """Perform the analysis.""" - - if any([el is not None for el in (start, stop, step, quiet)]): - warnings.warn("run arguments are deprecated. Please pass them at " - "class construction. These options will be removed in 0.17.0", - category=DeprecationWarning) - verbose = _set_verbose(verbose, quiet, default=False) - # regenerate class with correct args - super(Ramachandran, self).__init__(self.atomgroup.universe.trajectory, - start=start, stop=stop, step=step, - verbose=verbose) - return super(Ramachandran, self).run() - def _prepare(self): - self.protein = self.atomgroup.universe.atoms.select_atoms("protein") - self.resids = self.atomgroup.residues.resids - self.phi_atoms = [self.protein.residues[resid-1].phi_selection() - for resid in self.resids - if 1 < resid < len(self.protein.residues)] - self.psi_atoms = [self.protein.residues[resid-1].psi_selection() - for resid in self.resids - if 1 < resid < len(self.protein.residues)] + self.residues = self.atomgroup.residues + self.phi_atoms = [residue.phi_selection() for residue in self.residues] + self.psi_atoms = [residue.psi_selection() for residue in self.residues] self.angles = [] def _single_frame(self): @@ -88,15 +66,40 @@ def _single_frame(self): def _conclude(self): self.angles = np.array(self.angles) - def plot(self): - fig = plt.figure(figsize=(10,10)) - ax1 = plt.subplot(111) - ax1.axis([-180,180,-180,180]) - ax1.axhline(0, color='k', lw=1) - ax1.axvline(0, color='k', lw=1) - plt.xticks(np.arange(-180,181,60)) - plt.yticks(np.arange(-180,181,60)) - plt.xlabel(r"$\phi$ (deg)") - plt.ylabel(r"$\psi$ (deg)") + def plot(self, ax=None, color='k', marker='s', title=None): + """Plots data into standard ramachandran plot. Each time step in + self.angles is plotted onto the same graph. + + Parameters + ---------- + ax : :class:`matplotlib.axes.Axes` + If no `ax` is supplied or set to ``None`` then the plot will + be added to the current active axes. + color : string, optional + Color used for markers in the plot; the default color is 'black'. + marker : string, optional + Marker used in plot; the default marker is 'square'. + title : string, optional + Title of axes object; the default `None` leaves plot without a + title. + + Returns + ------- + ax : :class:`~matplotlib.axes.Axes` + Axes with the plot, either `ax` or the current axes. + + """ + if ax is None: + ax = plt.gca() + ax.axis([-180,180,-180,180]) + ax.axhline(0, color='k', lw=1) + ax.axvline(0, color='k', lw=1) + ax.set_xticks(range(-180,181,60)) + ax.set_yticks(range(-180,181,60)) + ax.set_xlabel(r"$\phi$ (deg)") + ax.set_ylabel(r"$\psi$ (deg)") + if title is not None: + ax.set_title(title) for angles in self.angles: - ax1.plot(angles[0],angles[1],'ks') + ax.plot(angles[0],angles[1], color=color, + marker=marker, linestyle='') From 973910c9caa3d776b7e7d8439d96ee68de5102f7 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 13 Jul 2018 16:57:35 -0700 Subject: [PATCH 225/455] Added IndexErrors to function --- package/MDAnalysis/analysis/dihedrals.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 3b8a24f1c42..d9551b8a315 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -54,8 +54,16 @@ def __init__(self, atomgroup, **kwargs): def _prepare(self): self.residues = self.atomgroup.residues - self.phi_atoms = [residue.phi_selection() for residue in self.residues] - self.psi_atoms = [residue.psi_selection() for residue in self.residues] + res_min = np.min(self.atomgroup.universe.select_atoms("protein").resids) + res_max = np.max(self.atomgroup.universe.select_atoms("protein").resids) + if any([(resid < res_min) or (resid > res_max) for resid in self.residues.resids]): + raise IndexError("Selection outside of protein") + elif any([resid == (res_min or res_max) for resid in self.residues.resids]): + raise IndexError("Cannot determine phi and psi angles for the first or last residues") + else: + self.phi_atoms = [residue.phi_selection() for residue in self.residues] + self.psi_atoms = [residue.psi_selection() for residue in self.residues] + self.angles = [] def _single_frame(self): From 900b09c6be9bd472da6c1e40409be72a13dbf188 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 14 Jul 2018 14:56:55 -0700 Subject: [PATCH 226/455] added Augment functionality, tests, modified CHANGELOG --- package/CHANGELOG | 1 + package/MDAnalysis/lib/_augment.pyx | 307 ++++++++++++++++++ package/setup.py | 9 +- testsuite/MDAnalysisTests/lib/test_augment.py | 99 ++++++ 4 files changed, 415 insertions(+), 1 deletion(-) create mode 100644 package/MDAnalysis/lib/_augment.pyx create mode 100644 testsuite/MDAnalysisTests/lib/test_augment.py diff --git a/package/CHANGELOG b/package/CHANGELOG index 3582194490c..401adc96c89 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,6 +20,7 @@ The rules for this file: Enhancements + * Added augment functionality to handle periodic boundary conditions (PR #1977) * Added lib.distances.capped_distance function to quickly calculate all distances up to a given maximum distance (PR #1941) * Added a rotation coordinate transformation (PR #1937) diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx new file mode 100644 index 00000000000..67166d1bf11 --- /dev/null +++ b/package/MDAnalysis/lib/_augment.pyx @@ -0,0 +1,307 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +# + +import cython +import numpy +cimport numpy + +from libcpp.vector cimport vector +from libc.math cimport sqrt + +__all__ = ['augment', 'undo_augment'] + +@cython.boundscheck(False) +@cython.wraparound(False) +def augment(float[:, ::1] coordinates, float[:, ::1] dm, float r): + """Calculate augmented coordinate set + + Parameters + ---------- + coordinates : array + Input coordinate array to generate duplicate images + dm : array + Real space box vectors in a matrix with shape (3, 3) + Vectors `[[a], [b], [c]]` are box vectors + r : float + thickness of cutoff region for duplicate image generation + + Returns + ------- + output : array + coordinates of duplicates generated due to periodic boundary conditions + indices : array + original indices of the augmented coordinates + """ + cdef bint lo_x, hi_x, lo_y, hi_y, lo_z, hi_z + cdef int i, j, p, N + cdef float norm + cdef float shiftX[3] + cdef float shiftY[3] + cdef float shiftZ[3] + cdef float coord[3] + cdef float end[3] + cdef float other[3] + cdef float[:, ::1] reciprocal = numpy.zeros((3, 3), dtype=numpy.float32) + for i in range(3): + shiftX[i] = dm[0, i] + shiftY[i] = dm[1, i] + shiftZ[i] = dm[2, i] + end[i] = dm[0, i] + dm[1, i] + dm[2, i] + # Calculate reciprocal vectors + _cross(&dm[1, 0], &dm[2, 0], &reciprocal[0, 0]) + _cross(&dm[2, 0], &dm[0, 0], &reciprocal[1, 0]) + _cross(&dm[0, 0], &dm[1, 0], &reciprocal[2, 0]) + # Normalize + for i in range(3): + norm = _norm(&reciprocal[i, 0]) + for j in range(3): + reciprocal[i, j] = reciprocal[i, j]/norm + + N = coordinates.shape[0] + + cdef vector[float] output + cdef vector[int] indices + + for i in range(0, N): + for j in range(3): + coord[j] = coordinates[i, j] + other[j] = end[j] - coordinates[i, j] + # identify the condition + lo_x = _dot(&coord[0], &reciprocal[0, 0]) <= r + hi_x = _dot(&other[0], &reciprocal[0, 0]) <= r + lo_y = _dot(&coord[0], &reciprocal[1, 0]) <= r + hi_y = _dot(&other[0], &reciprocal[1, 0]) <= r + lo_z = _dot(&coord[0], &reciprocal[2, 0]) <= r + hi_z = _dot(&other[0], &reciprocal[2, 0]) <= r + + if lo_x: + # if X, face piece + for j in range(3): + # add to output + output.push_back(coord[j] + shiftX[j]) + # keep record of which index this augmented + # position was created from + indices.push_back(i) + + if lo_y: + # if X&Y, edge piece + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + # if X&Y&Z, corner piece + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_x: + for j in range(3): + output.push_back(coord[j] - shiftX[j]) + indices.push_back(i) + + if lo_y: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftZ[j]) + indices.push_back(i) + + if lo_y: + for j in range(3): + output.push_back(coord[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftZ[j]) + indices.push_back(i) + n = indices.size() + return numpy.asarray(output, dtype=numpy.float32).reshape(n, 3), numpy.asarray(indices, dtype=numpy.int32) + + +@cython.boundscheck(False) +@cython.wraparound(False) +cdef float _dot(float * a, float * b): + """Return dot product of two sequences in range.""" + cdef ssize_t n + cdef float sum1 + + sum1 = 0.0 + for n in range(3): + sum1 += a[n] * b[n] + return sum1 + + +@cython.boundscheck(False) +@cython.wraparound(False) +cdef void _cross(float * a, float * b, float * result): + """ + Calculates the cross product between vectors + given by pointers a and b + + Note + ---- + Modifies the result array + """ + + result[0] = a[1]*b[2] - a[2]*b[1] + result[1] = - a[0]*b[2] + a[2]*b[0] + result[2] = a[0]*b[1] - a[1]*b[0] + +cdef float _norm(float * a): + """ + Calculates the magnitude of the vector + """ + cdef float result + cdef ssize_t n + result = 0.0 + for n in range(3): + result += a[n]*a[n] + return sqrt(result) + + +@cython.boundscheck(False) +@cython.wraparound(False) +def undo_augment(int[:] results, int[:] translation, int nreal): + """Translate augmented indices back to originals + + Parameters + ---------- + results : ndarray of ints + indices of coordinates, including "augmented" indices + translation : ndarray of ints + original indices of augmented coordinates + nreal : int + number of real coordinates, ie values in results equal or larger + than this need to be translated to their real counterpart + + Returns + ------- + results : ndarray of ints + + Note + ---- + Modifies the results array + + """ + cdef int N + N = results.shape[0] + + for i in range(N): + if results[i] >= nreal: + results[i] = translation[results[i] - nreal] + return results diff --git a/package/setup.py b/package/setup.py index 4712e674d89..be8bd705b13 100755 --- a/package/setup.py +++ b/package/setup.py @@ -353,6 +353,13 @@ def extensions(config): include_dirs=include_dirs + ['MDAnalysis/lib/include'], define_macros=define_macros, extra_compile_args=cpp_extra_compile_args) + aug = MDAExtension('MDAnalysis.lib._augment', + sources=['MDAnalysis/lib/_augment' + source_suffix], + language='c++', + libraries=mathlib, + include_dirs=include_dirs, + define_macros=define_macros, + extra_compile_args=cpp_extra_compile_args) encore_utils = MDAExtension('MDAnalysis.analysis.encore.cutils', @@ -376,7 +383,7 @@ def extensions(config): extra_compile_args=extra_compile_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, - ap_clustering, spe_dimred, cutil] + ap_clustering, spe_dimred, cutil, aug] cython_generated = [] if use_cython: diff --git a/testsuite/MDAnalysisTests/lib/test_augment.py b/testsuite/MDAnalysisTests/lib/test_augment.py new file mode 100644 index 00000000000..4175f5ee9eb --- /dev/null +++ b/testsuite/MDAnalysisTests/lib/test_augment.py @@ -0,0 +1,99 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 + +from __future__ import absolute_import + +import pytest +import numpy as np +from numpy.testing import assert_almost_equal, assert_equal +from itertools import product + +from MDAnalysis.lib._augment import augment, undo_augment +from MDAnalysis.lib.distances import apply_PBC, transform_StoR +from MDAnalysis.lib.mdamath import triclinic_vectors + +boxes = ([10, 10, 10, 90, 90, 90], # ortho + [10, 10, 10, 45, 60, 90]) # tri_box + +# Find images for several query points, +# here in fractional coordinates using augment +queries = ([0.1, 0.5, 0.5], # box face + [0.5, 0.5, 0.5], # box center + [0.5, -0.1, 0.5], # box face + [0.1, 0.1, 0.5], # box edge + [0.5, -0.1, 1.1], # box edge + [0.1, 0.1, 0.1], # box vertex + [0.1, -0.1, 1.1], # box vertex + [2.1, -3.1, 0.1] # box vertex + ) + +# Images for the previous query vectors, here in fractional coordinates. +images = (([1.1, 0.5, 0.5],), + (), + ([0.5, -0.1, 0.5],), + ([1.1, 0.1, 0.5], [0.1, 1.1, 0.5], [1.1, 1.1, 0.5]), + ([0.5, -0.1, 0.1], [0.5, 0.9, 1.1], [0.5, -0.1, 1.1]), + ([1.1, 0.1, 0.1], [0.1, 1.1, 0.1], [0.1, 0.1, 1.1], + [0.1, 1.1, 1.1], [1.1, 1.1, 0.1], [1.1, 0.1, 1.1], + [1.1, 1.1, 1.1]), + ([1.1, 0.9, 0.1], [0.1, -0.1, 0.1], [0.1, 0.9, 1.1], + [0.1, -0.1, 1.1], [1.1, -0.1, 0.1], [1.1, 0.9, 1.1], + [1.1, -0.1, 1.1]), + ([1.1, 0.9, 0.1], [0.1, -0.1, 0.1], [0.1, 0.9, 1.1], + [0.1, -0.1, 1.1], [1.1, -0.1, 0.1], [1.1, 0.9, 1.1], + [1.1, -0.1, 1.1])) + +radius = 1.5 + + +@pytest.mark.parametrize('b, qres', product(boxes, zip(queries, images))) +def test_augment(b, qres): + b = np.array(b, dtype=np.float32) + q = transform_StoR(np.array(qres[0], dtype=np.float32), b) + if q.shape == (3, ): + q = q.reshape((1, 3)) + q = apply_PBC(q, b) + dm = triclinic_vectors(b) + aug, mapping = augment(q, dm, radius) + if aug.size > 0: + aug = np.sort(aug, axis=0) + else: + aug = list() + cs = transform_StoR(np.array(qres[1], dtype=np.float32), b) + if cs.size > 0: + cs = np.sort(cs, axis=0) + else: + cs = list() + assert_almost_equal(aug, cs, decimal=5) + + +@pytest.mark.parametrize('b, qres', product(boxes, zip(queries, images))) +def test_undoaugment(b, qres): + b = np.array(b, dtype=np.float32) + q = transform_StoR(np.array(qres[0], dtype=np.float32), b) + if q.shape == (3, ): + q = q.reshape((1, 3)) + q = apply_PBC(q, b) + dm = triclinic_vectors(b) + aug, mapping = augment(q, dm, radius) + for idx, val in enumerate(aug): + imageid = np.asarray([len(q) + idx], dtype=np.int32) + assert_equal(mapping[idx], undo_augment(imageid, mapping, len(q))[0]) From 8c8edc73d2a68d9b507fa3449a3026c7a0ffdb28 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 14 Jul 2018 15:12:20 -0700 Subject: [PATCH 227/455] Added a testcase for multiple queries --- testsuite/MDAnalysisTests/lib/test_augment.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_augment.py b/testsuite/MDAnalysisTests/lib/test_augment.py index 4175f5ee9eb..687285510cd 100644 --- a/testsuite/MDAnalysisTests/lib/test_augment.py +++ b/testsuite/MDAnalysisTests/lib/test_augment.py @@ -42,7 +42,9 @@ [0.5, -0.1, 1.1], # box edge [0.1, 0.1, 0.1], # box vertex [0.1, -0.1, 1.1], # box vertex - [2.1, -3.1, 0.1] # box vertex + [2.1, -3.1, 0.1], # box vertex + [[0.1, 0.5, 0.5], + [0.5, -0.1, 0.5]] #Multiple vectors ) # Images for the previous query vectors, here in fractional coordinates. @@ -59,7 +61,8 @@ [1.1, -0.1, 1.1]), ([1.1, 0.9, 0.1], [0.1, -0.1, 0.1], [0.1, 0.9, 1.1], [0.1, -0.1, 1.1], [1.1, -0.1, 0.1], [1.1, 0.9, 1.1], - [1.1, -0.1, 1.1])) + [1.1, -0.1, 1.1]), + ([1.1, 0.5, 0.5], [0.5, -0.1, 0.5])) radius = 1.5 From 0eac39b8d2a7a485965f841f9151ea7ae781edbb Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 14 Jul 2018 18:22:48 -0700 Subject: [PATCH 228/455] Modified documentation, changed the name of function --- package/CHANGELOG | 4 +- package/MDAnalysis/lib/_augment.pyx | 88 ++++++++++++++----- testsuite/MDAnalysisTests/lib/test_augment.py | 12 ++- 3 files changed, 75 insertions(+), 29 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 401adc96c89..e7b96464c60 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,7 +20,9 @@ The rules for this file: Enhancements - * Added augment functionality to handle periodic boundary conditions (PR #1977) + * Added augment functionality to create relevant images of particles + in the vicinity of central cell to handle periodic boundary + conditions (PR #1977) * Added lib.distances.capped_distance function to quickly calculate all distances up to a given maximum distance (PR #1941) * Added a rotation coordinate transformation (PR #1937) diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index 67166d1bf11..693a534b2bc 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -22,38 +22,74 @@ # import cython -import numpy -cimport numpy +import numpy as np +from .mdamath import triclinic_vectors from libcpp.vector cimport vector from libc.math cimport sqrt -__all__ = ['augment', 'undo_augment'] +__all__ = ['augment_coordinates', 'undo_augment'] + @cython.boundscheck(False) @cython.wraparound(False) -def augment(float[:, ::1] coordinates, float[:, ::1] dm, float r): - """Calculate augmented coordinate set +def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): + """Calculates the relevant images of particles which are within a + distance 'r' from the box walls + + Only the relevant images are generated i.e. for every set of + coordinates close to the box boundary, + corresponding images which are close to the opposite face and + outside the central cell are generated. If the particle + is close to more than one box walls, + images along the diagonals are also generated :: + + + | x x + +---------------+ | +---------------+ + | | | | | + | | | | | + | | | | | + | o | | x | o | + +---------------+ | +---------------+ + | Parameters ---------- coordinates : array Input coordinate array to generate duplicate images - dm : array - Real space box vectors in a matrix with shape (3, 3) - Vectors `[[a], [b], [c]]` are box vectors + in the vicinity of the central cell. All the coordinates + must be within the primary unit cell. + box : array + Box dimension of shape (6, ). The dimensions must be + provided in the same format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx, ly, lz, alpha, beta, gamma]`` r : float thickness of cutoff region for duplicate image generation Returns ------- output : array - coordinates of duplicates generated due to periodic boundary conditions + coordinates of duplicate(augmented) particles indices : array original indices of the augmented coordinates + A map which translates the indices of augmented particles + to their original particle index such that + ``indices[augmentedindex] = originalindex`` + + Note + ---- + Output doesnot return coordinates from the initial array. + Use `np.concatenate(coordinates, output)` to merge particle + coordinates as well as their images. + + .. SeeAlso:: :func:'MDAnalysis.lib._augment.undo_augment' + + .. versionadded:: 0.19.0 """ cdef bint lo_x, hi_x, lo_y, hi_y, lo_z, hi_z - cdef int i, j, p, N + cdef int i, j, N cdef float norm cdef float shiftX[3] cdef float shiftY[3] @@ -61,7 +97,11 @@ def augment(float[:, ::1] coordinates, float[:, ::1] dm, float r): cdef float coord[3] cdef float end[3] cdef float other[3] - cdef float[:, ::1] reciprocal = numpy.zeros((3, 3), dtype=numpy.float32) + cdef float[:, ::1] dm = np.zeros((3, 3), dtype=np.float32) + cdef float[:, ::1] reciprocal = np.zeros((3, 3), dtype=np.float32) + + dm = triclinic_vectors(box) + for i in range(3): shiftX[i] = dm[0, i] shiftY[i] = dm[1, i] @@ -82,7 +122,7 @@ def augment(float[:, ::1] coordinates, float[:, ::1] dm, float r): cdef vector[float] output cdef vector[int] indices - for i in range(0, N): + for i in range(N): for j in range(3): coord[j] = coordinates[i, j] other[j] = end[j] - coordinates[i, j] @@ -230,13 +270,13 @@ def augment(float[:, ::1] coordinates, float[:, ::1] dm, float r): output.push_back(coord[j] - shiftZ[j]) indices.push_back(i) n = indices.size() - return numpy.asarray(output, dtype=numpy.float32).reshape(n, 3), numpy.asarray(indices, dtype=numpy.int32) + return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int32) @cython.boundscheck(False) @cython.wraparound(False) cdef float _dot(float * a, float * b): - """Return dot product of two sequences in range.""" + """Return dot product of two 3d vectors""" cdef ssize_t n cdef float sum1 @@ -250,8 +290,7 @@ cdef float _dot(float * a, float * b): @cython.wraparound(False) cdef void _cross(float * a, float * b, float * result): """ - Calculates the cross product between vectors - given by pointers a and b + Calculates the cross product between 3d vectors Note ---- @@ -277,31 +316,38 @@ cdef float _norm(float * a): @cython.boundscheck(False) @cython.wraparound(False) def undo_augment(int[:] results, int[:] translation, int nreal): - """Translate augmented indices back to originals + """Translate augmented indices back to original indices Parameters ---------- results : ndarray of ints indices of coordinates, including "augmented" indices translation : ndarray of ints - original indices of augmented coordinates + Map to link the augmented indices to the original particle indices + such that ``translation[augmentedindex] = originalindex`` nreal : int - number of real coordinates, ie values in results equal or larger + number of real coordinates, i.e. values in results equal or larger than this need to be translated to their real counterpart Returns ------- results : ndarray of ints + modified input results with all the augmented indices + translated to their corresponding initial original indices Note ---- - Modifies the results array + Modifies the results array in place + + .. SeeAlso:: :func:'MDAnalysis.lib._augment.augment_coordinates' + .. versionadded:: 0.19.0 """ cdef int N + cdef ssize_t i N = results.shape[0] for i in range(N): if results[i] >= nreal: results[i] = translation[results[i] - nreal] - return results + return np.asarray(results, dtype=np.int) diff --git a/testsuite/MDAnalysisTests/lib/test_augment.py b/testsuite/MDAnalysisTests/lib/test_augment.py index 687285510cd..881e275dcd1 100644 --- a/testsuite/MDAnalysisTests/lib/test_augment.py +++ b/testsuite/MDAnalysisTests/lib/test_augment.py @@ -26,9 +26,8 @@ from numpy.testing import assert_almost_equal, assert_equal from itertools import product -from MDAnalysis.lib._augment import augment, undo_augment +from MDAnalysis.lib._augment import augment_coordinates, undo_augment from MDAnalysis.lib.distances import apply_PBC, transform_StoR -from MDAnalysis.lib.mdamath import triclinic_vectors boxes = ([10, 10, 10, 90, 90, 90], # ortho [10, 10, 10, 45, 60, 90]) # tri_box @@ -44,9 +43,10 @@ [0.1, -0.1, 1.1], # box vertex [2.1, -3.1, 0.1], # box vertex [[0.1, 0.5, 0.5], - [0.5, -0.1, 0.5]] #Multiple vectors + [0.5, -0.1, 0.5]] # Multiple vectors ) + # Images for the previous query vectors, here in fractional coordinates. images = (([1.1, 0.5, 0.5],), (), @@ -74,8 +74,7 @@ def test_augment(b, qres): if q.shape == (3, ): q = q.reshape((1, 3)) q = apply_PBC(q, b) - dm = triclinic_vectors(b) - aug, mapping = augment(q, dm, radius) + aug, mapping = augment_coordinates(q, b, radius) if aug.size > 0: aug = np.sort(aug, axis=0) else: @@ -95,8 +94,7 @@ def test_undoaugment(b, qres): if q.shape == (3, ): q = q.reshape((1, 3)) q = apply_PBC(q, b) - dm = triclinic_vectors(b) - aug, mapping = augment(q, dm, radius) + aug, mapping = augment_coordinates(q, b, radius) for idx, val in enumerate(aug): imageid = np.asarray([len(q) + idx], dtype=np.int32) assert_equal(mapping[idx], undo_augment(imageid, mapping, len(q))[0]) From d7dd262b42abb3cb8cbe0e90dc66f681ac19a2d6 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 14 Jul 2018 20:02:12 -0700 Subject: [PATCH 229/455] added six.moves import --- testsuite/MDAnalysisTests/lib/test_augment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/lib/test_augment.py b/testsuite/MDAnalysisTests/lib/test_augment.py index 881e275dcd1..8092f133798 100644 --- a/testsuite/MDAnalysisTests/lib/test_augment.py +++ b/testsuite/MDAnalysisTests/lib/test_augment.py @@ -20,7 +20,7 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 from __future__ import absolute_import - +from six.moves import zip import pytest import numpy as np from numpy.testing import assert_almost_equal, assert_equal From 1ca2bc74e6c02c7995d720073c740b6b45fc135b Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 14 Jul 2018 17:23:33 -0500 Subject: [PATCH 230/455] fixed segfault in make_whole with multiple fragments --- package/MDAnalysis/lib/_cutil.pyx | 38 +++++++++++++--------- testsuite/MDAnalysisTests/lib/test_util.py | 22 ++++++++++++- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index 0463cf15cef..44723589cd5 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -165,8 +165,9 @@ def make_whole(atomgroup, reference_atom=None): .. versionadded:: 0.11.0 """ - cdef intset agset, refpoints, todo, done - cdef int i, nloops, ref, atom, other + cdef intset refpoints, todo, done + cdef int i, nloops, ref, atom, other, natoms + cdef cmap[int, int] ix_to_rel cdef intmap bonding cdef int[:, :] bonds cdef float[:, :] oldpos, newpos @@ -175,14 +176,21 @@ def make_whole(atomgroup, reference_atom=None): cdef float tri_box[3][3] cdef float inverse_box[3] cdef double vec[3] + cdef ssize_t[:] ix_view + + # map of global indices to local indices + ix_view = atomgroup.ix[:] + natoms = atomgroup.ix.shape[0] + for i in range(natoms): + ix_to_rel[ix_view[i]] = i if reference_atom is None: - ref = atomgroup[0].index + ref = 0 else: # Sanity check if not reference_atom in atomgroup: raise ValueError("Reference atom not in atomgroup") - ref = reference_atom.index + ref = ix_to_rel[reference_atom.ix] box = atomgroup.dimensions @@ -203,10 +211,6 @@ def make_whole(atomgroup, reference_atom=None): from .mdamath import triclinic_vectors tri_box = triclinic_vectors(box) - # set of indices in AtomGroup - agset = intset() - for i in atomgroup.indices.astype(np.int32): - agset.insert(i) # C++ dict of bonds try: bonds = atomgroup.bonds.to_indices() @@ -216,26 +220,30 @@ def make_whole(atomgroup, reference_atom=None): atom = bonds[i, 0] other = bonds[i, 1] # only add bonds if both atoms are in atoms set - if agset.count(atom) and agset.count(other): + if ix_to_rel.count(atom) and ix_to_rel.count(other): + atom = ix_to_rel[atom] + other = ix_to_rel[other] + bonding[atom].insert(other) bonding[other].insert(atom) oldpos = atomgroup.positions newpos = np.zeros((oldpos.shape[0], 3), dtype=np.float32) - done = intset() # Who have I already done? refpoints = intset() # Who is safe to use as reference point? - # initially we have one starting atom whose position we trust + done = intset() # Who have I already searched around? + # initially we have one starting atom whose position is in correct image refpoints.insert(ref) for i in range(3): newpos[ref, i] = oldpos[ref, i] nloops = 0 - while refpoints.size() < agset.size() and nloops < agset.size(): + while refpoints.size() < natoms and nloops < natoms: + # count iterations to prevent infinite loop here nloops += 1 # We want to iterate over atoms that are good to use as reference - # points, but haven't been done yet. + # points, but haven't been searched yet. todo = difference(refpoints, done) for atom in todo: for other in bonding[atom]: @@ -244,7 +252,7 @@ def make_whole(atomgroup, reference_atom=None): continue # Draw vector from atom to other for i in range(3): - vec[i] = oldpos[other, i] - oldpos[atom, i] + vec[i] = oldpos[other, i] - newpos[atom, i] # Apply periodic boundary conditions to this vector if ortho: minimum_image(&vec[0], &box[0], &inverse_box[0]) @@ -258,7 +266,7 @@ def make_whole(atomgroup, reference_atom=None): refpoints.insert(other) done.insert(atom) - if refpoints.size() < agset.size(): + if refpoints.size() < natoms: raise ValueError("AtomGroup was not contiguous from bonds, process failed") else: atomgroup.positions = newpos diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index ed226ceced2..64cfa7aaffe 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -41,7 +41,9 @@ from MDAnalysis.exceptions import NoDataError, DuplicateWarning -from MDAnalysisTests.datafiles import Make_Whole, TPR, GRO, fullerene +from MDAnalysisTests.datafiles import ( + Make_Whole, TPR, GRO, fullerene, two_water_gro, +) def convert_aa_code_long_data(): @@ -263,6 +265,16 @@ def test_single_atom_no_bonds(self): assert_array_almost_equal(ag.positions, refpos) + def test_scrambled_ag(self, universe): + # if order of atomgroup is mixed + ag = universe.atoms[[1, 3, 2, 4, 0, 6, 5, 7]] + + mdamath.make_whole(ag) + + # artificial system which uses 1nm bonds, so + # largest bond should be 20A + assert ag.bonds.values().max() < 20.1 + @staticmethod @pytest.fixture() def ag(universe): @@ -384,6 +396,14 @@ def test_make_whole_fullerene(self): assert_array_almost_equal(u.atoms.bonds.values(), blengths, decimal=self.prec) + def test_make_whole_multiple_molecules(self): + u = mda.Universe(two_water_gro, guess_bonds=True) + + for f in u.atoms.fragments: + mdamath.make_whole(f) + + assert u.atoms.bonds.values().max() < 2.0 + class Class_with_Caches(object): def __init__(self): self._cache = dict() From 776c83aa18b1db69cf21e7e5025b24034347ced1 Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 16 Jul 2018 18:27:43 -0700 Subject: [PATCH 231/455] cdef'd float instead of numpy array, changed the format of tests --- package/MDAnalysis/lib/_augment.pyx | 34 +++---- package/setup.py | 1 - testsuite/MDAnalysisTests/lib/test_augment.py | 96 ++++++++++--------- 3 files changed, 69 insertions(+), 62 deletions(-) diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index 693a534b2bc..5e8cf3684a9 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -97,25 +97,25 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): cdef float coord[3] cdef float end[3] cdef float other[3] - cdef float[:, ::1] dm = np.zeros((3, 3), dtype=np.float32) - cdef float[:, ::1] reciprocal = np.zeros((3, 3), dtype=np.float32) + cdef float dm[3][3] + cdef float reciprocal[3][3] dm = triclinic_vectors(box) for i in range(3): - shiftX[i] = dm[0, i] - shiftY[i] = dm[1, i] - shiftZ[i] = dm[2, i] - end[i] = dm[0, i] + dm[1, i] + dm[2, i] + shiftX[i] = dm[0][i] + shiftY[i] = dm[1][i] + shiftZ[i] = dm[2][i] + end[i] = dm[0][i] + dm[1][i] + dm[2][i] # Calculate reciprocal vectors - _cross(&dm[1, 0], &dm[2, 0], &reciprocal[0, 0]) - _cross(&dm[2, 0], &dm[0, 0], &reciprocal[1, 0]) - _cross(&dm[0, 0], &dm[1, 0], &reciprocal[2, 0]) + _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) + _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) + _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) # Normalize for i in range(3): - norm = _norm(&reciprocal[i, 0]) + norm = _norm(&reciprocal[i][0]) for j in range(3): - reciprocal[i, j] = reciprocal[i, j]/norm + reciprocal[i][j] = reciprocal[i][j]/norm N = coordinates.shape[0] @@ -127,12 +127,12 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): coord[j] = coordinates[i, j] other[j] = end[j] - coordinates[i, j] # identify the condition - lo_x = _dot(&coord[0], &reciprocal[0, 0]) <= r - hi_x = _dot(&other[0], &reciprocal[0, 0]) <= r - lo_y = _dot(&coord[0], &reciprocal[1, 0]) <= r - hi_y = _dot(&other[0], &reciprocal[1, 0]) <= r - lo_z = _dot(&coord[0], &reciprocal[2, 0]) <= r - hi_z = _dot(&other[0], &reciprocal[2, 0]) <= r + lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r + hi_x = _dot(&other[0], &reciprocal[0][0]) <= r + lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r + hi_y = _dot(&other[0], &reciprocal[1][0]) <= r + lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r + hi_z = _dot(&other[0], &reciprocal[2][0]) <= r if lo_x: # if X, face piece diff --git a/package/setup.py b/package/setup.py index be8bd705b13..32f595e0da7 100755 --- a/package/setup.py +++ b/package/setup.py @@ -356,7 +356,6 @@ def extensions(config): aug = MDAExtension('MDAnalysis.lib._augment', sources=['MDAnalysis/lib/_augment' + source_suffix], language='c++', - libraries=mathlib, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=cpp_extra_compile_args) diff --git a/testsuite/MDAnalysisTests/lib/test_augment.py b/testsuite/MDAnalysisTests/lib/test_augment.py index 8092f133798..d15ca0404a4 100644 --- a/testsuite/MDAnalysisTests/lib/test_augment.py +++ b/testsuite/MDAnalysisTests/lib/test_augment.py @@ -20,57 +20,61 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 from __future__ import absolute_import -from six.moves import zip import pytest import numpy as np from numpy.testing import assert_almost_equal, assert_equal -from itertools import product from MDAnalysis.lib._augment import augment_coordinates, undo_augment from MDAnalysis.lib.distances import apply_PBC, transform_StoR -boxes = ([10, 10, 10, 90, 90, 90], # ortho - [10, 10, 10, 45, 60, 90]) # tri_box - # Find images for several query points, -# here in fractional coordinates using augment -queries = ([0.1, 0.5, 0.5], # box face - [0.5, 0.5, 0.5], # box center - [0.5, -0.1, 0.5], # box face - [0.1, 0.1, 0.5], # box edge - [0.5, -0.1, 1.1], # box edge - [0.1, 0.1, 0.1], # box vertex - [0.1, -0.1, 1.1], # box vertex - [2.1, -3.1, 0.1], # box vertex - [[0.1, 0.5, 0.5], - [0.5, -0.1, 0.5]] # Multiple vectors - ) - - -# Images for the previous query vectors, here in fractional coordinates. -images = (([1.1, 0.5, 0.5],), - (), - ([0.5, -0.1, 0.5],), - ([1.1, 0.1, 0.5], [0.1, 1.1, 0.5], [1.1, 1.1, 0.5]), - ([0.5, -0.1, 0.1], [0.5, 0.9, 1.1], [0.5, -0.1, 1.1]), - ([1.1, 0.1, 0.1], [0.1, 1.1, 0.1], [0.1, 0.1, 1.1], - [0.1, 1.1, 1.1], [1.1, 1.1, 0.1], [1.1, 0.1, 1.1], - [1.1, 1.1, 1.1]), - ([1.1, 0.9, 0.1], [0.1, -0.1, 0.1], [0.1, 0.9, 1.1], - [0.1, -0.1, 1.1], [1.1, -0.1, 0.1], [1.1, 0.9, 1.1], - [1.1, -0.1, 1.1]), - ([1.1, 0.9, 0.1], [0.1, -0.1, 0.1], [0.1, 0.9, 1.1], - [0.1, -0.1, 1.1], [1.1, -0.1, 0.1], [1.1, 0.9, 1.1], - [1.1, -0.1, 1.1]), - ([1.1, 0.5, 0.5], [0.5, -0.1, 0.5])) +# here in fractional coordinates +# Every element of qres tuple is (query, images) +qres = ( + ([0.1, 0.5, 0.5], [[1.1, 0.5, 0.5]]), # box face + ([0.5, 0.5, 0.5], []), # box center + ([0.5, -0.1, 0.5], [[0.5, -0.1, 0.5]]), # box face + ([0.1, 0.1, 0.5], [[1.1, 0.1, 0.5], + [0.1, 1.1, 0.5], + [1.1, 1.1, 0.5]]), # box edge + ([0.5, -0.1, 1.1], [[0.5, -0.1, 0.1], + [0.5, 0.9, 1.1], + [0.5, -0.1, 1.1]]), # box edge + ([0.1, 0.1, 0.1], [[1.1, 0.1, 0.1], + [0.1, 1.1, 0.1], + [0.1, 0.1, 1.1], + [0.1, 1.1, 1.1], + [1.1, 1.1, 0.1], + [1.1, 0.1, 1.1], + [1.1, 1.1, 1.1]]), # box vertex + ([0.1, -0.1, 1.1], [[1.1, 0.9, 0.1], + [0.1, -0.1, 0.1], + [0.1, 0.9, 1.1], + [0.1, -0.1, 1.1], + [1.1, -0.1, 0.1], + [1.1, 0.9, 1.1], + [1.1, -0.1, 1.1]]), # box vertex + ([2.1, -3.1, 0.1], [[1.1, 0.9, 0.1], + [0.1, -0.1, 0.1], + [0.1, 0.9, 1.1], + [0.1, -0.1, 1.1], + [1.1, -0.1, 0.1], + [1.1, 0.9, 1.1], + [1.1, -0.1, 1.1]]), # box vertex + ([[0.1, 0.5, 0.5], + [0.5, -0.1, 0.5]], [[1.1, 0.5, 0.5], + [0.5, -0.1, 0.5]]) # multiple queries + ) -radius = 1.5 - -@pytest.mark.parametrize('b, qres', product(boxes, zip(queries, images))) -def test_augment(b, qres): - b = np.array(b, dtype=np.float32) - q = transform_StoR(np.array(qres[0], dtype=np.float32), b) +@pytest.mark.parametrize('b', ( + np.array([10, 10, 10, 90, 90, 90], dtype=np.float32), + np.array([10, 10, 10, 45, 60, 90], dtype=np.float32) + )) +@pytest.mark.parametrize('q, res', qres) +def test_augment(b, q, res): + radius = 1.5 + q = transform_StoR(np.array(q, dtype=np.float32), b) if q.shape == (3, ): q = q.reshape((1, 3)) q = apply_PBC(q, b) @@ -79,7 +83,7 @@ def test_augment(b, qres): aug = np.sort(aug, axis=0) else: aug = list() - cs = transform_StoR(np.array(qres[1], dtype=np.float32), b) + cs = transform_StoR(np.array(res, dtype=np.float32), b) if cs.size > 0: cs = np.sort(cs, axis=0) else: @@ -87,9 +91,13 @@ def test_augment(b, qres): assert_almost_equal(aug, cs, decimal=5) -@pytest.mark.parametrize('b, qres', product(boxes, zip(queries, images))) +@pytest.mark.parametrize('b', ( + np.array([10, 10, 10, 90, 90, 90], dtype=np.float32), + np.array([10, 10, 10, 45, 60, 90], dtype=np.float32) + )) +@pytest.mark.parametrize('qres', qres) def test_undoaugment(b, qres): - b = np.array(b, dtype=np.float32) + radius = 1.5 q = transform_StoR(np.array(qres[0], dtype=np.float32), b) if q.shape == (3, ): q = q.reshape((1, 3)) From 2ed97ab87f3957af0e4cd9ffafff3a9842817b2e Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 17 Jul 2018 07:51:52 -0500 Subject: [PATCH 232/455] tweaked pylint --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 957cbb219d0..b7ce905058a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,7 +57,7 @@ matrix: - env: NAME="Lint" PYLINTRC="${TRAVIS_BUILD_DIR}/package/.pylintrc" - MAIN_CMD="pylint package/MDAnalysis && pylint testsuite/MDAnalysisTests" + MAIN_CMD="pylint --rcfile=$PYLINTRC package/MDAnalysis && pylint --rcfile=$PYLINTRC testsuite/MDAnalysisTests" SETUP_CMD="" BUILD_CMD="" CONDA_DEPENDENCIES="" From e8b2b176dd77d5072eae64b62d3828c2451fc5bf Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 17 Jul 2018 08:04:31 -0500 Subject: [PATCH 233/455] allow pylint to fail --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index b7ce905058a..0f794d46776 100644 --- a/.travis.yml +++ b/.travis.yml @@ -76,6 +76,7 @@ matrix: allow_failures: - env: NUMPY_VERSION=dev EVENT_TYPE="cron" + - env: NAME="Lint" before_install: # Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) From 53abc628318869da3556b6f58422feb1e77322e2 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 17 Jul 2018 19:03:19 +0100 Subject: [PATCH 234/455] Check if all tau == 1 when the same atom IDs are returned at each frame --- .../analysis/test_waterdynamics.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 50ae28125a9..f483c231656 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -22,12 +22,14 @@ from __future__ import print_function, absolute_import import MDAnalysis from MDAnalysis.analysis import waterdynamics -import pytest from MDAnalysisTests.datafiles import waterPSF, waterDCD from MDAnalysisTests.datafiles import PDB, XTC +import pytest import numpy as np +from mock import patch +from mock import Mock from numpy.testing import assert_almost_equal SELECTION1 = "byres name OH2" @@ -106,3 +108,14 @@ def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) taus, timeseries = sp_zero.run() assert np.isnan(timeseries[1]) + + +def test_SurvivalProbability_alwaysPresent(universe): + with patch.object(universe, 'select_atoms') as select_atoms_mock: + select_atoms_mock.return_value = returned_mock_atom_group = Mock() + # fake atom IDs - always the same + returned_mock_atom_group.ids = [7, 8, 1, 9] + + sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) + taus, timeseries = sp.run() + assert np.array_equal(timeseries, [1.0, 1.0, 1.0]) \ No newline at end of file From d471bd00ae55dd7affd5698cf1963c2a105ee230 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 17 Jul 2018 19:41:47 +0100 Subject: [PATCH 235/455] Mock data for the test case. --- .../MDAnalysisTests/analysis/test_waterdynamics.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index f483c231656..eff70eb08bc 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -105,9 +105,14 @@ def test_SurvivalProbability_t0Ignored(universe_prot): def test_SurvivalProbability_zeroMolecules(universe): - sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) - taus, timeseries = sp_zero.run() - assert np.isnan(timeseries[1]) + with patch.object(universe, 'select_atoms') as select_atoms_mock: + select_atoms_mock.return_value = returned_mock_atom_group = Mock() + # fake atom IDs - always the same + returned_mock_atom_group.ids = [] + + sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) + taus, timeseries = sp.run() + assert all(np.isnan(timeseries)) def test_SurvivalProbability_alwaysPresent(universe): @@ -118,4 +123,4 @@ def test_SurvivalProbability_alwaysPresent(universe): sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) taus, timeseries = sp.run() - assert np.array_equal(timeseries, [1.0, 1.0, 1.0]) \ No newline at end of file + assert all(np.equal(timeseries, 1)) \ No newline at end of file From 98c83709c638a57b7e9290f692364b4f1ac931cf Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Tue, 17 Jul 2018 14:02:46 -0700 Subject: [PATCH 236/455] Updated residue selection of function, added test files --- package/MDAnalysis/analysis/dihedrals.py | 21 ++++---- .../analysis/test_dihedrals.py | 51 ++++++++++++++++++ .../data/adk_oplsaa_GLY_dihedrals.npy | Bin 0 -> 3168 bytes .../data/adk_oplsaa_dihedrals.npy | Bin 0 -> 34048 bytes testsuite/MDAnalysisTests/datafiles.py | 3 ++ 5 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 testsuite/MDAnalysisTests/analysis/test_dihedrals.py create mode 100644 testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_dihedrals.npy create mode 100644 testsuite/MDAnalysisTests/data/adk_oplsaa_dihedrals.npy diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index d9551b8a315..c60ac077bcf 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -1,5 +1,6 @@ import numpy as np import matplotlib.pyplot as plt +import warnings from MDAnalysis.analysis.base import AnalysisBase @@ -54,15 +55,17 @@ def __init__(self, atomgroup, **kwargs): def _prepare(self): self.residues = self.atomgroup.residues - res_min = np.min(self.atomgroup.universe.select_atoms("protein").resids) - res_max = np.max(self.atomgroup.universe.select_atoms("protein").resids) - if any([(resid < res_min) or (resid > res_max) for resid in self.residues.resids]): - raise IndexError("Selection outside of protein") - elif any([resid == (res_min or res_max) for resid in self.residues.resids]): - raise IndexError("Cannot determine phi and psi angles for the first or last residues") - else: - self.phi_atoms = [residue.phi_selection() for residue in self.residues] - self.psi_atoms = [residue.psi_selection() for residue in self.residues] + res_min = np.min(self.atomgroup.universe.select_atoms("protein").residues) + res_max = np.max(self.atomgroup.universe.select_atoms("protein").residues) + if any([residue > res_max for residue in self.residues]): + raise IndexError("Selection exceeds protein length") + elif any([residue == (res_min or res_max) for residue in self.residues]): + warnings.warn("Cannot determine phi and psi angles for the first or last residues") + + self.phi_atoms = [residue.phi_selection() for residue in self.residues + if res_min < residue < res_max] + self.psi_atoms = [residue.psi_selection() for residue in self.residues + if res_min < residue < res_max] self.angles = [] diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py new file mode 100644 index 00000000000..a16201904ef --- /dev/null +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -0,0 +1,51 @@ +import numpy as np +from numpy.testing import assert_array_almost_equal +import pytest +import os + +import MDAnalysis as mda +from MDAnalysisTests.datafiles import GRO, XTC, DihedralsArray, GLYDihedralsArray +from MDAnalysis.analysis import dihedrals + +class TestRamachandran(object): + + @pytest.fixture() + def universe(self): + return mda.Universe(GRO,XTC) + + def test_ramachandran(self, universe): + rama = dihedrals.Ramachandran(universe.select_atoms("protein")).run() + test_rama = np.load(DihedralsArray) + + assert_array_almost_equal(rama.angles, test_rama, 5, + err_msg="error: dihedral angles should match test values") + + def test_ramachandran_single_frame(self, universe): + rama = dihedrals.Ramachandran(universe.select_atoms("protein"), start=5, stop=6).run() + test_rama = [np.load(DihedralsArray)[5]] + + assert_array_almost_equal(rama.angles, test_rama, 5, + err_msg="error: dihedral angles should match test values") + + def test_ramachandran_identical_frames(self, universe, tmpdir): + + outfile = os.path.join(str(tmpdir), 'dihedrals.xtc') + + # write a dummy trajectory of all the same frame + with mda.Writer(outfile, universe.atoms.n_atoms) as W: + for _ in range(universe.trajectory.n_frames): + W.write(universe) + + universe = mda.Universe(GRO, outfile) + rama = dihedrals.Ramachandran(universe.select_atoms('protein')).run() + test_rama = [np.load(DihedralsArray)[0] for ts in universe.trajectory] + + assert_array_almost_equal(rama.angles, test_rama, 5, + err_msg="error: dihedral angles should match test values") + + def test_ramachandran_residue_selections(self, universe): + rama = dihedrals.Ramachandran(universe.select_atoms('resname GLY')).run() + test_rama = np.load(GLYDihedralsArray) + + assert_array_almost_equal(rama.angles, test_rama, 5, + err_msg="error: dihedral angles should match test values") diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_dihedrals.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_dihedrals.npy new file mode 100644 index 0000000000000000000000000000000000000000..1ce2e9e4e47c7a16361dcb005fa48752cf998529 GIT binary patch literal 3168 zcmbVN=_Aw&8_kkb6JATQ52=yJmNl7&bSb-O%*^jMgRvz`)=-MB8*P%PRNQ21p)3`b z&^)Csp(t`&tw|+oD+fw zJ`D2zj9pIhp!D5rLI9V5BZ{k{^^`b>OWcA*=^miXKeE6mamI6w@`4XuOqkZ6zsA-i zP@UtSFnO5`e}uc+FBlWx`b?GfT%QH2GBhfi6uD3k^w>mkoJ9MZ+2vd6cyM;SYOZPx z2|uEDi4}Hnz>Kgqa!_)|@cS}LXNq}nP-Xad+yPH?-5Td6c+LmSIDTsA8cEEyVw+9m z(II8Q!f8W?K0K+}O%*iSKqtjwW@GPGJgT<$_r82hxNd#Elwx9pTNWQ3I@V(Yq2?8Z z#T9;N^2YagW4IWEeKK4jo~{RpZ9;PeZAOq*M2$$?tBKVg|Be4r$WCT5^&VO!87#n+<^Jkt&_yOhHwTz7SQZS!#_v^qXClL2IPp{Z#ihr_{m3w@q1ieWQ%wpqh zFto4u58m{8cs{6W?4fUoVi9|4hyn{pnABIjzt10*e{r0i(^1D;!c#}2XEp%i{w|%D z$?H%pZBVvvnFXvpY+I|x5JAt))Z(YL8-S9w-E0fR8mBZOf1bD}3GXtKe;7w8gHvK& zL|&^WluZT&#m@6!PU1<#7M2&Z*A~^+N$)~}8CLV5f&o*`7v*dBuSLgUz{%1?H3;Fxl@0S&z2D3RVK*iXWcg2r{ZYy$LS9Ow^hxp*dISfAI$f>&Sc z?;Nb>0v_8hBGt?S$%bUcjVDa>dfTkl23+`jrKYa%5*McmBxlPLePJ@{jg;>TbG$H` zOMaW#0vlXTQB>`$G23D0pFjR`h5QQxPP$H}C~7$n(v37w-rpd)j7mq>lDU!|HFGFC zIL8bu^1~R~tB@t)W_Yne%wqbQ90aFbRLtU2;iKBWA9lynP&k#^=qJ8NKPk1=6%*zJ zj?F`_g*1)uz=y@G`bTmQFCte==h%SC&Rw0~H9X;J(~giLJ_#S~2JX6Oa3TJC#7oPc zY~1UHbrmfHxa&^Q9VSRzyz|h**PVm|Ma6x4vRF7CTGLyzjf86=r>kXaykWZ5g3=#J z!iVcNo0|V2VVLB#s=D*=g$VvM|H_4P8Hu#ML<0DVm0s=HY)A+t7qr8es7W{O`r^ie z%6FF8UfbDdMf3V|tjY)KcMB;Rkiw{8x>{-?!UitY8px(!*@}njI?N@T46sEkY}wB* zt~j16;WQk)6u%u_|MZYB9fy46RZ~Axun?SFT-UWs=JjI(c;+dfyjo4gN9kj+ zP3lYVig$hYc_S^{*Veo0PK5$gc1Aqk(=81NHup|N`)^0u{JOk`0%>%ZIhDJ<)e?S= zTx@eCJE&-@ok4lDp}0|;?N=0)ie&qF$ =bL6qRq;5J^at9o10Gj zkcDFt5e91{0+4paLfjdN43{q?-{VhgjRgnUzvPZ4o{z zqeul`ZgjW$Tx5=!7fWuY$F2vr`y+wkZ#8jDLY6W*>ji3t&DtMDxDd?>9qEqX!V#N- zhO5s!&?&|4R&^f>j1=-pH;d;Z5YQ1c4YX%l? zpbZ<(5|D8EZNi=$5?$LHoGFe0K-FJu)GMQgN*Nl^lg1=|w55Ws;nxBKU2XGmyme)#eIuf9#lpEW0fIlz{q$c$!j@VAiD&Mhn+ zWII}27Lj9OZhX&*(tZN&xEQFfOz;NLBg}4EyC+<}rCqS`3jq%Wxw(PbEHsH>XD=xt zq2*lp&gd3zU`13f4o<9Ad&RP9)wv{!6BK0O=r`EER5{;%iwe#9O!E-fx*y6PaYT}#|F zTpfS!b12<()E7q=u4iXF+KDR~M>TeIn!LD>L@OIAVM+s|;_}j2TzmkF?m7(&~L=#BWo$2tV@PSm;(3I!$z(w)Rfy#e9z~1U0 z`|iwk-0*E1d%A=TW35gL?>b2=JFR7_ok+q88Kw)z#{>5e$vIwUJ%EKj+jHM|g4CA5 zPWxmQSodsH?|e(b<|}zcAqTiPGHaK$td<3vQ#r-sQe4vM?2k#D^l=YowV}K(k{dWUjP(FCq8?p$tw}kvRmftd~rNaV^#Om5Pd*)yh-Su zA~c47e0(Cw477B)$Ll<4Fk2!XHF{eUA2c|P)cLG~_XiDq$_m}EcfNG-eH9%}Dz0($ z^i{;5?gWQ^(gz5GHRIRyco1mPDP&jd3Dw(ll5ZmuTmAF9hBOJV*^$@LTjqr=%l;Vm z*W|&DPrDwUFmu5JR%=H5OMmT`#MY2A>_^o2`L zn@2yX%m^0#&f3?{vIHaBr7Rg8V+=NTb2D8ckC&{LeQBmUU|5=?3u`$8+%xp7-_)dL(<69x7&DQ(7X1;p%PUF-1NoH+t4f_*ZW3QHYaO zSza*ss#2G}iiPFV*C*|SS&($IvNk}Ji>k5BjVmPy5WHF?A)C&`d8djmB97Uvg3>g={&nU#vA+O@V}|^oHH$ zrA!P`r@I+Ma=|J}MLJS~hqYI2IzQ60fWVb1&VR@2DF>)v}qAc|9t=cD{S! zhO#COl(z+ab+kj07xkSiWP(uekK-BdjZiwc{OXLf0tzd5s#faqF~3f0E9)i|+g8dy zzG%D|UZn7u{Pz;DdrTqG#!(zh9=7{UR<42vG0C=Ti`3Du+SSZOdlTx?EhL##3Q%-T KnjGG(5B~*55Vw5* literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_dihedrals.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_dihedrals.npy new file mode 100644 index 0000000000000000000000000000000000000000..0f579dc86d216e93dbc94b4354dc47d268c059f0 GIT binary patch literal 34048 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 VxS#lr*lJQE1O1Bzw%I;9=zo5HXtDqR literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index b616f8e4870..1e053f06f9b 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -415,5 +415,8 @@ GSD = resource_filename(__name__, 'data/example.gsd') +DihedralsArray = resource_filename(__name__, 'data/adk_oplsaa_dihedrals.npy') +GLYDihedralsArray = resource_filename(__name__, 'data/adk_oplsaa_GLY_dihedrals.npy') + # This should be the last line: clean up namespace del resource_filename From 1fbd1552feb559dbaaa32e43793c740d582b5d7f Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 17 Jul 2018 12:25:48 -0500 Subject: [PATCH 237/455] fixes for pylint 2 --- .travis.yml | 2 +- package/MDAnalysis/analysis/contacts.py | 1 - package/MDAnalysis/analysis/encore/clustering/__init__.py | 1 - package/MDAnalysis/auxiliary/XVG.py | 1 - package/MDAnalysis/auxiliary/core.py | 1 - package/MDAnalysis/coordinates/GMS.py | 2 -- package/MDAnalysis/coordinates/GRO.py | 7 ++----- package/MDAnalysis/coordinates/base.py | 3 +-- package/MDAnalysis/exceptions.py | 4 ++-- package/MDAnalysis/lib/util.py | 2 -- package/MDAnalysis/migration/fixes/fix_agcountmethods.py | 1 - package/MDAnalysis/migration/fixes/fix_agmethods.py | 1 - package/MDAnalysis/migration/fixes/fix_agmethods2.py | 1 - .../migration/fixes/fix_agsetterpluralization.py | 1 - package/MDAnalysis/migration/fixes/fix_calctorsions.py | 1 - package/MDAnalysis/migration/fixes/fix_camelcase.py | 1 - .../migration/fixes/fix_framenumberingzerobased2.py | 1 - package/MDAnalysis/migration/fixes/fix_numframes.py | 1 - package/MDAnalysis/migration/fixes/fix_selectatoms.py | 1 - package/MDAnalysis/migration/fixes/fix_torsionclasses.py | 3 --- package/MDAnalysis/migration/fixes/fix_torsions.py | 1 - package/MDAnalysis/migration/test_dummy_torsion.py | 1 - package/MDAnalysis/selections/gromacs.py | 2 -- package/MDAnalysis/tests/datafiles.py | 1 - package/MDAnalysis/transformations/__init__.py | 4 ---- package/MDAnalysis/visualization/streamlines.py | 1 - 26 files changed, 6 insertions(+), 40 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0f794d46776..84aa0335798 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,7 +57,7 @@ matrix: - env: NAME="Lint" PYLINTRC="${TRAVIS_BUILD_DIR}/package/.pylintrc" - MAIN_CMD="pylint --rcfile=$PYLINTRC package/MDAnalysis && pylint --rcfile=$PYLINTRC testsuite/MDAnalysisTests" + MAIN_CMD="pylint package/MDAnalysis && pylint testsuite/MDAnalysisTests" SETUP_CMD="" BUILD_CMD="" CONDA_DEPENDENCIES="" diff --git a/package/MDAnalysis/analysis/contacts.py b/package/MDAnalysis/analysis/contacts.py index e5a6ec7c30a..a982160145c 100644 --- a/package/MDAnalysis/analysis/contacts.py +++ b/package/MDAnalysis/analysis/contacts.py @@ -510,4 +510,3 @@ def q1q2(u, selection='all', radius=4.5, radius=radius, method=radius_cut_q, start=start, stop=stop, step=step, kwargs={'radius': radius}) - diff --git a/package/MDAnalysis/analysis/encore/clustering/__init__.py b/package/MDAnalysis/analysis/encore/clustering/__init__.py index a0baef507ae..6e17f25868b 100644 --- a/package/MDAnalysis/analysis/encore/clustering/__init__.py +++ b/package/MDAnalysis/analysis/encore/clustering/__init__.py @@ -29,4 +29,3 @@ 'ClusteringMethod.AffinityPropagationNative' 'ClusteringMethod.AffinityPropagation' 'ClusteringMethod.DBSCAN'] - diff --git a/package/MDAnalysis/auxiliary/XVG.py b/package/MDAnalysis/auxiliary/XVG.py index 1bf5c369f1f..7db55ef1528 100644 --- a/package/MDAnalysis/auxiliary/XVG.py +++ b/package/MDAnalysis/auxiliary/XVG.py @@ -366,4 +366,3 @@ def read_all_times(self): for step in self: times.append(self.time) return np.array(times) - diff --git a/package/MDAnalysis/auxiliary/core.py b/package/MDAnalysis/auxiliary/core.py index 15e0f4398f7..643f88c62fc 100644 --- a/package/MDAnalysis/auxiliary/core.py +++ b/package/MDAnalysis/auxiliary/core.py @@ -105,4 +105,3 @@ def auxreader(auxdata, format=None, **kwargs): """ reader = get_auxreader_for(auxdata, format=format) return reader(auxdata, **kwargs) - diff --git a/package/MDAnalysis/coordinates/GMS.py b/package/MDAnalysis/coordinates/GMS.py index f689914d6b7..c52076cdb3d 100644 --- a/package/MDAnalysis/coordinates/GMS.py +++ b/package/MDAnalysis/coordinates/GMS.py @@ -264,5 +264,3 @@ def close(self): return self.outfile.close() self.outfile = None - - diff --git a/package/MDAnalysis/coordinates/GRO.py b/package/MDAnalysis/coordinates/GRO.py index 9b23014f705..d3e85ff5b91 100644 --- a/package/MDAnalysis/coordinates/GRO.py +++ b/package/MDAnalysis/coordinates/GRO.py @@ -468,8 +468,5 @@ def write(self, obj): tri_dims = obj.triclinic_dimensions # full output - box = self.convert_pos_to_native( - tri_dims.flatten(), inplace=False) - output_gro.write(self.fmt['box_triclinic'].format( - box=box) - ) + box = self.convert_pos_to_native(tri_dims.flatten(), inplace=False) + output_gro.write(self.fmt['box_triclinic'].format(box=box)) diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index c22db65db92..8ab1a84e511 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -1558,7 +1558,7 @@ def _read_frame(self, frame): def _read_frame_with_aux(self, frame): """Move to *frame*, updating ts with trajectory, transformations and auxiliary data.""" - ts = self._read_frame(frame) + ts = self._read_frame(frame) # pylint: disable=assignment-from-no-return for aux in self.aux_list: ts = self._auxs[aux].update_ts(ts) @@ -2322,4 +2322,3 @@ def _apply_transformations(self, ts): # to avoid applying the same transformations multiple times on each frame return ts - diff --git a/package/MDAnalysis/exceptions.py b/package/MDAnalysis/exceptions.py index 06e9ddba714..8f3df820e5a 100644 --- a/package/MDAnalysis/exceptions.py +++ b/package/MDAnalysis/exceptions.py @@ -80,8 +80,8 @@ class DuplicateWarning(UserWarning): :class:`~MDAnalysis.core.groups.SegmentGroup` containing duplicate :class:`Atoms` / :class:`Residues` / - :class:`Segments`\ . + :class:`Segments`. .. versionadded:: 0.19.0 - """ \ No newline at end of file + """ diff --git a/package/MDAnalysis/lib/util.py b/package/MDAnalysis/lib/util.py index 264b4b3498b..14f257e3792 100644 --- a/package/MDAnalysis/lib/util.py +++ b/package/MDAnalysis/lib/util.py @@ -2047,5 +2047,3 @@ def dedent_docstring(text): # treat first line as special (typically no leading whitespace!) which messes up dedent return lines[0].lstrip() + "\n" + textwrap.dedent("\n".join(lines[1:])) - - diff --git a/package/MDAnalysis/migration/fixes/fix_agcountmethods.py b/package/MDAnalysis/migration/fixes/fix_agcountmethods.py index af39c4ba705..7473e624e09 100644 --- a/package/MDAnalysis/migration/fixes/fix_agcountmethods.py +++ b/package/MDAnalysis/migration/fixes/fix_agcountmethods.py @@ -31,4 +31,3 @@ def transform(self, node, results): args = head + [pytree.Node(syms.trailer, [Dot(), Name(method_name, prefix = method.prefix)])] new = pytree.Node(syms.power, args) return new - diff --git a/package/MDAnalysis/migration/fixes/fix_agmethods.py b/package/MDAnalysis/migration/fixes/fix_agmethods.py index 3c33fb744d7..8972eb48b25 100644 --- a/package/MDAnalysis/migration/fixes/fix_agmethods.py +++ b/package/MDAnalysis/migration/fixes/fix_agmethods.py @@ -32,4 +32,3 @@ def transform(self, node, results): args = head + [pytree.Node(syms.trailer, [Dot(), Name(method_name, prefix = method.prefix)])] new = pytree.Node(syms.power, args) return new - diff --git a/package/MDAnalysis/migration/fixes/fix_agmethods2.py b/package/MDAnalysis/migration/fixes/fix_agmethods2.py index 8482aab2a13..2f0499ec4f8 100644 --- a/package/MDAnalysis/migration/fixes/fix_agmethods2.py +++ b/package/MDAnalysis/migration/fixes/fix_agmethods2.py @@ -32,4 +32,3 @@ def transform(self, node, results): args = head + [pytree.Node(syms.trailer, [Dot(), Name(method_name, prefix = method.prefix), Dot(), Name('value'), LParen(), RParen()])] new = pytree.Node(syms.power, args) return new - diff --git a/package/MDAnalysis/migration/fixes/fix_agsetterpluralization.py b/package/MDAnalysis/migration/fixes/fix_agsetterpluralization.py index 189c798a372..3fe1a68ed23 100644 --- a/package/MDAnalysis/migration/fixes/fix_agsetterpluralization.py +++ b/package/MDAnalysis/migration/fixes/fix_agsetterpluralization.py @@ -37,4 +37,3 @@ def transform(self, node, results): args = head + [pytree.Node(syms.trailer, [Dot(), Name(method_name, prefix = method.prefix)])] + tail new = pytree.Node(syms.power, args) return new - diff --git a/package/MDAnalysis/migration/fixes/fix_calctorsions.py b/package/MDAnalysis/migration/fixes/fix_calctorsions.py index e94cc7c0afc..4551c8acda7 100644 --- a/package/MDAnalysis/migration/fixes/fix_calctorsions.py +++ b/package/MDAnalysis/migration/fixes/fix_calctorsions.py @@ -30,4 +30,3 @@ def transform(self, node, results): elif 'import_name' in results.keys(): import_name = results['import_name'] import_name.replace(Name(' calc_dihedrals')) - diff --git a/package/MDAnalysis/migration/fixes/fix_camelcase.py b/package/MDAnalysis/migration/fixes/fix_camelcase.py index 34220c78d26..0e6f5475a27 100644 --- a/package/MDAnalysis/migration/fixes/fix_camelcase.py +++ b/package/MDAnalysis/migration/fixes/fix_camelcase.py @@ -32,4 +32,3 @@ def transform(self, node, results): args = [pytree.Node(syms.trailer, [Dot(), Name(method_name)])] new = pytree.Node(syms.power, args) return new - diff --git a/package/MDAnalysis/migration/fixes/fix_framenumberingzerobased2.py b/package/MDAnalysis/migration/fixes/fix_framenumberingzerobased2.py index 18489952f45..2770917fc52 100644 --- a/package/MDAnalysis/migration/fixes/fix_framenumberingzerobased2.py +++ b/package/MDAnalysis/migration/fixes/fix_framenumberingzerobased2.py @@ -36,4 +36,3 @@ def transform(self, node, results): except KeyError: node.set_prefix(comment_string + node.prefix) node.changed() - diff --git a/package/MDAnalysis/migration/fixes/fix_numframes.py b/package/MDAnalysis/migration/fixes/fix_numframes.py index c0d89bd779c..ed27dcb9d98 100644 --- a/package/MDAnalysis/migration/fixes/fix_numframes.py +++ b/package/MDAnalysis/migration/fixes/fix_numframes.py @@ -23,4 +23,3 @@ def transform(self, node, results): args = [pytree.Node(syms.trailer, [Dot(), Name(method_name)])] new = pytree.Node(syms.power, args) return new - diff --git a/package/MDAnalysis/migration/fixes/fix_selectatoms.py b/package/MDAnalysis/migration/fixes/fix_selectatoms.py index 664709a7b22..8cc86d5f121 100644 --- a/package/MDAnalysis/migration/fixes/fix_selectatoms.py +++ b/package/MDAnalysis/migration/fixes/fix_selectatoms.py @@ -20,4 +20,3 @@ def match(self, node): def transform(self, node, results): node.value = 'select_atoms' node.changed() - diff --git a/package/MDAnalysis/migration/fixes/fix_torsionclasses.py b/package/MDAnalysis/migration/fixes/fix_torsionclasses.py index 255a0be195d..70df5cd806e 100644 --- a/package/MDAnalysis/migration/fixes/fix_torsionclasses.py +++ b/package/MDAnalysis/migration/fixes/fix_torsionclasses.py @@ -49,6 +49,3 @@ def transform(self, node, results): child.value = 'Dihedral' if child.value == 'Improper_Torsion': child.value = 'ImproperDihedral' - - - diff --git a/package/MDAnalysis/migration/fixes/fix_torsions.py b/package/MDAnalysis/migration/fixes/fix_torsions.py index dc319ee2144..409ae0a507d 100644 --- a/package/MDAnalysis/migration/fixes/fix_torsions.py +++ b/package/MDAnalysis/migration/fixes/fix_torsions.py @@ -28,4 +28,3 @@ def transform(self, node, results): args = head + [pytree.Node(syms.trailer, [Dot(), Name(method_name, prefix = method.prefix)])] new = pytree.Node(syms.power, args) return new - diff --git a/package/MDAnalysis/migration/test_dummy_torsion.py b/package/MDAnalysis/migration/test_dummy_torsion.py index 0bc2ef3015f..42e9a12dc79 100644 --- a/package/MDAnalysis/migration/test_dummy_torsion.py +++ b/package/MDAnalysis/migration/test_dummy_torsion.py @@ -16,4 +16,3 @@ class NewDihedral(NewParent, Torsion): pass #Improper_Torsion -> ImproperDihedral class NewImproperdihedral(Improper_Torsion): pass - diff --git a/package/MDAnalysis/selections/gromacs.py b/package/MDAnalysis/selections/gromacs.py index 78490405130..40cc9f13906 100644 --- a/package/MDAnalysis/selections/gromacs.py +++ b/package/MDAnalysis/selections/gromacs.py @@ -53,5 +53,3 @@ def _translate(self, atoms, **kwargs): def _write_head(self, out, **kwargs): out.write("[ {name!s} ]\n".format(**kwargs)) - - diff --git a/package/MDAnalysis/tests/datafiles.py b/package/MDAnalysis/tests/datafiles.py index 9449ac24959..2b49531b687 100644 --- a/package/MDAnalysis/tests/datafiles.py +++ b/package/MDAnalysis/tests/datafiles.py @@ -50,4 +50,3 @@ print("and download and install the `MDAnalysisTests-x.y.z.tar.gz'") print("that matches your MDAnalysis release.") raise ImportError("MDAnalysisTests package not installed.") - diff --git a/package/MDAnalysis/transformations/__init__.py b/package/MDAnalysis/transformations/__init__.py index 8c7b388c20a..bcefa903e2c 100644 --- a/package/MDAnalysis/transformations/__init__.py +++ b/package/MDAnalysis/transformations/__init__.py @@ -94,7 +94,3 @@ def wrapped(ts): from .translate import translate, center_in_box from .rotate import rotateby - - - - diff --git a/package/MDAnalysis/visualization/streamlines.py b/package/MDAnalysis/visualization/streamlines.py index e63d9b18098..a2d9ea8812d 100644 --- a/package/MDAnalysis/visualization/streamlines.py +++ b/package/MDAnalysis/visualization/streamlines.py @@ -363,4 +363,3 @@ def log_result_to_parent(delta_array): standard_deviation_of_displacement = np.std(displacement_array) return (dx_array, dy_array, average_displacement, standard_deviation_of_displacement) - From 5f151b48525a5d1d3d00b73855dbf6fe88960b69 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 17 Jul 2018 15:00:23 -0500 Subject: [PATCH 238/455] pylint changes for testsuite --- testsuite/MDAnalysisTests/analysis/test_hbonds.py | 1 - testsuite/MDAnalysisTests/analysis/test_helanal.py | 6 ------ testsuite/MDAnalysisTests/analysis/test_leaflet.py | 1 - testsuite/MDAnalysisTests/coordinates/test_amber_inpcrd.py | 1 - testsuite/MDAnalysisTests/core/test_copying.py | 1 - testsuite/MDAnalysisTests/lib/test_util.py | 1 - testsuite/MDAnalysisTests/topology/test_dms.py | 1 - testsuite/MDAnalysisTests/utils/test_log.py | 1 - testsuite/MDAnalysisTests/utils/test_qcprot.py | 1 - 9 files changed, 14 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_hbonds.py b/testsuite/MDAnalysisTests/analysis/test_hbonds.py index ed92ab1635e..0156b441ae4 100644 --- a/testsuite/MDAnalysisTests/analysis/test_hbonds.py +++ b/testsuite/MDAnalysisTests/analysis/test_hbonds.py @@ -396,4 +396,3 @@ def test_table_atoms(self, h, normalized_timeseries, reference_table): # https://github.com/MDAnalysis/mdanalysis/issues/801) for name, ref in reference_table.items(): assert_array_equal(h.table.field(name), ref, err_msg="resname for {0} do not match (Issue #801)") - diff --git a/testsuite/MDAnalysisTests/analysis/test_helanal.py b/testsuite/MDAnalysisTests/analysis/test_helanal.py index aa5ebe5d412..23b8b6b587f 100644 --- a/testsuite/MDAnalysisTests/analysis/test_helanal.py +++ b/testsuite/MDAnalysisTests/analysis/test_helanal.py @@ -149,9 +149,3 @@ def test_xtc_striding(tmpdir): MDAnalysis.analysis.helanal.helanal_trajectory( u, selection="name CA", finish=5 ) - - #with assert_raises(FinishTimeException): - # try: - # MDAnalysis.analysis.helanal.helanal_trajectory(u, selection=sel, finish=5) - # except IndexError: - # self.fail("IndexError consistent with Issue 188.") diff --git a/testsuite/MDAnalysisTests/analysis/test_leaflet.py b/testsuite/MDAnalysisTests/analysis/test_leaflet.py index 9eb4b4439d7..28593d66b5b 100644 --- a/testsuite/MDAnalysisTests/analysis/test_leaflet.py +++ b/testsuite/MDAnalysisTests/analysis/test_leaflet.py @@ -68,4 +68,3 @@ def test_optimize_cutoff(universe, lipid_heads): cutoff, N = optimize_cutoff(universe, lipid_heads, pbc=True) assert N == 2 assert_almost_equal(cutoff, 10.5, decimal=4) - diff --git a/testsuite/MDAnalysisTests/coordinates/test_amber_inpcrd.py b/testsuite/MDAnalysisTests/coordinates/test_amber_inpcrd.py index 9edc5c6d771..517ccaef421 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_amber_inpcrd.py +++ b/testsuite/MDAnalysisTests/coordinates/test_amber_inpcrd.py @@ -57,4 +57,3 @@ def test_universe_inpcrd(self): def test_universe_restrt(self): u = mda.Universe(XYZ_five, INPCRD, format='RESTRT') self._check_ts(u.trajectory.ts) - diff --git a/testsuite/MDAnalysisTests/core/test_copying.py b/testsuite/MDAnalysisTests/core/test_copying.py index 84e60be555d..3a886135aab 100644 --- a/testsuite/MDAnalysisTests/core/test_copying.py +++ b/testsuite/MDAnalysisTests/core/test_copying.py @@ -203,4 +203,3 @@ def test_change_topology(self, refUniverse): assert new.atoms[0].name == previous assert refUniverse.atoms[0].name == 'newname' - diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index 64cfa7aaffe..2d9d584e5d5 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -1401,4 +1401,3 @@ def test_dedent_docstring(text): doc = util.dedent_docstring(text) for line in doc.splitlines(): assert line == line.lstrip() - diff --git a/testsuite/MDAnalysisTests/topology/test_dms.py b/testsuite/MDAnalysisTests/topology/test_dms.py index efcdd5ddcea..322ebf6d779 100644 --- a/testsuite/MDAnalysisTests/topology/test_dms.py +++ b/testsuite/MDAnalysisTests/topology/test_dms.py @@ -56,4 +56,3 @@ def test_atomsels(self, filename): s3 = u.select_atoms("resname ALA") assert len(s3) == 190 - diff --git a/testsuite/MDAnalysisTests/utils/test_log.py b/testsuite/MDAnalysisTests/utils/test_log.py index 48b8b58d276..3acc9bb9119 100644 --- a/testsuite/MDAnalysisTests/utils/test_log.py +++ b/testsuite/MDAnalysisTests/utils/test_log.py @@ -183,4 +183,3 @@ def test__set_verbose_invalid_args(self, verbose): ]) def test_warnings__set_verbose(self, verbose, quiet): pytest.deprecated_call(_set_verbose, verbose=verbose, quiet=quiet) - diff --git a/testsuite/MDAnalysisTests/utils/test_qcprot.py b/testsuite/MDAnalysisTests/utils/test_qcprot.py index 83f7a32a8d4..fbf928ea874 100644 --- a/testsuite/MDAnalysisTests/utils/test_qcprot.py +++ b/testsuite/MDAnalysisTests/utils/test_qcprot.py @@ -171,4 +171,3 @@ def test_weights(): assert_almost_equal(p, 32.798779202159416) q = np.array([0.99861395, .022982, .04735006, -.02409085, .99944556, .022982, -.04679564, -.02409085, .99861395]) np.testing.assert_almost_equal(q, o) - From 41bed97a85271498acbe99ee11858fc48aaab925 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 17 Jul 2018 16:28:06 -0500 Subject: [PATCH 239/455] don't allow pylint to fail any more --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 84aa0335798..957cbb219d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -76,7 +76,6 @@ matrix: allow_failures: - env: NUMPY_VERSION=dev EVENT_TYPE="cron" - - env: NAME="Lint" before_install: # Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) From feebb7d69887fa8d00c0c25f7fca061cb3c2702c Mon Sep 17 00:00:00 2001 From: ayush Date: Wed, 18 Jul 2018 02:57:17 -0700 Subject: [PATCH 240/455] Modified input type to undo_augment, added documentation stub --- package/MDAnalysis/lib/_augment.pyx | 52 ++++++++++++------- .../documentation_pages/lib/augment.rst | 2 + package/setup.py | 4 +- testsuite/MDAnalysisTests/lib/test_augment.py | 2 +- 4 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 package/doc/sphinx/source/documentation_pages/lib/augment.rst diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index 5e8cf3684a9..e9db62fc3e7 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -24,6 +24,7 @@ import cython import numpy as np from .mdamath import triclinic_vectors +cimport numpy as np from libcpp.vector cimport vector from libc.math cimport sqrt @@ -37,22 +38,29 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): """Calculates the relevant images of particles which are within a distance 'r' from the box walls - Only the relevant images are generated i.e. for every set of - coordinates close to the box boundary, - corresponding images which are close to the opposite face and - outside the central cell are generated. If the particle - is close to more than one box walls, - images along the diagonals are also generated :: + The algorithm works by generating explicit periodic images of + interior atoms. For every atom position, its distance from + box walls is evaluated. The distance from any respective + box face is calculated using a dot product of plane normal and + position vector of the atom. If the distance is less than a + specified cutoff distance, relevant periodic images are generated + using the box translation vectors. For instance, an atom close to + `XY` plane containing origin will generate a periodic image + outside the central cell and close to the opposite `XY` plane + of the box. Similarly, if the particle is close to more than + one box walls, images along the diagonals are also generated :: + + + | x x + +---------------+ | +---------------+ + | | | | | + | | | | | + | | | | | + | o | | x | o | + +---------------+ | +---------------+ + | - | x x - +---------------+ | +---------------+ - | | | | | - | | | | | - | | | | | - | o | | x | o | - +---------------+ | +---------------+ - | Parameters ---------- @@ -84,7 +92,10 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): Use `np.concatenate(coordinates, output)` to merge particle coordinates as well as their images. - .. SeeAlso:: :func:'MDAnalysis.lib._augment.undo_augment' + See Also + -------- + MDAnalysis.lib._augment.undo_augment + .. versionadded:: 0.19.0 """ @@ -270,7 +281,7 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): output.push_back(coord[j] - shiftZ[j]) indices.push_back(i) n = indices.size() - return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int32) + return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) @cython.boundscheck(False) @@ -315,7 +326,7 @@ cdef float _norm(float * a): @cython.boundscheck(False) @cython.wraparound(False) -def undo_augment(int[:] results, int[:] translation, int nreal): +def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): """Translate augmented indices back to original indices Parameters @@ -339,7 +350,10 @@ def undo_augment(int[:] results, int[:] translation, int nreal): ---- Modifies the results array in place - .. SeeAlso:: :func:'MDAnalysis.lib._augment.augment_coordinates' + See Also + -------- + 'MDAnalysis.lib._augment.augment_coordinates' + .. versionadded:: 0.19.0 """ @@ -350,4 +364,4 @@ def undo_augment(int[:] results, int[:] translation, int nreal): for i in range(N): if results[i] >= nreal: results[i] = translation[results[i] - nreal] - return np.asarray(results, dtype=np.int) + return np.asarray(results, dtype=np.int64) diff --git a/package/doc/sphinx/source/documentation_pages/lib/augment.rst b/package/doc/sphinx/source/documentation_pages/lib/augment.rst new file mode 100644 index 00000000000..834843d6dcb --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/lib/augment.rst @@ -0,0 +1,2 @@ +.. automodule:: MDAnalysis.lib.augment + :members: \ No newline at end of file diff --git a/package/setup.py b/package/setup.py index 32f595e0da7..6e9a7b381c0 100755 --- a/package/setup.py +++ b/package/setup.py @@ -353,7 +353,7 @@ def extensions(config): include_dirs=include_dirs + ['MDAnalysis/lib/include'], define_macros=define_macros, extra_compile_args=cpp_extra_compile_args) - aug = MDAExtension('MDAnalysis.lib._augment', + augment = MDAExtension('MDAnalysis.lib._augment', sources=['MDAnalysis/lib/_augment' + source_suffix], language='c++', include_dirs=include_dirs, @@ -382,7 +382,7 @@ def extensions(config): extra_compile_args=extra_compile_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, - ap_clustering, spe_dimred, cutil, aug] + ap_clustering, spe_dimred, cutil, augment] cython_generated = [] if use_cython: diff --git a/testsuite/MDAnalysisTests/lib/test_augment.py b/testsuite/MDAnalysisTests/lib/test_augment.py index d15ca0404a4..216ccfed16d 100644 --- a/testsuite/MDAnalysisTests/lib/test_augment.py +++ b/testsuite/MDAnalysisTests/lib/test_augment.py @@ -104,5 +104,5 @@ def test_undoaugment(b, qres): q = apply_PBC(q, b) aug, mapping = augment_coordinates(q, b, radius) for idx, val in enumerate(aug): - imageid = np.asarray([len(q) + idx], dtype=np.int32) + imageid = np.asarray([len(q) + idx], dtype=np.int64) assert_equal(mapping[idx], undo_augment(imageid, mapping, len(q))[0]) From 49882ffdb208eeb8ac57b392fa5ffc751b836ed0 Mon Sep 17 00:00:00 2001 From: mat Date: Wed, 18 Jul 2018 14:06:58 +0100 Subject: [PATCH 241/455] Simple test that checks for the known Survival Probability. Waterdynamics: removed an index bug that went 1 too high tau. --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- .../analysis/test_waterdynamics.py | 29 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 652d82ba3f2..780bcdb473d 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1258,7 +1258,7 @@ def run(self): continue for tau in tau_timeseries: - if t + tau > len(selected): + if t + tau >= len(selected): break Ntau = len(set.intersection(*selected[t:t + tau + 1])) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index eff70eb08bc..79218724e15 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -91,25 +91,25 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): assert_almost_equal(msd_zero.timeseries[1], 0.0) -def test_SurvivalProbability(universe_prot): - sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 0, 10, 4) +def test_SurvivalProbability_t0Ignored(universe_prot): + sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 9, 4) taus, timeseries = sp.run() - print (timeseries) - assert_almost_equal(timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) + assert_almost_equal(timeseries, [0.37 , 0.282, 0.258, 0.252], decimal=3) -def test_SurvivalProbability_t0Ignored(universe_prot): - sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 10, 4) - taus, timeseries = sp.run() - assert_almost_equal(timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) +def test_SurvivalProbability_checkMockGen(universe): + with patch.object(universe, 'select_atoms') as select_atoms_mock: + ids = [(9, 8, 7), (8, 7, 6), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] + select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set + sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) + taus, timeseries = sp.run() + assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) def test_SurvivalProbability_zeroMolecules(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: - select_atoms_mock.return_value = returned_mock_atom_group = Mock() - # fake atom IDs - always the same - returned_mock_atom_group.ids = [] - + # no atom IDs found + select_atoms_mock.return_value = Mock(ids=[]) sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) taus, timeseries = sp.run() assert all(np.isnan(timeseries)) @@ -117,9 +117,8 @@ def test_SurvivalProbability_zeroMolecules(universe): def test_SurvivalProbability_alwaysPresent(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: - select_atoms_mock.return_value = returned_mock_atom_group = Mock() - # fake atom IDs - always the same - returned_mock_atom_group.ids = [7, 8, 1, 9] + # always the same atom IDs found + select_atoms_mock.return_value = Mock(ids=[7, 8, 1, 9]) sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) taus, timeseries = sp.run() From ad4e598f1500464fe69b049663344931f25b4102 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 18 Jul 2018 10:37:10 -0700 Subject: [PATCH 242/455] Updated docstring of dihedrals.py --- package/MDAnalysis/analysis/dihedrals.py | 7 +++++- .../analysis/test_dihedrals.py | 24 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index c60ac077bcf..63faa999196 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -34,6 +34,11 @@ class Ramachandran(AnalysisBase): in the array :attr:`Ramachandran.angles`. A axes object can be obtained with :meth: `Ramachandran.run().plot()`. + If the residue selection is beyond the scope of the protein, then an error + will be raised. If the residue selection includes the first or last residue + then a warning will be raised, and the final array of angles will not + include those residues. + """ def __init__(self, atomgroup, **kwargs): r"""Parameters @@ -57,7 +62,7 @@ def _prepare(self): self.residues = self.atomgroup.residues res_min = np.min(self.atomgroup.universe.select_atoms("protein").residues) res_max = np.max(self.atomgroup.universe.select_atoms("protein").residues) - if any([residue > res_max for residue in self.residues]): + if any([(residue < res_min or residue > res_max) for residue in self.residues]): raise IndexError("Selection exceeds protein length") elif any([residue == (res_min or res_max) for residue in self.residues]): warnings.warn("Cannot determine phi and psi angles for the first or last residues") diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index a16201904ef..0f2c547eb0f 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -7,29 +7,33 @@ from MDAnalysisTests.datafiles import GRO, XTC, DihedralsArray, GLYDihedralsArray from MDAnalysis.analysis import dihedrals + class TestRamachandran(object): @pytest.fixture() def universe(self): - return mda.Universe(GRO,XTC) + return mda.Universe(GRO, XTC) def test_ramachandran(self, universe): rama = dihedrals.Ramachandran(universe.select_atoms("protein")).run() test_rama = np.load(DihedralsArray) assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should match test values") + err_msg="error: dihedral angles should " + "match test values") def test_ramachandran_single_frame(self, universe): - rama = dihedrals.Ramachandran(universe.select_atoms("protein"), start=5, stop=6).run() + rama = dihedrals.Ramachandran(universe.select_atoms("protein"), + start=5, stop=6).run() test_rama = [np.load(DihedralsArray)[5]] assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should match test values") + err_msg="error: dihedral angles should " + "match test values") def test_ramachandran_identical_frames(self, universe, tmpdir): - outfile = os.path.join(str(tmpdir), 'dihedrals.xtc') + outfile = os.path.join(str(tmpdir), "dihedrals.xtc") # write a dummy trajectory of all the same frame with mda.Writer(outfile, universe.atoms.n_atoms) as W: @@ -37,15 +41,17 @@ def test_ramachandran_identical_frames(self, universe, tmpdir): W.write(universe) universe = mda.Universe(GRO, outfile) - rama = dihedrals.Ramachandran(universe.select_atoms('protein')).run() + rama = dihedrals.Ramachandran(universe.select_atoms("protein")).run() test_rama = [np.load(DihedralsArray)[0] for ts in universe.trajectory] assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should match test values") + err_msg="error: dihedral angles should " + "match test values") def test_ramachandran_residue_selections(self, universe): - rama = dihedrals.Ramachandran(universe.select_atoms('resname GLY')).run() + rama = dihedrals.Ramachandran(universe.select_atoms("resname GLY")).run() test_rama = np.load(GLYDihedralsArray) assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should match test values") + err_msg="error: dihedral angles should " + "match test values") From 5bd2e0bee500fc1f7c4a7ef7fca2d0e2ac58ea5f Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 19 Jul 2018 00:23:36 +0100 Subject: [PATCH 243/455] Defined dataset for the test case t0 != 0. The code will be correct if the first two frames are skipped. --- .../analysis/test_waterdynamics.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 79218724e15..b9e4b44dea9 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -34,7 +34,6 @@ SELECTION1 = "byres name OH2" SELECTION2 = "byres name P1" -SELECTION3 = "around 4 (resid 151 and name OE1)" @pytest.fixture(scope='module') @@ -42,11 +41,6 @@ def universe(): return MDAnalysis.Universe(waterPSF, waterDCD) -@pytest.fixture(scope='module') -def universe_prot(): - return MDAnalysis.Universe(PDB, XTC) - - def test_HydrogenBondLifetimes(universe): hbl = waterdynamics.HydrogenBondLifetimes( universe, SELECTION1, SELECTION1, 0, 5, 3) @@ -91,13 +85,16 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): assert_almost_equal(msd_zero.timeseries[1], 0.0) -def test_SurvivalProbability_t0Ignored(universe_prot): - sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 9, 4) - taus, timeseries = sp.run() - assert_almost_equal(timeseries, [0.37 , 0.282, 0.258, 0.252], decimal=3) +def test_SurvivalProbability_t0Ignored(universe): + with patch.object(universe, 'select_atoms') as select_atoms_mock: + ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] + select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set + sp = waterdynamics.SurvivalProbability(universe, "", 2, 6, 3) + taus, timeseries = sp.run() + assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) -def test_SurvivalProbability_checkMockGen(universe): +def test_SurvivalProbability_definedTaus(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: ids = [(9, 8, 7), (8, 7, 6), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set From d194cee51678a0701b426a0b878c643a874dbcf2 Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 19 Jul 2018 00:40:40 +0100 Subject: [PATCH 244/455] t0 testcase covers also tf. If one too many frames is used, wrong results will be given. --- testsuite/MDAnalysisTests/analysis/test_waterdynamics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index b9e4b44dea9..a4ada7d5730 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -85,10 +85,10 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): assert_almost_equal(msd_zero.timeseries[1], 0.0) -def test_SurvivalProbability_t0Ignored(universe): +def test_SurvivalProbability_t0tf(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: - ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] - select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set + ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1), (0, )] + select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop(2)) # atom IDs fed set by set sp = waterdynamics.SurvivalProbability(universe, "", 2, 6, 3) taus, timeseries = sp.run() assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) From 56c0b035dceeb3a7ee6f59828fdf2f7555d7d40b Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 19 Jul 2018 02:17:09 -0700 Subject: [PATCH 245/455] moved _dot, _cross, _norm to _cutil.pyx, modified document structure for _augment --- package/MDAnalysis/lib/_augment.pyx | 93 +++++++------------ package/MDAnalysis/lib/_cutil.pxd | 3 + package/MDAnalysis/lib/_cutil.pyx | 41 ++++++++ package/MDAnalysis/lib/distances.py | 3 + .../documentation_pages/lib/distances.rst | 3 +- 5 files changed, 83 insertions(+), 60 deletions(-) create mode 100644 package/MDAnalysis/lib/_cutil.pxd diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index e9db62fc3e7..a1f90631dfe 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -25,9 +25,11 @@ import cython import numpy as np from .mdamath import triclinic_vectors cimport numpy as np +cimport _cutil +from _cutil cimport _dot ,_norm, _cross from libcpp.vector cimport vector -from libc.math cimport sqrt + __all__ = ['augment_coordinates', 'undo_augment'] @@ -35,19 +37,23 @@ __all__ = ['augment_coordinates', 'undo_augment'] @cython.boundscheck(False) @cython.wraparound(False) def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): - """Calculates the relevant images of particles which are within a + r"""Calculates the relevant images of particles which are within a distance 'r' from the box walls The algorithm works by generating explicit periodic images of - interior atoms. For every atom position, its distance from - box walls is evaluated. The distance from any respective - box face is calculated using a dot product of plane normal and - position vector of the atom. If the distance is less than a + interior atoms residing close to any of the six box walls. + The steps involved in generating images involves + evaluation of reciprocal vectors for the given box vectors + followed by calculation of projection distance of atom along the + reciprocal vectors. If the distance is less than a specified cutoff distance, relevant periodic images are generated - using the box translation vectors. For instance, an atom close to - `XY` plane containing origin will generate a periodic image + using box translation vectors i.e. ``l[a] + m[b] + n[c]``, where + ``[l, m, n]`` are the neighbouring cell indices relative to the central cell, + and ``[a, b, c]`` are the box vectors. For instance, an atom close to + ``XY`` plane containing origin will generate a periodic image outside the central cell and close to the opposite `XY` plane - of the box. Similarly, if the particle is close to more than + of the box i.e. at ``0[a] + 0[b] + 1[c]``. + Similarly, if the particle is close to more than one box walls, images along the diagonals are also generated :: @@ -67,21 +73,21 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): coordinates : array Input coordinate array to generate duplicate images in the vicinity of the central cell. All the coordinates - must be within the primary unit cell. + must be within the primary unit cell. (dtype = numpy.float32) box : array Box dimension of shape (6, ). The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx, ly, lz, alpha, beta, gamma]`` + ``[lx, ly, lz, alpha, beta, gamma]`` (dtype = numpy.float32) r : float thickness of cutoff region for duplicate image generation Returns ------- output : array - coordinates of duplicate(augmented) particles + coordinates of duplicate(augmented) particles (dtype = numpy.float32) indices : array - original indices of the augmented coordinates + original indices of the augmented coordinates (dtype = numpy.int64) A map which translates the indices of augmented particles to their original particle index such that ``indices[augmentedindex] = originalindex`` @@ -89,8 +95,14 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): Note ---- Output doesnot return coordinates from the initial array. - Use `np.concatenate(coordinates, output)` to merge particle - coordinates as well as their images. + To merge the particles with their respective images, following operation + needs to be superseded after generating the images: + + .. code-block:: python + + images, mapping = augment_coordinates(coordinates, box, max_cutoff) + all_coords = np.concatenate([coordinates, images]) + See Also -------- @@ -284,46 +296,6 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) -@cython.boundscheck(False) -@cython.wraparound(False) -cdef float _dot(float * a, float * b): - """Return dot product of two 3d vectors""" - cdef ssize_t n - cdef float sum1 - - sum1 = 0.0 - for n in range(3): - sum1 += a[n] * b[n] - return sum1 - - -@cython.boundscheck(False) -@cython.wraparound(False) -cdef void _cross(float * a, float * b, float * result): - """ - Calculates the cross product between 3d vectors - - Note - ---- - Modifies the result array - """ - - result[0] = a[1]*b[2] - a[2]*b[1] - result[1] = - a[0]*b[2] + a[2]*b[0] - result[2] = a[0]*b[1] - a[1]*b[0] - -cdef float _norm(float * a): - """ - Calculates the magnitude of the vector - """ - cdef float result - cdef ssize_t n - result = 0.0 - for n in range(3): - result += a[n]*a[n] - return sqrt(result) - - @cython.boundscheck(False) @cython.wraparound(False) def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): @@ -331,20 +303,23 @@ def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): Parameters ---------- - results : ndarray of ints - indices of coordinates, including "augmented" indices - translation : ndarray of ints + results : numpy.ndarray + indices of coordinates, including "augmented" indices (dtype = numpy.int64) + translation : numpy.ndarray Map to link the augmented indices to the original particle indices such that ``translation[augmentedindex] = originalindex`` + (dtype = numpy.int64) nreal : int number of real coordinates, i.e. values in results equal or larger than this need to be translated to their real counterpart + Returns ------- - results : ndarray of ints + results : numpy.ndarray modified input results with all the augmented indices translated to their corresponding initial original indices + (dtype = numpy.int64) Note ---- diff --git a/package/MDAnalysis/lib/_cutil.pxd b/package/MDAnalysis/lib/_cutil.pxd new file mode 100644 index 00000000000..5efc82f6d5d --- /dev/null +++ b/package/MDAnalysis/lib/_cutil.pxd @@ -0,0 +1,3 @@ +cdef float _dot(float *, float *) +cdef void _cross(float *, float *, float *) +cdef float _norm(float *) \ No newline at end of file diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index 0463cf15cef..ef1b5f00b3e 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -24,6 +24,7 @@ import cython import numpy as np cimport numpy as np +from libc.math cimport sqrt from MDAnalysis import NoDataError @@ -262,3 +263,43 @@ def make_whole(atomgroup, reference_atom=None): raise ValueError("AtomGroup was not contiguous from bonds, process failed") else: atomgroup.positions = newpos + + +@cython.boundscheck(False) +@cython.wraparound(False) +cdef float _dot(float * a, float * b): + """Return dot product of two 3d vectors""" + cdef ssize_t n + cdef float sum1 + + sum1 = 0.0 + for n in range(3): + sum1 += a[n] * b[n] + return sum1 + + +@cython.boundscheck(False) +@cython.wraparound(False) +cdef void _cross(float * a, float * b, float * result): + """ + Calculates the cross product between 3d vectors + + Note + ---- + Modifies the result array + """ + + result[0] = a[1]*b[2] - a[2]*b[1] + result[1] = - a[0]*b[2] + a[2]*b[0] + result[2] = a[0]*b[1] - a[1]*b[0] + +cdef float _norm(float * a): + """ + Calculates the magnitude of the vector + """ + cdef float result + cdef ssize_t n + result = 0.0 + for n in range(3): + result += a[n]*a[n] + return sqrt(result) \ No newline at end of file diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 790e540ed08..907bbd44cbf 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -61,6 +61,8 @@ .. autofunction:: apply_PBC(coordinates, box [, backend]) .. autofunction:: transform_RtoS(coordinates, box [, backend]) .. autofunction:: transform_StoR(coordinates, box [,backend]) +.. autofunction:: MDAnalysis.lib._augment.augment_coordinates(coordinates, box, radius) +.. autofunction:: MDAnalysis.lib._augment.undo_augment(indices, translation, nreal) """ from __future__ import division, absolute_import @@ -70,6 +72,7 @@ from numpy.lib.utils import deprecate from .mdamath import triclinic_vectors, triclinic_box +from ._augment import augment_coordinates, undo_augment diff --git a/package/doc/sphinx/source/documentation_pages/lib/distances.rst b/package/doc/sphinx/source/documentation_pages/lib/distances.rst index 803d8c7fd0a..8d89a94b09c 100644 --- a/package/doc/sphinx/source/documentation_pages/lib/distances.rst +++ b/package/doc/sphinx/source/documentation_pages/lib/distances.rst @@ -2,6 +2,7 @@ :members: + Low-level modules for :mod:`MDAnalysis.lib.distances` ===================================================== @@ -15,4 +16,4 @@ the OpenMP-enable functions. :maxdepth: 1 c_distances - c_distances_openmp + c_distances_openmp \ No newline at end of file From 7ef48ef8f36ca795974d8be8f3dc9825c12c0394 Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 19 Jul 2018 02:30:06 -0700 Subject: [PATCH 246/455] removed augment.rst --- package/doc/sphinx/source/documentation_pages/lib/augment.rst | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 package/doc/sphinx/source/documentation_pages/lib/augment.rst diff --git a/package/doc/sphinx/source/documentation_pages/lib/augment.rst b/package/doc/sphinx/source/documentation_pages/lib/augment.rst deleted file mode 100644 index 834843d6dcb..00000000000 --- a/package/doc/sphinx/source/documentation_pages/lib/augment.rst +++ /dev/null @@ -1,2 +0,0 @@ -.. automodule:: MDAnalysis.lib.augment - :members: \ No newline at end of file From 4dabf32c9861735c9aca7f0657498cdc5abd3568 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 19 Jul 2018 16:14:11 -0700 Subject: [PATCH 247/455] Switched to distances.calc_dihedrals and simplified plot function --- package/MDAnalysis/analysis/dihedrals.py | 88 +++++++++--------------- 1 file changed, 34 insertions(+), 54 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 63faa999196..4f3114bd7e3 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -3,26 +3,7 @@ import warnings from MDAnalysis.analysis.base import AnalysisBase - -def dihedral_calc(atomgroups): - """Calculates phi and psi angles for a list of AtomGroups over trajectory. - - Parameters - ---------- - atomgroups : list of AtomGroups - must be a list of one or more AtomGroups containing 5 atoms in the - correct order (i.e. C-N-CA-C-N) - - Returns - ------- - angles : numpy.ndarray - An array of time steps which contain (phi,psi) for all AtomGroups. - """ - - dihedrals = [atomgroup.dihedral for atomgroup in atomgroups] - angles = [dih.value() for dih in dihedrals] - - return angles +from MDAnalysis.lib.distances import calc_dihedrals class Ramachandran(AnalysisBase): @@ -57,32 +38,43 @@ def __init__(self, atomgroup, **kwargs): """ super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) self.atomgroup = atomgroup + residues = self.atomgroup.residues + protein = self.atomgroup.universe.select_atoms("protein").residues + + if not residues.issubset(protein): + raise IndexError("Found atoms outside of protein. Only atoms " + "inside of a 'protein' selection can be used to " + "calculate dihedrals.") + elif not residues.isdisjoint(protein[[0, -1]]): + warnings.warn("Cannot determine phi and psi angles for the first " + "or last residues") + residues = residues.difference(protein[[0, -1]]) + + phi_sel = [res.phi_selection() for res in residues] + psi_sel = [res.psi_selection() for res in residues] + self.ag1 = mda.AtomGroup([atoms[0] for atoms in phi_sel]) + self.ag2 = mda.AtomGroup([atoms[1] for atoms in phi_sel]) + self.ag3 = mda.AtomGroup([atoms[2] for atoms in phi_sel]) + self.ag4 = mda.AtomGroup([atoms[3] for atoms in phi_sel]) + self.ag5 = mda.AtomGroup([atoms[3] for atoms in psi_sel]) def _prepare(self): - self.residues = self.atomgroup.residues - res_min = np.min(self.atomgroup.universe.select_atoms("protein").residues) - res_max = np.max(self.atomgroup.universe.select_atoms("protein").residues) - if any([(residue < res_min or residue > res_max) for residue in self.residues]): - raise IndexError("Selection exceeds protein length") - elif any([residue == (res_min or res_max) for residue in self.residues]): - warnings.warn("Cannot determine phi and psi angles for the first or last residues") - - self.phi_atoms = [residue.phi_selection() for residue in self.residues - if res_min < residue < res_max] - self.psi_atoms = [residue.psi_selection() for residue in self.residues - if res_min < residue < res_max] - self.angles = [] def _single_frame(self): - self.phi_angles = dihedral_calc(self.phi_atoms) - self.psi_angles = dihedral_calc(self.psi_atoms) - self.angles.append((self.phi_angles,self.psi_angles)) + phi_angles = calc_dihedrals(self.ag1.positions, self.ag2.positions, + self.ag3.positions, self.ag4.positions, + box=self.ag1.dimensions) + psi_angles = calc_dihedrals(self.ag2.positions, self.ag3.positions, + self.ag4.positions, self.ag5.positions, + box=self.ag1.dimensions) + phi_psi = zip(phi_angles, psi_angles) + self.angles.append(phi_psi) def _conclude(self): - self.angles = np.array(self.angles) + self.angles = np.rad2deg(np.array(self.angles)) - def plot(self, ax=None, color='k', marker='s', title=None): + def plot(self, ax=None, **kwargs): """Plots data into standard ramachandran plot. Each time step in self.angles is plotted onto the same graph. @@ -91,13 +83,6 @@ def plot(self, ax=None, color='k', marker='s', title=None): ax : :class:`matplotlib.axes.Axes` If no `ax` is supplied or set to ``None`` then the plot will be added to the current active axes. - color : string, optional - Color used for markers in the plot; the default color is 'black'. - marker : string, optional - Marker used in plot; the default marker is 'square'. - title : string, optional - Title of axes object; the default `None` leaves plot without a - title. Returns ------- @@ -110,12 +95,7 @@ def plot(self, ax=None, color='k', marker='s', title=None): ax.axis([-180,180,-180,180]) ax.axhline(0, color='k', lw=1) ax.axvline(0, color='k', lw=1) - ax.set_xticks(range(-180,181,60)) - ax.set_yticks(range(-180,181,60)) - ax.set_xlabel(r"$\phi$ (deg)") - ax.set_ylabel(r"$\psi$ (deg)") - if title is not None: - ax.set_title(title) - for angles in self.angles: - ax.plot(angles[0],angles[1], color=color, - marker=marker, linestyle='') + ax.set(xticks=range(-180,181,60), yticks=range(-180,181,60), + xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") + a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) + ax.scatter(a[:,0], a[:,1]) From f0d8030f0100a0c7c9d7e360e75fa08de161d554 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 19 Jul 2018 16:19:56 -0700 Subject: [PATCH 248/455] Fixed imports --- package/MDAnalysis/analysis/dihedrals.py | 1 + 1 file changed, 1 insertion(+) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 4f3114bd7e3..9f8f029e374 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -2,6 +2,7 @@ import matplotlib.pyplot as plt import warnings +import MDAnalysis as mda from MDAnalysis.analysis.base import AnalysisBase from MDAnalysis.lib.distances import calc_dihedrals From 15c2bd95d2bc5bf9114587b209948cbc1e442101 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 19 Jul 2018 16:49:40 -0700 Subject: [PATCH 249/455] Added six to imports --- package/MDAnalysis/analysis/dihedrals.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 9f8f029e374..262094b0f26 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -1,6 +1,8 @@ import numpy as np import matplotlib.pyplot as plt import warnings +import six +from six.moves import zip import MDAnalysis as mda from MDAnalysis.analysis.base import AnalysisBase @@ -75,6 +77,7 @@ def _single_frame(self): def _conclude(self): self.angles = np.rad2deg(np.array(self.angles)) + def plot(self, ax=None, **kwargs): """Plots data into standard ramachandran plot. Each time step in self.angles is plotted onto the same graph. From 3b79336125117c2a397008d321da48a039220757 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 19 Jul 2018 17:20:18 -0700 Subject: [PATCH 250/455] Fixed zip function --- package/MDAnalysis/analysis/dihedrals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 262094b0f26..eeab3cdc7fd 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -1,7 +1,7 @@ import numpy as np import matplotlib.pyplot as plt import warnings -import six +import six from six.moves import zip import MDAnalysis as mda @@ -71,7 +71,7 @@ def _single_frame(self): psi_angles = calc_dihedrals(self.ag2.positions, self.ag3.positions, self.ag4.positions, self.ag5.positions, box=self.ag1.dimensions) - phi_psi = zip(phi_angles, psi_angles) + phi_psi = [(phi, psi) for phi, psi in zip(phi_angles, psi_angles)] self.angles.append(phi_psi) def _conclude(self): From bfc75c9d6d8341e4951c14ec53aedb42809bdacd Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 19 Jul 2018 17:21:17 -0700 Subject: [PATCH 251/455] Updated test references and added them to __all__ --- .../data/adk_oplsaa_GLY_dihedrals.npy | Bin 3168 -> 3168 bytes .../data/adk_oplsaa_dihedrals.npy | Bin 34048 -> 34048 bytes testsuite/MDAnalysisTests/datafiles.py | 3 ++- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_dihedrals.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_dihedrals.npy index 1ce2e9e4e47c7a16361dcb005fa48752cf998529..7f034dc41d08f75426e912f08c4a74a11d76a20f 100644 GIT binary patch literal 3168 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 =bL6qRq;5J^at9o10Gj zkcDFt5e91{0+4paLfjdN43{q?-{VhgjRgnUzvPZ4o{z zqeul`ZgjW$Tx5=!7fWuY$F2vr`y+wkZ#8jDLY6W*>ji3t&DtMDxDd?>9qEqX!V#N- zhO5s!&?&|4R&^f>j1=-pH;d;Z5YQ1c4YX%l? zpbZ<(5|D8EZNi=$5?$LHoGFe0K-FJu)GMQgN*Nl^lg1=|w55Ws;nxBKU2XGmyme)#eIuf9#lpEW0fIlz{q$c$!j@VAiD&Mhn+ zWII}27Lj9OZhX&*(tZN&xEQFfOz;NLBg}4EyC+<}rCqS`3jq%Wxw(PbEHsH>XD=xt zq2*lp&gd3zU`13f4o<9Ad&RP9)wv{!6BK0O=r`EER5{;%iwe#9O!E-fx*y6PaYT}#|F zTpfS!b12<()E7q=u4iXF+KDR~M>TeIn!LD>L@OIAVM+s|;_}j2TzmkF?m7(&~L=#BWo$2tV@PSm;(3I!$z(w)Rfy#e9z~1U0 z`|iwk-0*E1d%A=TW35gL?>b2=JFR7_ok+q88Kw)z#{>5e$vIwUJ%EKj+jHM|g4CA5 zPWxmQSodsH?|e(b<|}zcAqTiPGHaK$td<3vQ#r-sQe4vM?2k#D^l=YowV}K(k{dWUjP(FCq8?p$tw}kvRmftd~rNaV^#Om5Pd*)yh-Su zA~c47e0(Cw477B)$Ll<4Fk2!XHF{eUA2c|P)cLG~_XiDq$_m}EcfNG-eH9%}Dz0($ z^i{;5?gWQ^(gz5GHRIRyco1mPDP&jd3Dw(ll5ZmuTmAF9hBOJV*^$@LTjqr=%l;Vm z*W|&DPrDwUFmu5JR%=H5OMmT`#MY2A>_^o2`L zn@2yX%m^0#&f3?{vIHaBr7Rg8V+=NTb2D8ckC&{LeQBmUU|5=?3u`$8+%xp7-_)dL(<69x7&DQ(7X1;p%PUF-1NoH+t4f_*ZW3QHYaO zSza*ss#2G}iiPFV*C*|SS&($IvNk}Ji>k5BjVmPy5WHF?A)C&`d8djmB97Uvg3>g={&nU#vA+O@V}|^oHH$ zrA!P`r@I+Ma=|J}MLJS~hqYI2IzQ60fWVb1&VR@2DF>)v}qAc|9t=cD{S! zhO#COl(z+ab+kj07xkSiWP(uekK-BdjZiwc{OXLf0tzd5s#faqF~3f0E9)i|+g8dy zzG%D|UZn7u{Pz;DdrTqG#!(zh9=7{UR<42vG0C=Ti`3Du+SSZOdlTx?EhL##3Q%-T KnjGG(5B~*55Vw5* diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_dihedrals.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_dihedrals.npy index 0f579dc86d216e93dbc94b4354dc47d268c059f0..0ee56e9ebc0f5b7573f57418f5a672630c774a8c 100644 GIT binary patch literal 34048 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 VxS#lr*lJQE1O1Bzw%I;9=zo5HXtDqR diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 1e053f06f9b..3109f100527 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -155,7 +155,8 @@ "legacy_DCD_NAMD_coords", # frame 0 read in for SiN_tric_namd.dcd using legacy DCD reader "legacy_DCD_c36_coords", # frames 1 and 4 read in for tip125_tric_C36.dcd using legacy DCD reader "GSD", - "GRO_MEMPROT", "XTC_MEMPROT" # YiiP transporter in POPE:POPG lipids with Na+, Cl-, Zn2+ dummy model without water + "GRO_MEMPROT", "XTC_MEMPROT", # YiiP transporter in POPE:POPG lipids with Na+, Cl-, Zn2+ dummy model without water + "DihedralsArray", "GLYDihedralsArray" # phi and psi angles for testing Ramachandran class ] from pkg_resources import resource_filename From c5fcfb8d80470aa147b662a2b52400029f9f2da5 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 19 Jul 2018 17:27:49 -0700 Subject: [PATCH 252/455] Removed identical frames test, switched to assert_almost_equal --- .../analysis/test_dihedrals.py | 38 +++++-------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 0f2c547eb0f..152e3342cac 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_array_almost_equal +from numpy.testing import assert_almost_equal import pytest -import os import MDAnalysis as mda from MDAnalysisTests.datafiles import GRO, XTC, DihedralsArray, GLYDihedralsArray @@ -18,40 +17,23 @@ def test_ramachandran(self, universe): rama = dihedrals.Ramachandran(universe.select_atoms("protein")).run() test_rama = np.load(DihedralsArray) - assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should " - "match test values") + assert_almost_equal(rama.angles, test_rama, 5, + err_msg="error: dihedral angles should " + "match test values") def test_ramachandran_single_frame(self, universe): rama = dihedrals.Ramachandran(universe.select_atoms("protein"), start=5, stop=6).run() test_rama = [np.load(DihedralsArray)[5]] - assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should " - "match test values") - - def test_ramachandran_identical_frames(self, universe, tmpdir): - - outfile = os.path.join(str(tmpdir), "dihedrals.xtc") - - # write a dummy trajectory of all the same frame - with mda.Writer(outfile, universe.atoms.n_atoms) as W: - for _ in range(universe.trajectory.n_frames): - W.write(universe) - - universe = mda.Universe(GRO, outfile) - rama = dihedrals.Ramachandran(universe.select_atoms("protein")).run() - test_rama = [np.load(DihedralsArray)[0] for ts in universe.trajectory] - - assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should " - "match test values") + assert_almost_equal(rama.angles, test_rama, 5, + err_msg="error: dihedral angles should " + "match test values") def test_ramachandran_residue_selections(self, universe): rama = dihedrals.Ramachandran(universe.select_atoms("resname GLY")).run() test_rama = np.load(GLYDihedralsArray) - assert_array_almost_equal(rama.angles, test_rama, 5, - err_msg="error: dihedral angles should " - "match test values") + assert_almost_equal(rama.angles, test_rama, 5, + err_msg="error: dihedral angles should " + "match test values") From a2090fac75a5da83d7502c6606f89ffa941fbcba Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 16 Jul 2018 02:21:09 -0700 Subject: [PATCH 253/455] First commit to replace Biopython with Scipy KDTree along with tests and doc --- package/MDAnalysis/lib/pkdtree.py | 198 ++++++++++++++++++ testsuite/MDAnalysisTests/lib/test_pkdtree.py | 152 ++++++++------ 2 files changed, 287 insertions(+), 63 deletions(-) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 8baa07067fa..206c641d994 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -33,6 +33,10 @@ import itertools import numpy as np from Bio.KDTree import _CKDTree +from scipy.spatial import cKDTree + +from MDAnalysis.lib._cutil import unique_int_1d +from MDAnalysis.lib._augment import augment_coordinates, undo_augment from MDAnalysis.lib.distances import _box_check, _check_array, apply_PBC from MDAnalysis.lib.mdamath import norm, triclinic_vectors, triclinic_box @@ -230,3 +234,197 @@ def get_indices(self): neighbors for the last query points and search radius """ return self._indices + + +class Periodic_cKDTree(object): + """Wrapper around scipy.spatial.cKDtree + + Creates an object which can handle periodic as well as + non periodic boundary condtions depending on the parameters + provided while constructing the tree. + + To enable periodic boundary conditions, box dimensions must be + provided. Periodic Boundary conditions are implemented by creating + duplicates of the particles which are within the specified cutoff + distance from the boundary. These duplicates along with the + original particle coordinates are used with the cKDTree + without any special treatment due to PBC beyond this point. + The final results after any operation with duplicate particle indices + can be traced back to the original particle using undo augment function. + """ + def __init__(self, box=None, leafsize=10): + """ + Parameters + ---------- + box : array-like or ``None``, optional, default ``None`` + Simulation cell dimensions in the form of + :attr:`MDAnalysis.trajectory.base.Timestep.dimensions` when + periodic boundary conditions should be taken into account for + the calculation of contacts. + leafsize : int + Number of entries in leafs of the KDTree. If you suffer poor + performance you can play around with this number. Increasing the + `leafsize` will speed up the construction of the KDTree but + slow down the search. + """ + self.leafsize = leafsize + self.dim = 3 # 3D systems + self.box = box + self.periodic = False + if box is not None: + self.periodic = True + self._indices = list() + self._built = False + self.cutoff = None + + def set_coords(self, coords, cutoff=None): + """Constructs KDTree from the coordinates + + Wrapping of coordinates to the primary unit cell is enforced + before any distance evaluations. If periodic boundary conditions + are enabled, then duplicate particles are generated in the + vicinity of the box. An additional array `mapping` is also + generated which can be later used to trace the origin of + duplicate particle coordinates. + + For non-periodic calculations, cutoff should not be provided + but the parameter is required for periodic calculations. + + Parameters + ---------- + coords: array_like + Coordinate array of shape ``(N, 3)`` for N atoms. + cutoff: float + Specified cutoff distance to create duplicate images + Typically equivalent to the desired search radius + or the maximum of the desired cutoff radius. Relevant images + corresponding to every atom which lies + within ``cutoff`` distance from either of the box boundary + will be generated. + + .. seealso:: :func:`MDAnalysis.lib._augment.augment_coordinates` + """ + # if already built + if self._built: + raise RuntimeError('Tree is already built. If need to change the cutoff radius' + 'Run tree.set_cutoff(cutoff)') + # If no cutoff distance is provided but PBC aware + if self.periodic and (cutoff is None): + raise RuntimeError('Provide a cutoff distance with tree.set_coords(...)') + + if self.periodic: + self.cutoff = cutoff + # Bring the coordinates in the central cell + self.coords = apply_PBC(coords, self.box) + # generate duplicate images + self.aug, self.mapping = augment_coordinates(self.coords, + self.box, + self.cutoff) + # Images + coords + self.all_coords = np.concatenate([self.coords, self.aug]) + self.ckdt = cKDTree(self.all_coords, leafsize=self.leafsize) + else: + # if cutoff distance is provided for non PBC calculations + if cutoff is not None: + raise RuntimeError('Donot provide cutoff distance for non PBC aware calculations') + self.coords = coords + self.ckdt = cKDTree(self.coords, self.leafsize) + self._built = True + + def set_cutoff(self, cutoff): + """Change the cutoff to rebuild the tree""" + if not self._built: + raise RuntimeError('Unbuilt tree. Run tree.set_coords(...)') + if self.periodic: + if self.cutoff < cutoff: + self.cutoff = cutoff + self._built = False + self.set_coords(self.coords, self.cutoff) + else: + raise RuntimeError('No need to build') + else: + raise RuntimeError('No need to build') + + def search(self, centers, radius): + """Search all points within radius from centers and their periodic images. + + All the centers coordinates are wrapped around the central cell + to enable distance evaluations from points in the tree and their images. + + Parameter + --------- + centers: array_like (N,3) + coordinate array to search for neighbors + radius: float + maximum distance to search for neighbors. + """ + + if not self._built: + raise RuntimeError('Unbuilt tree. Run tree.set_coords(...)') + + centers = np.asarray(centers) + if centers.shape == (self.dim, ): + centers = centers.reshape((1, self.dim)) + + self._indices = set() # clear previous search + if self.periodic: + if self.cutoff < radius: + raise RuntimeError('Set cutoff greater or equal to the radius.' + ' Use tree.set_cutoff(...)') + # Bring all query points to the central cell + wrapped_centers = apply_PBC(centers, self.box) + indices = list(self.ckdt.query_ball_point(wrapped_centers, + radius)) + self._indices = np.array(list( + itertools.chain.from_iterable(indices)), + dtype=np.int32) + if self._indices.size > 0: + self._indices = undo_augment(self._indices, + self.mapping, + len(self.coords)) + else: + wrapped_centers = np.asarray(centers) + indices = list(self.ckdt.query_ball_point(wrapped_centers, + radius)) + self._indices = np.array(list( + itertools.chain.from_iterable(indices)), + dtype=np.int) + self._indices = np.asarray(self._indices, dtype=np.int64) + self._indices = np.asarray(unique_int_1d(self._indices)) + return self._indices + + def search_pairs(self, radius): + """Search all the pairs within a specified radius + + Parameters + ---------- + radius : float + Maximum distance between pairs of coordinates + + Returns + ------- + pairs : array + Indices of all the pairs which are within the specified radius + """ + if not self._built: + raise RuntimeError(' Unbuilt Tree. Run tree.set_coords(...)') + + if self.periodic: + if self.cutoff < radius: + raise RuntimeError('Set cutoff greater than the radius.' + 'Use tree.set_cutoff(...)') + + pairs = np.array(list(self.ckdt.query_pairs(radius)), dtype=np.int32) + if self.periodic: + if len(pairs) > 1: + pairs[:, 0] = undo_augment(pairs[:, 0], self.mapping, + len(self.coords)) + pairs[:, 1] = undo_augment(pairs[:, 1], self.mapping, + len(self.coords)) + if pairs.size > 0: + pairs = np.sort(pairs, axis=1) + unique_pairs = [tuple(x) for x in pairs] + unique_pairs = sorted(set(unique_pairs), + key=lambda x: unique_pairs.index(x)) + pairs = np.asarray(unique_pairs, dtype=np.int64) + return pairs diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index f4fbbee239d..10b396fdb2d 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -28,7 +28,9 @@ import numpy as np from numpy.testing import assert_equal, assert_almost_equal + from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.pkdtree import Periodic_cKDTree from MDAnalysis.lib.mdamath import triclinic_vectors, triclinic_box from MDAnalysis.lib.distances import (_box_check, transform_RtoS, transform_StoR, apply_PBC) @@ -143,68 +145,92 @@ def test_find_images(b, qcs): assert_almost_equal(found_images, cs, decimal=6) -# -# Testing for neighbor finding -# - -# Find neighbors for a given query vector, here in fractional coordinates. -queries_2 = ([0.5, 0.5, 0.5], # case box center - [0, 1, 0.07], # box face - [0.1, 0.1, 0.5], # box edge - [0.1, 0.1, 0.1], # box vertex - ([-1.9, 4.2, 0.2], [2.1, -3.1, 0.1]) # multiple queries - ) -# Expected neighbors of queries_2 in the orthogonal box case, here in -# fractional coordinates. -n_ortho = (([0.5, 0.5, 0.5],), - ([1.1, -1.1, 1.1], ), - (), - ([0.11, 0.11, 0.11], ), - ([0.2, 0.2, 0.2], [0.11, 0.11, 0.11], [2.1, 2.1, 0.3], - [1.1, -1.1, 1.1]) - ) -# Expected neighbors for previous queries in the trigonal box case -n_tric = (([0.5, 0.5, 0.5],), - ([1.1, -1.1, 1.1], ), - (), - ([0.11, 0.11, 0.11], ), - ([0.2, 0.2, 0.2], [2.1, 2.1, 0.3], [1.1, -1.1, 1.1]) - ) - -# Combinations of boxes, query points, and expected neighbors. -doublets = list() -for b, n in zip(boxes_2, (n_ortho, n_tric)): - doublets.extend(list(product([b], zip(queries_2, n)))) - - -@pytest.mark.parametrize('b, qns', doublets) -def test_search(b, qns): - """ - Test finding neighbors for a given query vector and type of box. - - Parameters - ---------- - b : list - MDAnalysis dimensions like list - qns : tuple - a query point and a list of expected neighbors. - """ +@pytest.mark.parametrize('b, cut, result', ( + (None, 1.0, + 'Donot provide cutoff distance' + ' for non PBC aware calculations'), + ([10, 10, 10, 90, 90, 90], None, + 'Provide a cutoff distance with' + ' tree.set_coords(...)'))) +def test_ckd_setcoords(b, cut, result): + coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) + if b is not None: + b = np.array(b, dtype=np.float32) + tree = Periodic_cKDTree(box=b) + print(b, tree.box, cut, result) + with pytest.raises(RuntimeError, match=result): + tree.set_coords(coords, cutoff=cut) + + +@pytest.mark.parametrize('b, cut, new_cut, result', + ((None, None, 1.0, + 'No need to build'), + ([10, 10, 10, 90, 90, 90], 1.0, 0.9, + 'No need to build'))) +def test_ckd_setcutoff_fail(b, cut, new_cut, result): + coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) + if b is not None: + b = np.array(b, dtype=np.float32) + tree = Periodic_cKDTree(box=b) + tree.set_coords(coords, cutoff=cut) + with pytest.raises(RuntimeError, match=result): + tree.set_cutoff(new_cut) + + +def test_ckd_directsetcutoff(): + b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) + cutoff = 1.0 + tree = Periodic_cKDTree(box=b) + with pytest.raises(RuntimeError, match='Unbuilt tree. Run tree.set_coords(...)'): + tree.set_cutoff(cutoff) + + +def test_searchfail(): + coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) + b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) + cutoff = 1.0 + search_radius = 2.0 + query = np.array([1, 1, 1], dtype=np.float32) + tree = Periodic_cKDTree(box=b) + tree.set_coords(coords, cutoff=cutoff) + match = 'Set cutoff greater or equal to the radius.' \ + ' Use tree.set_cutoff(...)' + with pytest.raises(RuntimeError, match=match): + tree.search(query, search_radius) + + +@pytest.mark.parametrize('b, q, result', ( + ([10, 10, 10, 90, 90, 90], [0.5, -0.1, 1.1], []), + ([10, 10, 10, 90, 90, 90], [2.1, -3.1, 0.1], [2, 3, 4]), + ([10, 10, 10, 45, 60, 90], [2.1, -3.1, 0.1], [2, 3]) + )) +def test_search(b, q, result): b = np.array(b, dtype=np.float32) - q = transform_StoR(np.array(qns[0], dtype=np.float32), b) - # Setting up the periodic tree - tree = PeriodicKDTree(b) + q = transform_StoR(np.array(q, dtype=np.float32), b) + cutoff = 3.0 coords = transform_StoR(f_dataset, b) - tree.set_coords(coords) # Input real space coordinates - # Carry out the search and retrieve results - tree.search(q, radius) - indices = tree.get_indices() - if indices: - found_neighbors = np.sort(coords[indices], axis=0) - else: - found_neighbors = list() - if qns[1]: - expected_neighbors = transform_StoR(np.array(qns[1],dtype=np.float32), b) - expected_neighbors = np.sort(expected_neighbors, axis=0) - else: - expected_neighbors = list() - assert_equal(found_neighbors, expected_neighbors) + tree = Periodic_cKDTree(box=b) + tree.set_coords(coords, cutoff=cutoff) + indices = tree.search(q, cutoff) + assert_equal(indices, result) + + +@pytest.mark.parametrize('b, result', ( + ([10, 10, 10, 90, 90, 90], [[0, 2], + [0, 4], + [2, 3], + [2, 4], + [3, 4]]), + ([10, 10, 10, 45, 60, 90], [[0, 4], + [0, 2], + [2, 4], + [2, 3]]) + )) +def test_searchpairs(b, result): + b = np.array(b, dtype=np.float32) + cutoff = 3.0 + coords = transform_StoR(f_dataset, b) + tree = Periodic_cKDTree(box=b) + tree.set_coords(coords, cutoff=cutoff) + indices = tree.search_pairs(cutoff) + assert_equal(indices[np.argsort(indices, axis=0)[:, 0]], result) From c9a615f68ea6b8bea3157b5583c9cf89ed9b086f Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 16 Jul 2018 02:38:27 -0700 Subject: [PATCH 254/455] recover accidently deleted test from PeriodicKDTree --- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 69 ++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index 10b396fdb2d..ce6d4ed2197 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -144,7 +144,72 @@ def test_find_images(b, qcs): found_images = np.sort(tree.find_images(q_wrapped, radius), axis=0) assert_almost_equal(found_images, cs, decimal=6) +# +# Testing for neighbor finding +# + +# Find neighbors for a given query vector, here in fractional coordinates. +queries_2 = ([0.5, 0.5, 0.5], # case box center + [0, 1, 0.07], # box face + [0.1, 0.1, 0.5], # box edge + [0.1, 0.1, 0.1], # box vertex + ([-1.9, 4.2, 0.2], [2.1, -3.1, 0.1]) # multiple queries + ) +# Expected neighbors of queries_2 in the orthogonal box case, here in +# fractional coordinates. +n_ortho = (([0.5, 0.5, 0.5],), + ([1.1, -1.1, 1.1], ), + (), + ([0.11, 0.11, 0.11], ), + ([0.2, 0.2, 0.2], [0.11, 0.11, 0.11], [2.1, 2.1, 0.3], + [1.1, -1.1, 1.1]) + ) +# Expected neighbors for previous queries in the trigonal box case +n_tric = (([0.5, 0.5, 0.5],), + ([1.1, -1.1, 1.1], ), + (), + ([0.11, 0.11, 0.11], ), + ([0.2, 0.2, 0.2], [2.1, 2.1, 0.3], [1.1, -1.1, 1.1]) + ) + +# Combinations of boxes, query points, and expected neighbors. +doublets = list() +for b, n in zip(boxes_2, (n_ortho, n_tric)): + doublets.extend(list(product([b], zip(queries_2, n)))) + + +@pytest.mark.parametrize('b, qns', doublets) +def test_search(b, qns): + """ + Test finding neighbors for a given query vector and type of box. + Parameters + ---------- + b : list + MDAnalysis dimensions like list + qns : tuple + a query point and a list of expected neighbors. + """ + b = np.array(b, dtype=np.float32) + q = transform_StoR(np.array(qns[0], dtype=np.float32), b) + # Setting up the periodic tree + tree = PeriodicKDTree(b) + coords = transform_StoR(f_dataset, b) + tree.set_coords(coords) # Input real space coordinates + # Carry out the search and retrieve results + tree.search(q, radius) + indices = tree.get_indices() + if indices: + found_neighbors = np.sort(coords[indices], axis=0) + else: + found_neighbors = list() + if qns[1]: + expected_neighbors = transform_StoR(np.array(qns[1],dtype=np.float32), b) + expected_neighbors = np.sort(expected_neighbors, axis=0) + else: + expected_neighbors = list() + assert_equal(found_neighbors, expected_neighbors) +# Test Periodic cKDTree @pytest.mark.parametrize('b, cut, result', ( (None, 1.0, 'Donot provide cutoff distance' @@ -204,7 +269,7 @@ def test_searchfail(): ([10, 10, 10, 90, 90, 90], [2.1, -3.1, 0.1], [2, 3, 4]), ([10, 10, 10, 45, 60, 90], [2.1, -3.1, 0.1], [2, 3]) )) -def test_search(b, q, result): +def test_ckd_search(b, q, result): b = np.array(b, dtype=np.float32) q = transform_StoR(np.array(q, dtype=np.float32), b) cutoff = 3.0 @@ -226,7 +291,7 @@ def test_search(b, q, result): [2, 4], [2, 3]]) )) -def test_searchpairs(b, result): +def test_ckd_searchpairs(b, result): b = np.array(b, dtype=np.float32) cutoff = 3.0 coords = transform_StoR(f_dataset, b) From fae1bee1756f380de5d9eb87dc9a083e1c780811 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 17 Jul 2018 22:00:35 -0700 Subject: [PATCH 255/455] changed the tuple sorting --- package/MDAnalysis/lib/pkdtree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 206c641d994..b10f957bba2 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -425,6 +425,6 @@ def search_pairs(self, radius): pairs = np.sort(pairs, axis=1) unique_pairs = [tuple(x) for x in pairs] unique_pairs = sorted(set(unique_pairs), - key=lambda x: unique_pairs.index(x)) + key=lambda x: x[0]) pairs = np.asarray(unique_pairs, dtype=np.int64) return pairs From 0d35aefc2980c00f0085cbecddca6615da775009 Mon Sep 17 00:00:00 2001 From: ayush Date: Fri, 20 Jul 2018 01:22:27 -0700 Subject: [PATCH 256/455] modified the tests and module a/c to returns of augment, added more tests --- package/MDAnalysis/lib/pkdtree.py | 31 +++++--- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 72 +++++++++++++++---- 2 files changed, 78 insertions(+), 25 deletions(-) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index b10f957bba2..5a966a86814 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -42,7 +42,7 @@ from MDAnalysis.lib.mdamath import norm, triclinic_vectors, triclinic_box __all__ = [ - 'PeriodicKDTree', + 'PeriodicKDTree', 'Periodic_cKDTree' ] @@ -254,6 +254,7 @@ class Periodic_cKDTree(object): """ def __init__(self, box=None, leafsize=10): """ + Parameters ---------- box : array-like or ``None``, optional, default ``None`` @@ -261,11 +262,12 @@ def __init__(self, box=None, leafsize=10): :attr:`MDAnalysis.trajectory.base.Timestep.dimensions` when periodic boundary conditions should be taken into account for the calculation of contacts. - leafsize : int + leafsize : int (optional) Number of entries in leafs of the KDTree. If you suffer poor performance you can play around with this number. Increasing the `leafsize` will speed up the construction of the KDTree but slow down the search. + """ self.leafsize = leafsize self.dim = 3 # 3D systems @@ -288,7 +290,7 @@ def set_coords(self, coords, cutoff=None): duplicate particle coordinates. For non-periodic calculations, cutoff should not be provided - but the parameter is required for periodic calculations. + the parameter is only required for periodic calculations. Parameters ---------- @@ -302,9 +304,15 @@ def set_coords(self, coords, cutoff=None): within ``cutoff`` distance from either of the box boundary will be generated. - .. seealso:: :func:`MDAnalysis.lib._augment.augment_coordinates` + + See Also + -------- + MDAnalysis.lib._augment.augment_coordinates + + """ - # if already built + + # Check if already built if self._built: raise RuntimeError('Tree is already built. If need to change the cutoff radius' 'Run tree.set_cutoff(cutoff)') @@ -312,6 +320,10 @@ def set_coords(self, coords, cutoff=None): if self.periodic and (cutoff is None): raise RuntimeError('Provide a cutoff distance with tree.set_coords(...)') + # set coords dtype to float32 + # augment coordinates will work only with float32 + coords = np.asarray(coords, dtype=np.float32) + if self.periodic: self.cutoff = cutoff # Bring the coordinates in the central cell @@ -377,7 +389,7 @@ def search(self, centers, radius): radius)) self._indices = np.array(list( itertools.chain.from_iterable(indices)), - dtype=np.int32) + dtype=np.int64) if self._indices.size > 0: self._indices = undo_augment(self._indices, self.mapping, @@ -389,7 +401,6 @@ def search(self, centers, radius): self._indices = np.array(list( itertools.chain.from_iterable(indices)), dtype=np.int) - self._indices = np.asarray(self._indices, dtype=np.int64) self._indices = np.asarray(unique_int_1d(self._indices)) return self._indices @@ -411,10 +422,10 @@ def search_pairs(self, radius): if self.periodic: if self.cutoff < radius: - raise RuntimeError('Set cutoff greater than the radius.' - 'Use tree.set_cutoff(...)') + raise RuntimeError('Set cutoff greater or equal to the radius.' + ' Use tree.set_cutoff(...)') - pairs = np.array(list(self.ckdt.query_pairs(radius)), dtype=np.int32) + pairs = np.array(list(self.ckdt.query_pairs(radius)), dtype=np.int64) if self.periodic: if len(pairs) > 1: pairs[:, 0] = undo_augment(pairs[:, 0], self.mapping, diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index ce6d4ed2197..4b19791290a 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -31,7 +31,7 @@ from MDAnalysis.lib.pkdtree import PeriodicKDTree from MDAnalysis.lib.pkdtree import Periodic_cKDTree -from MDAnalysis.lib.mdamath import triclinic_vectors, triclinic_box +from MDAnalysis.lib.mdamath import triclinic_vectors from MDAnalysis.lib.distances import (_box_check, transform_RtoS, transform_StoR, apply_PBC) @@ -203,12 +203,13 @@ def test_search(b, qns): else: found_neighbors = list() if qns[1]: - expected_neighbors = transform_StoR(np.array(qns[1],dtype=np.float32), b) + expected_neighbors = transform_StoR(np.array(qns[1], dtype=np.float32), b) expected_neighbors = np.sort(expected_neighbors, axis=0) else: expected_neighbors = list() assert_equal(found_neighbors, expected_neighbors) + # Test Periodic cKDTree @pytest.mark.parametrize('b, cut, result', ( (None, 1.0, @@ -242,6 +243,17 @@ def test_ckd_setcutoff_fail(b, cut, new_cut, result): tree.set_cutoff(new_cut) +def test_ckd_setcutoff_pass(): + b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) + cutoff, new_cutoff = 1.0, 1.2 + coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) + b = np.array(b, dtype=np.float32) + tree = Periodic_cKDTree(box=b) + tree.set_coords(coords, cutoff=cutoff) + tree.set_cutoff(new_cutoff) + assert_equal(tree.cutoff, new_cutoff) + + def test_ckd_directsetcutoff(): b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) cutoff = 1.0 @@ -280,22 +292,52 @@ def test_ckd_search(b, q, result): assert_equal(indices, result) -@pytest.mark.parametrize('b, result', ( - ([10, 10, 10, 90, 90, 90], [[0, 2], - [0, 4], - [2, 3], - [2, 4], - [3, 4]]), - ([10, 10, 10, 45, 60, 90], [[0, 4], - [0, 2], - [2, 4], - [2, 3]]) +def test_ckd_nopbc(): + cutoff = 0.3 + q = np.array([0.2, 0.3, 0.1]) + coords = f_dataset.copy() + tree = Periodic_cKDTree(box=None) + tree.set_coords(coords) + indices = tree.search(q, cutoff) + assert_equal(indices, [0, 2]) + + +@pytest.mark.parametrize('b, radius, result', ( + ([10, 10, 10, 90, 90, 90], 3.0, [[0, 2], + [0, 4], + [2, 3], + [2, 4], + [3, 4]]), + ([10, 10, 10, 45, 60, 90], 3.0, [[0, 2], + [0, 4], + [2, 3], + [2, 4]]), + ([10, 10, 10, 45, 60, 90], 4.5, + 'Set cutoff greater or equal to the radius.' + ' Use tree.set_cutoff(...)'), + ([10, 10, 10, 45, 60, 90], 0.1, []) )) -def test_ckd_searchpairs(b, result): +def test_ckd_searchpairs(b, radius, result): b = np.array(b, dtype=np.float32) cutoff = 3.0 coords = transform_StoR(f_dataset, b) tree = Periodic_cKDTree(box=b) tree.set_coords(coords, cutoff=cutoff) - indices = tree.search_pairs(cutoff) - assert_equal(indices[np.argsort(indices, axis=0)[:, 0]], result) + if cutoff < radius: + with pytest.raises(RuntimeError, match=result): + indices = tree.search_pairs(radius) + else: + indices = tree.search_pairs(radius) + if indices.size > 0: + indices = indices[np.argsort(indices, axis=0)[:, 0]] + assert_equal(indices, result) + + +@pytest.mark.parametrize('radius, result', ((0.1, []), + (0.3, [[0, 2]]))) +def test_ckd_searchpairs_nopbc(radius, result): + coords = f_dataset.copy() + tree = Periodic_cKDTree() + tree.set_coords(coords) + indices = tree.search_pairs(radius) + assert_equal(indices, result) From 4812dc013b0f7002b034f321b26c7b5ac8cea85e Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 20 Jul 2018 12:46:35 -0700 Subject: [PATCH 257/455] Updated docstrings of dihedrals.py, added files to docs --- package/AUTHORS | 4 +- package/MDAnalysis/analysis/dihedrals.py | 135 +++++++++++++++--- .../analysis/dihedrals.rst | 1 + .../documentation_pages/analysis_modules.rst | 5 +- 4 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 package/doc/sphinx/source/documentation_pages/analysis/dihedrals.rst diff --git a/package/AUTHORS b/package/AUTHORS index 4870f02ac30..1015e5bce8e 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -103,7 +103,8 @@ Chronological list of authors - Ayush Suhane - Davide Cruz - Shujie Fan - + - Henry Mull + External code ------------- @@ -152,4 +153,3 @@ Logo The MDAnalysis 'Atom' logo was designed by Christian Beckstein; it is Copyright (c) 2011 Christian Beckstein and made available under a Creative Commons Attribution-NoDerivs 3.0 Unported License. - diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index eeab3cdc7fd..b6fe75982e5 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -1,3 +1,97 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +""" +Dihedral and Ramachandran analysis --- :mod:`MDAnalysis.analysis.dihedrals` +=========================================================================== + +:Author: Henry Mull +:Year: 2018 +:Copyright: GNU Public License v2 + +.. versionadded:: 0.18.1 + +This module calculates the dihedral angles phi and psi in degrees for a given +list of residues (or atoms corresponding to the residues). This can be done for +selected frames or whole trajectories. + +A list of time steps that contain phi and psi angles for each residue is +generated, and a basic Ramachandran plot can be generated using the attribute +:meth:`Ramachandran.plot`. This plot is best used as a reference, but it also +allows for user customization. + + +See Also +-------- +:mod:`MDAnalysis.lib.distances.calc_diherals` + + +Example application +------------------- +This example will show how to calculate the phi and psi angles of adenylate +kinase and generate a basic Ramachandran plot. The trajectory is included with +the test data files:: + + import MDAnalysis as mda + from MDAnalysisTests.datafiles import GRO, XTC + u = mda.Universe(GRO, XTC) + r = u.select_atoms("protein") # selection of residues + + from MDAnalysis.analysis.dihedrals import Ramachandran + R = Ramachandran(r) + R.run() + + import matplotlib.pyplot as plt + fig = plt.figure(figsize(5,5)) + ax = fig.add_subplot(111) + ax.set_title("Ramachandran Plot (AdK)") + R.plot(ax=ax, color='k', marker='s') + +Alternatively, if you wanted to plot the data yourself, the angles themselves +can be accessed using :meth:`Ramachandran.angles`:: + + fig = plt.figure(figsize(5, 5)) + ax = fig.add_subplot(111) + ax.axis([-180,180,-180,180]) + ax.axhline(0, color='k', lw=1) + ax.axvline(0, color='k', lw=1) + ax.set(xticks=range(-180,181,60), yticks=range(-180,181,60), + xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") + for ts in R.angles: + ax.scatter(ts[:,0], ts[:,1], color='k', marker='s') + +Analysis Class +-------------- + +.. autoclass:: Ramachandran + :members: + :inherited-members: + + .. attribute:: angles + + Contains the time series of the phi and psi angles for each residue as + an N×3 :class:`numpy.ndarray` array with content + ``[[phi, psi], [...], ...]``. + +""" import numpy as np import matplotlib.pyplot as plt import warnings @@ -10,33 +104,34 @@ class Ramachandran(AnalysisBase): - """Calculate phi and psi dihedral angles of specified residues. + r"""Calculate phi and psi dihedral angles of specified residues. + + Phi and psi angles wil be calculated for each residue in `atomgroup` for + each time step in the trajectory. A ReisdueGroup is generated from + `atomgroup` which is compared to the protein to determine if it is a + legitimate selection. Note ---- - Run the analysis with :meth:`Ramachandran.run()`, which stores the results - in the array :attr:`Ramachandran.angles`. A axes object can be obtained - with :meth: `Ramachandran.run().plot()`. - If the residue selection is beyond the scope of the protein, then an error will be raised. If the residue selection includes the first or last residue - then a warning will be raised, and the final array of angles will not - include those residues. + then a warning will be raised and they will be removed from the list of + residues, but the analysis will still run. + + Run the analysis with :meth:`Ramachandran.run()`, whcih stores the results in the + array :attr:`Ramachandran.angles` """ def __init__(self, atomgroup, **kwargs): - r"""Parameters + """Parameters ---------- - atomgroup : Atomgroup + atomgroup : AtomGroup or ResidueGroup atoms for residues for which phi and psi are calculated - start : int, optional - starting frame, default None becomes 0. - stop : int, optional - Frame index to stop analysis. Default: None becomes - n_frames. Iteration stops *before* this frame number, - which means that the trajectory would be read until the end. - step : int, optional - step between frames, default None becomes 1. + + Raises + ------ + ValueError + If the selection of residues is not contained within the protein """ super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) @@ -45,7 +140,7 @@ def __init__(self, atomgroup, **kwargs): protein = self.atomgroup.universe.select_atoms("protein").residues if not residues.issubset(protein): - raise IndexError("Found atoms outside of protein. Only atoms " + raise ValueError("Found atoms outside of protein. Only atoms " "inside of a 'protein' selection can be used to " "calculate dihedrals.") elif not residues.isdisjoint(protein[[0, -1]]): @@ -90,7 +185,7 @@ def plot(self, ax=None, **kwargs): Returns ------- - ax : :class:`~matplotlib.axes.Axes` + ax : :class:`matplotlib.axes.Axes` Axes with the plot, either `ax` or the current axes. """ @@ -102,4 +197,4 @@ def plot(self, ax=None, **kwargs): ax.set(xticks=range(-180,181,60), yticks=range(-180,181,60), xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) - ax.scatter(a[:,0], a[:,1]) + ax.scatter(a[:,0], a[:,1], **kwargs) diff --git a/package/doc/sphinx/source/documentation_pages/analysis/dihedrals.rst b/package/doc/sphinx/source/documentation_pages/analysis/dihedrals.rst new file mode 100644 index 00000000000..eeb1a2ec4b8 --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/analysis/dihedrals.rst @@ -0,0 +1 @@ +.. automodule:: MDAnalysis.analysis.dihedrals diff --git a/package/doc/sphinx/source/documentation_pages/analysis_modules.rst b/package/doc/sphinx/source/documentation_pages/analysis_modules.rst index ea9e78ef134..8df5c8fc8aa 100644 --- a/package/doc/sphinx/source/documentation_pages/analysis_modules.rst +++ b/package/doc/sphinx/source/documentation_pages/analysis_modules.rst @@ -59,7 +59,7 @@ Distances and contacts analysis/rms analysis/psa analysis/encore - + Hydrogen bonding ================ @@ -67,7 +67,7 @@ Hydrogen bonding :maxdepth: 1 analysis/hbond_analysis - analysis/hbond_autocorrel + analysis/hbond_autocorrel analysis/wbridge_analysis Membranes and membrane proteins @@ -105,6 +105,7 @@ Structure analysis/gnm analysis/helanal analysis/rdf + analysis/dihedrals Volumetric analysis From 610368e3509ef1adb648fe567967011d0aa0aa09 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 20 Jul 2018 12:50:27 -0700 Subject: [PATCH 258/455] Updated CHANGELOG --- package/CHANGELOG | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 3582194490c..5e3d8675de9 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,7 +14,7 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, - VOD555, davidercruz, jbarnoud, ayushsuhane + VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull * 0.18.1 @@ -48,6 +48,7 @@ Enhancements generated with gromacs -noappend (PR #1728) * MDAnalysis.lib.mdamath now supports triclinic boxes and rewrote in Cython (PR #1965) * AtomGroup.write can write a trajectory of selected frames (Issue #1037) + * Added dihedrals.py with Ramachandran class to analysis module Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) From 60b1667205de120c53e5bae116113a07ec6db1ab Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 20 Jul 2018 15:06:18 -0700 Subject: [PATCH 259/455] Fixed plotting in dihedrals.py, added more tests to test_dihedrals.py --- package/MDAnalysis/analysis/dihedrals.py | 12 ++--- .../analysis/test_dihedrals.py | 48 ++++++++++++++++--- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index b6fe75982e5..36c06f8b06d 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -56,20 +56,17 @@ r = u.select_atoms("protein") # selection of residues from MDAnalysis.analysis.dihedrals import Ramachandran - R = Ramachandran(r) - R.run() + R = Ramachandran(r).run() import matplotlib.pyplot as plt - fig = plt.figure(figsize(5,5)) - ax = fig.add_subplot(111) + fig, ax = plt.subplots(figsize=plt.figaspect(1)) ax.set_title("Ramachandran Plot (AdK)") R.plot(ax=ax, color='k', marker='s') Alternatively, if you wanted to plot the data yourself, the angles themselves can be accessed using :meth:`Ramachandran.angles`:: - fig = plt.figure(figsize(5, 5)) - ax = fig.add_subplot(111) + fig, ax = plt.subplots(figsize=plt.figaspect(1)) ax.axis([-180,180,-180,180]) ax.axhline(0, color='k', lw=1) ax.axvline(0, color='k', lw=1) @@ -88,7 +85,7 @@ .. attribute:: angles Contains the time series of the phi and psi angles for each residue as - an N×3 :class:`numpy.ndarray` array with content + an N×2 :class:`numpy.ndarray` array with content ``[[phi, psi], [...], ...]``. """ @@ -198,3 +195,4 @@ def plot(self, ax=None, **kwargs): xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) ax.scatter(a[:,0], a[:,1], **kwargs) + return ax diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 152e3342cac..8de1289abb4 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -1,10 +1,33 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# import numpy as np from numpy.testing import assert_almost_equal +import matplotlib import pytest import MDAnalysis as mda -from MDAnalysisTests.datafiles import GRO, XTC, DihedralsArray, GLYDihedralsArray -from MDAnalysis.analysis import dihedrals +from MDAnalysisTests.datafiles import (GRO, XTC, DihedralsArray, + GLYDihedralsArray) +from MDAnalysis.analysis.dihedrals import Ramachandran class TestRamachandran(object): @@ -14,7 +37,7 @@ def universe(self): return mda.Universe(GRO, XTC) def test_ramachandran(self, universe): - rama = dihedrals.Ramachandran(universe.select_atoms("protein")).run() + rama = Ramachandran(universe.select_atoms("protein")).run() test_rama = np.load(DihedralsArray) assert_almost_equal(rama.angles, test_rama, 5, @@ -22,8 +45,8 @@ def test_ramachandran(self, universe): "match test values") def test_ramachandran_single_frame(self, universe): - rama = dihedrals.Ramachandran(universe.select_atoms("protein"), - start=5, stop=6).run() + rama = Ramachandran(universe.select_atoms("protein"), + start=5, stop=6).run() test_rama = [np.load(DihedralsArray)[5]] assert_almost_equal(rama.angles, test_rama, 5, @@ -31,9 +54,22 @@ def test_ramachandran_single_frame(self, universe): "match test values") def test_ramachandran_residue_selections(self, universe): - rama = dihedrals.Ramachandran(universe.select_atoms("resname GLY")).run() + rama = Ramachandran(universe.select_atoms("resname GLY")).run() test_rama = np.load(GLYDihedralsArray) assert_almost_equal(rama.angles, test_rama, 5, err_msg="error: dihedral angles should " "match test values") + + def test_outside_protein_length(self, universe): + with pytest.raises(ValueError): + rama = Ramachandran(universe.select_atoms("resid 220")).run() + + def test_protein_ends(self, universe): + with pytest.warns(UserWarning): + rama = Ramachandran(universe.select_atoms("protein")).run() + + def test_plot(self, universe): + ax = Ramachandran(universe.select_atoms("resid 5-10")).run().plot() + assert isinstance(ax, matplotlib.axes.Axes), \ + "Ramachandran.plot() did not return and Axes instance" From 000f1e765c77b1cf68db999055fe1c19b067e3a2 Mon Sep 17 00:00:00 2001 From: davidercruz Date: Sat, 21 Jul 2018 02:43:38 +0100 Subject: [PATCH 260/455] fixed issue with rotation from non-origin point calculation --- package/MDAnalysis/transformations/rotate.py | 5 +++- .../transformations/test_rotate.py | 30 ++++++++++++------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index a9712d2a44a..3de862dcf2d 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -119,8 +119,11 @@ def wrapped(ts): position = center_method() else: position = point - rotation = rotation_matrix(angle, direction, position)[:3, :3] + matrix = rotation_matrix(angle, direction, position) + rotation = matrix[:3, :3] + translation = matrix[:3, 3] ts.positions= np.dot(ts.positions, rotation) + ts.positions += translation return ts diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index f22e7771770..9422b4787ca 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -70,8 +70,10 @@ def test_rotateby_custom_position(rotate_universes): vector = [1,0,0] pos = [0,0,0] angle = 90 - matrix = rotation_matrix(np.deg2rad(angle), vector, pos)[:3, :3] - ref.positions = np.dot(ref.positions, matrix) + matrix = rotation_matrix(np.deg2rad(angle), vector, pos) + rotation = matrix[:3, :3] + translation = matrix[:3, 3] + ref.positions = np.dot(ref.positions, rotation) + translation transformed = rotateby(angle, vector, point=pos)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) @@ -85,8 +87,10 @@ def test_rotateby_atomgroup_cog_nopbc(rotate_universes): center_pos = [6,7,8] vector = [1,0,0] angle = 90 - matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] - ref.positions = np.dot(ref.positions, matrix) + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) + rotation = matrix[:3, :3] + translation = matrix[:3, 3] + ref.positions = np.dot(ref.positions, rotation) + translation selection = trans_u.residues[0].atoms transformed = rotateby(angle, vector, ag=selection, center='geometry')(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) @@ -102,8 +106,10 @@ def test_rotateby_atomgroup_com_nopbc(rotate_universes): angle = 90 selection = trans_u.residues[0].atoms center_pos = selection.center_of_mass() - matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] - ref.positions = np.dot(ref.positions, matrix) + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) + rotation = matrix[:3, :3] + translation = matrix[:3, 3] + ref.positions = np.dot(ref.positions, rotation) + translation transformed = rotateby(angle, vector, ag=selection, center='mass')(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) @@ -118,8 +124,10 @@ def test_rotateby_atomgroup_cog_pbc(rotate_universes): angle = 90 selection = trans_u.residues[0].atoms center_pos = selection.center_of_geometry(pbc=True) - matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] - ref.positions = np.dot(ref.positions, matrix) + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) + rotation = matrix[:3, :3] + translation = matrix[:3, 3] + ref.positions = np.dot(ref.positions, rotation) + translation transformed = rotateby(angle, vector, ag=selection, center='geometry', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) @@ -134,8 +142,10 @@ def test_rotateby_atomgroup_com_pbc(rotate_universes): angle = 90 selection = trans_u.residues[0].atoms center_pos = selection.center_of_mass(pbc=True) - matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos)[:3, :3] - ref.positions = np.dot(ref.positions, matrix) + matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) + rotation = matrix[:3, :3] + translation = matrix[:3, 3] + ref.positions = np.dot(ref.positions, rotation) + translation transformed = rotateby(angle, vector, ag=selection, center='mass', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) From 4f23420cd12741795081bf7693be94aca1b918a3 Mon Sep 17 00:00:00 2001 From: davidercruz Date: Sun, 22 Jul 2018 00:29:20 +0100 Subject: [PATCH 261/455] rotaateby now behaves as rotate, updated tests to use transform(matrix) --- package/MDAnalysis/transformations/rotate.py | 14 ++++---- .../transformations/test_rotate.py | 32 +++++++------------ 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 3de862dcf2d..12b1069e442 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -36,7 +36,7 @@ from ..lib.transformations import rotation_matrix -def rotateby(angle, direction, point=None, center="geometry", wrap=False, ag=None): +def rotateby(angle, direction, point=None, center_of="geometry", wrap=False, ag=None): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a point. This point can be the center @@ -71,7 +71,7 @@ def rotateby(angle, direction, point=None, center="geometry", wrap=False, ag=Non ag: AtomGroup, optional use this to define the center of mass or geometry as the point from where the rotation axis will be defined - center: str, optional + center_of: str, optional used to choose the method of centering on the given atom group. Can be 'geometry' or 'mass' wrap: bool, optional @@ -100,14 +100,14 @@ def rotateby(angle, direction, point=None, center="geometry", wrap=False, ag=Non raise ValueError('{} is not a valid point'.format(point)) elif ag: try: - if center == 'geometry': + if center_of == 'geometry': center_method = partial(ag.center_of_geometry, pbc=pbc_arg) - elif center == 'mass': + elif center_of == 'mass': center_method = partial(ag.center_of_mass, pbc=pbc_arg) else: - raise ValueError('{} is not a valid argument for center'.format(center)) + raise ValueError('{} is not a valid argument for center'.format(center_of)) except AttributeError: - if center == 'mass': + if center_of == 'mass': raise AttributeError('{} is not an AtomGroup object with masses'.format(ag)) else: raise ValueError('{} is not an AtomGroup object'.format(ag)) @@ -120,7 +120,7 @@ def wrapped(ts): else: position = point matrix = rotation_matrix(angle, direction, position) - rotation = matrix[:3, :3] + rotation = matrix[:3, :3].T translation = matrix[:3, 3] ts.positions= np.dot(ts.positions, rotation) ts.positions += translation diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 9422b4787ca..51619281ff0 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -71,9 +71,7 @@ def test_rotateby_custom_position(rotate_universes): pos = [0,0,0] angle = 90 matrix = rotation_matrix(np.deg2rad(angle), vector, pos) - rotation = matrix[:3, :3] - translation = matrix[:3, 3] - ref.positions = np.dot(ref.positions, rotation) + translation + ref_u.atoms.transform(matrix) transformed = rotateby(angle, vector, point=pos)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) @@ -88,11 +86,9 @@ def test_rotateby_atomgroup_cog_nopbc(rotate_universes): vector = [1,0,0] angle = 90 matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) - rotation = matrix[:3, :3] - translation = matrix[:3, 3] - ref.positions = np.dot(ref.positions, rotation) + translation + ref_u.atoms.transform(matrix) selection = trans_u.residues[0].atoms - transformed = rotateby(angle, vector, ag=selection, center='geometry')(trans) + transformed = rotateby(angle, vector, ag=selection, center_of='geometry')(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_com_nopbc(rotate_universes): @@ -107,10 +103,8 @@ def test_rotateby_atomgroup_com_nopbc(rotate_universes): selection = trans_u.residues[0].atoms center_pos = selection.center_of_mass() matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) - rotation = matrix[:3, :3] - translation = matrix[:3, 3] - ref.positions = np.dot(ref.positions, rotation) + translation - transformed = rotateby(angle, vector, ag=selection, center='mass')(trans) + ref_u.atoms.transform(matrix) + transformed = rotateby(angle, vector, ag=selection, center_of='mass')(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_cog_pbc(rotate_universes): @@ -125,10 +119,8 @@ def test_rotateby_atomgroup_cog_pbc(rotate_universes): selection = trans_u.residues[0].atoms center_pos = selection.center_of_geometry(pbc=True) matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) - rotation = matrix[:3, :3] - translation = matrix[:3, 3] - ref.positions = np.dot(ref.positions, rotation) + translation - transformed = rotateby(angle, vector, ag=selection, center='geometry', wrap=True)(trans) + ref_u.atoms.transform(matrix) + transformed = rotateby(angle, vector, ag=selection, center_of='geometry', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_com_pbc(rotate_universes): @@ -143,10 +135,8 @@ def test_rotateby_atomgroup_com_pbc(rotate_universes): selection = trans_u.residues[0].atoms center_pos = selection.center_of_mass(pbc=True) matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) - rotation = matrix[:3, :3] - translation = matrix[:3, 3] - ref.positions = np.dot(ref.positions, rotation) + translation - transformed = rotateby(angle, vector, ag=selection, center='mass', wrap=True)(trans) + ref_u.atoms.transform(matrix) + transformed = rotateby(angle, vector, ag=selection, center_of='mass', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_bad_ag(rotate_universes): @@ -190,7 +180,7 @@ def test_rotateby_bad_center(rotate_universes): vector = [0, 0, 1] bad_center = " " with pytest.raises(ValueError): - rotateby(angle, vector, ag = ag, center=bad_center)(ts) + rotateby(angle, vector, ag = ag, center_of=bad_center)(ts) def test_rotateby_no_masses(rotate_universes): # this universe as a box size zero @@ -201,7 +191,7 @@ def test_rotateby_no_masses(rotate_universes): vector = [0, 0, 1] bad_center = "mass" with pytest.raises(AttributeError): - rotateby(angle, vector, ag = ag, center=bad_center)(ts) + rotateby(angle, vector, ag = ag, center_of=bad_center)(ts) def test_rotateby_no_args(rotate_universes): # this universe as a box size zero From d25e6e5e9cb57f65c8e7f2696c34da4d2042a1d5 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 21 Jul 2018 17:18:18 -0700 Subject: [PATCH 262/455] removed the dependency of Bio.KDtree and PeriodicKDTree from lib, and tests --- package/MDAnalysis/lib/NeighborSearch.py | 18 ++++++--- package/MDAnalysis/lib/distances.py | 38 ++++++++----------- package/MDAnalysis/lib/pkdtree.py | 9 +++++ .../MDAnalysisTests/lib/test_distances.py | 5 --- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 2 - 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/package/MDAnalysis/lib/NeighborSearch.py b/package/MDAnalysis/lib/NeighborSearch.py index a1a9feca073..19b864a40fd 100644 --- a/package/MDAnalysis/lib/NeighborSearch.py +++ b/package/MDAnalysis/lib/NeighborSearch.py @@ -31,7 +31,7 @@ import numpy as np from Bio.KDTree import KDTree -from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.pkdtree import Periodic_cKDTree from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core.groups import AtomGroup, Atom @@ -65,11 +65,7 @@ def __init__(self, atom_group, box=None, bucket_size=10): self.atom_group = atom_group self._u = atom_group.universe self._box = box - if box is None: - self.kdtree = KDTree(dim=3, bucket_size=bucket_size) - else: - self.kdtree = PeriodicKDTree(box, bucket_size=bucket_size) - self.kdtree.set_coords(atom_group.positions) + self.kdtree = Periodic_cKDTree(box=box, leafsize=bucket_size) def search(self, atoms, radius, level='A'): """ @@ -91,6 +87,16 @@ def search(self, atoms, radius, level='A'): else: positions = atoms.positions + + # check if already built + if self.kdtree._built: + if self._box is not None: + if self.kdtree.cutoff < radius: + self.kdtree.set_cutoff(radius) + else: + cutoff = radius if self._box is not None else None + self.kdtree.set_coords(self.atom_group.positions, cutoff=cutoff) + indices = [] for pos in positions: self.kdtree.search(pos, radius) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 907bbd44cbf..56be28dba5e 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -462,24 +462,22 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree' """ - if box is not None: - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) + if box.shape[0] != 6: + raise ValueError('Box Argument is of incompatible type. The dimension' + 'should be either None or ' + 'of the type [lx, ly, lz, alpha, beta, gamma]') method = _determine_method(reference, configuration, - max_cutoff, min_cutoff=min_cutoff, - box=box, method=method) + max_cutoff, min_cutoff=min_cutoff, + box=box, method=method) pairs, dist = method(reference, configuration, max_cutoff, min_cutoff=min_cutoff, box=box) return np.asarray(pairs), np.asarray(dist) -def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None): +def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, + box=None, method=None): """ Switch between different methods based on the the optimized time. All the rules to select the method based on the input can be @@ -507,10 +505,11 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, box configuration.max(axis=0)]) size = max_dim.max(axis=0) - min_dim.min(axis=0) elif box is not None: - if box.shape[0] == 6: + if np.allclose(box[3:], 90): size = box[:3] else: - size = box.max(axis=0) - box.min(axis=0) + tribox = triclinic_vectors(box) + size = tribox.max(axis=0) - tribox.min(axis=0) if (np.any(size < 10.0*max_cutoff) and len(reference) > 100000 and @@ -555,9 +554,7 @@ def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, bo def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): """ Capped Distance evaluations using KDtree. - Uses minimum image convention if *box* is specified - Returns: -------- pairs : list @@ -567,9 +564,8 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N distance : list Distance between two atoms corresponding to the (i, j) indices in pairs. - """ - from .pkdtree import PeriodicKDTree + from .pkdtree import Periodic_cKDTree from Bio.KDTree import KDTree pairs, distances = [], [] @@ -585,13 +581,9 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N _check_array(reference, 'reference') _check_array(configuration, 'configuration') - # Build The KDTree - if box is not None: - kdtree = PeriodicKDTree(box, bucket_size=10) - else: - kdtree = KDTree(dim=3, bucket_size=10) - - kdtree.set_coords(configuration) + kdtree = Periodic_cKDTree(box=box) + cut = max_cutoff if box is not None else None + kdtree.set_coords(configuration, cutoff=cut) # Search for every query point for idx, centers in enumerate(reference): kdtree.search(centers, max_cutoff) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 5a966a86814..80226322823 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -404,6 +404,15 @@ def search(self, centers, radius): self._indices = np.asarray(unique_int_1d(self._indices)) return self._indices + def get_indices(self): + """ + Returns + ------ + indices : list + neighbors for the last query points and search radius + """ + return self._indices + def search_pairs(self, radius): """Search all the pairs within a specified radius diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index f61a30a2e37..37133cb5abc 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -58,11 +58,6 @@ def test_capped_distance_noresults(): boxes_1 = (np.array([1, 2, 3, 90, 90, 90], dtype=np.float32), # ortho np.array([1, 2, 3, 30, 45, 60], dtype=np.float32), # tri_box - triclinic_vectors( # tri_vecs - np.array([1, 2, 3, 90, 90, 45], dtype=np.float32)), - np.array([[0.5, 0.9, 1.9], # tri_vecs_bad - [2.0, 0.4, 0.1], - [0.0, 0.6, 0.5]], dtype=np.float32), None, # Non Periodic ) diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index 4b19791290a..f6c50110f14 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -328,8 +328,6 @@ def test_ckd_searchpairs(b, radius, result): indices = tree.search_pairs(radius) else: indices = tree.search_pairs(radius) - if indices.size > 0: - indices = indices[np.argsort(indices, axis=0)[:, 0]] assert_equal(indices, result) From 5f54fecba2d970317dafcd8c63c851e4a89e1e53 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 21 Jul 2018 17:19:28 -0700 Subject: [PATCH 263/455] Modified selections to change KDtree selections from Biopython to scipy --- package/MDAnalysis/core/selection.py | 52 ++++++++++------------------ 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index a6b9d43ba15..9aae2f75f36 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -50,7 +50,7 @@ from numpy.lib.utils import deprecate from Bio.KDTree import KDTree -from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.pkdtree import Periodic_cKDTree from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core import flags from ..lib import distances @@ -284,25 +284,13 @@ def _apply_KDTree(self, group): sys = group[~np.in1d(group.indices, sel.indices)] box = self.validate_dimensions(group.dimensions) - if box is None: - kdtree = KDTree(dim=3, bucket_size=10) - kdtree.set_coords(sys.positions) - found_indices = [] - for atom in sel.positions: - kdtree.search(atom, self.cutoff) - found_indices.append(kdtree.get_indices()) - unique_idx = unique_int_1d( - np.concatenate(found_indices).astype(np.int64) - ) + + cut = self.cutoff if box is not None else None + kdtree = Periodic_cKDTree(box=box, leafsize=10) + kdtree.set_coords(sys.positions, cutoff=cut) + kdtree.search(sel.positions, self.cutoff) + unique_idx = np.asarray(kdtree.get_indices()) - else: - kdtree = PeriodicKDTree(box, bucket_size=10) - kdtree.set_coords(sys.positions) - kdtree.search(sel.positions, self.cutoff) - unique_idx = np.asarray(kdtree.get_indices()) - - # These are the indices from SYS that were seen when - # probing with SEL return sys[unique_idx.astype(np.int32)].unique def _apply_distmat(self, group): @@ -335,11 +323,10 @@ def _apply_KDTree(self, group): sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) ref = sel.center_of_geometry(pbc=self.periodic) - if box is None: - kdtree = KDTree(dim=3, bucket_size=10) - else: - kdtree = PeriodicKDTree(box, bucket_size=10) - kdtree.set_coords(group.positions) + kdtree = Periodic_cKDTree(box=box) + + cutoff = self.exRadius if box is not None else None + kdtree.set_coords(group.positions, cutoff=cutoff) kdtree.search(ref, self.exRadius) found_ExtIndices = kdtree.get_indices() kdtree.search(ref, self.inRadius) @@ -378,11 +365,10 @@ def _apply_KDTree(self, group): sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) ref = sel.center_of_geometry(pbc=self.periodic) - if box is None: - kdtree = KDTree(dim=3, bucket_size=10) - else: - kdtree = PeriodicKDTree(box, bucket_size=10) - kdtree.set_coords(group.positions) + + cut = self.cutoff if box is not None else None + kdtree = Periodic_cKDTree(box=box) + kdtree.set_coords(group.positions, cutoff=cut) kdtree.search(ref, self.cutoff) found_indices = kdtree.get_indices() return group[found_indices].unique @@ -499,11 +485,9 @@ def __init__(self, parser, tokens): def _apply_KDTree(self, group): box = group.dimensions if self.periodic else None - if box is None: - kdtree = KDTree(dim=3, bucket_size=10) - else: - kdtree = PeriodicKDTree(box, bucket_size=10) - kdtree.set_coords(group.positions) + kdtree = Periodic_cKDTree(box=box) + cut = self.cutoff if box is not None else None + kdtree.set_coords(group.positions, cutoff=cut) kdtree.search(self.ref, self.cutoff) found_indices = kdtree.get_indices() From 6cffae9ab867940d56a480c80e1b8b799decb8c3 Mon Sep 17 00:00:00 2001 From: davidercruz Date: Sun, 22 Jul 2018 01:43:50 +0100 Subject: [PATCH 264/455] rotateby now accepts weights --- package/MDAnalysis/transformations/rotate.py | 34 +++++++++---------- .../transformations/test_rotate.py | 16 ++++----- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 12b1069e442..53a87f38e50 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -35,8 +35,9 @@ from functools import partial from ..lib.transformations import rotation_matrix +from ..lib.util import get_weights -def rotateby(angle, direction, point=None, center_of="geometry", wrap=False, ag=None): +def rotateby(angle, direction, point=None, weights=None, wrap=False, ag=None): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a point. This point can be the center @@ -69,11 +70,14 @@ def rotateby(angle, direction, point=None, center_of="geometry", wrap=False, ag= vector that will define the direction of a custom axis of rotation from the provided point. ag: AtomGroup, optional - use this to define the center of mass or geometry as the point from where the - rotation axis will be defined - center_of: str, optional - used to choose the method of centering on the given atom group. Can be 'geometry' - or 'mass' + use the eighted center of an AtomGroup as the point from where the rotation axis + will be defined + weights: {"mass", ``None``} or array_like, optional + define the weights of the atoms when calculating the center of the AtomGroup. + With ``"mass"`` uses masses as weights; with ``None`` weigh each atom equally. + If a float array of the same length as `ag` is provided, use each element of + the `array_like` as a weight for the corresponding atom in `ag`. Default is + None. wrap: bool, optional If `True`, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry. Default is `False`, no changes @@ -92,7 +96,6 @@ def rotateby(angle, direction, point=None, center_of="geometry", wrap=False, ag= after rotating the trajectory. ''' - pbc_arg = wrap angle = np.deg2rad(angle) if point: point = np.asarray(point, np.float32) @@ -100,17 +103,14 @@ def rotateby(angle, direction, point=None, center_of="geometry", wrap=False, ag= raise ValueError('{} is not a valid point'.format(point)) elif ag: try: - if center_of == 'geometry': - center_method = partial(ag.center_of_geometry, pbc=pbc_arg) - elif center_of == 'mass': - center_method = partial(ag.center_of_mass, pbc=pbc_arg) - else: - raise ValueError('{} is not a valid argument for center'.format(center_of)) + weights = get_weights(ag.atoms, weights=weights) + except (ValueError, TypeError): + raise ValueError("weights must be {'mass', None} or an iterable of the " + "same size as the atomgroup.") + try: + center_method = partial(ag.atoms.center, weights, pbc=wrap) except AttributeError: - if center_of == 'mass': - raise AttributeError('{} is not an AtomGroup object with masses'.format(ag)) - else: - raise ValueError('{} is not an AtomGroup object'.format(ag)) + raise ValueError('{} is not an AtomGroup object'.format(ag)) else: raise ValueError('A point or an AtomGroup must be specified') diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 51619281ff0..2ed878a7614 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -88,7 +88,7 @@ def test_rotateby_atomgroup_cog_nopbc(rotate_universes): matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) ref_u.atoms.transform(matrix) selection = trans_u.residues[0].atoms - transformed = rotateby(angle, vector, ag=selection, center_of='geometry')(trans) + transformed = rotateby(angle, vector, ag=selection, weights=None)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_com_nopbc(rotate_universes): @@ -104,7 +104,7 @@ def test_rotateby_atomgroup_com_nopbc(rotate_universes): center_pos = selection.center_of_mass() matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) ref_u.atoms.transform(matrix) - transformed = rotateby(angle, vector, ag=selection, center_of='mass')(trans) + transformed = rotateby(angle, vector, ag=selection, weights='mass')(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_cog_pbc(rotate_universes): @@ -120,7 +120,7 @@ def test_rotateby_atomgroup_cog_pbc(rotate_universes): center_pos = selection.center_of_geometry(pbc=True) matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) ref_u.atoms.transform(matrix) - transformed = rotateby(angle, vector, ag=selection, center_of='geometry', wrap=True)(trans) + transformed = rotateby(angle, vector, ag=selection, weights=None, wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_atomgroup_com_pbc(rotate_universes): @@ -136,7 +136,7 @@ def test_rotateby_atomgroup_com_pbc(rotate_universes): center_pos = selection.center_of_mass(pbc=True) matrix = rotation_matrix(np.deg2rad(angle), vector, center_pos) ref_u.atoms.transform(matrix) - transformed = rotateby(angle, vector, ag=selection, center_of='mass', wrap=True)(trans) + transformed = rotateby(angle, vector, ag=selection, weights='mass', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) def test_rotateby_bad_ag(rotate_universes): @@ -147,7 +147,7 @@ def test_rotateby_bad_ag(rotate_universes): angle = 90 vector = [0, 0, 1] bad_ag = 1 - with pytest.raises(ValueError): + with pytest.raises(AttributeError): rotateby(angle, vector, ag = bad_ag)(ts) def test_rotateby_bad_position(rotate_universes): @@ -180,7 +180,7 @@ def test_rotateby_bad_center(rotate_universes): vector = [0, 0, 1] bad_center = " " with pytest.raises(ValueError): - rotateby(angle, vector, ag = ag, center_of=bad_center)(ts) + rotateby(angle, vector, ag = ag, weights=bad_center)(ts) def test_rotateby_no_masses(rotate_universes): # this universe as a box size zero @@ -190,8 +190,8 @@ def test_rotateby_no_masses(rotate_universes): angle = 90 vector = [0, 0, 1] bad_center = "mass" - with pytest.raises(AttributeError): - rotateby(angle, vector, ag = ag, center_of=bad_center)(ts) + with pytest.raises(ValueError): + rotateby(angle, vector, ag = ag, weights=bad_center)(ts) def test_rotateby_no_args(rotate_universes): # this universe as a box size zero From b2092cdfb85e3a665d581abd27f9a9372fa985ac Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 21 Jul 2018 17:52:11 -0700 Subject: [PATCH 265/455] completely removed Biopython.KDTree and wrapper around it, replaced the name of wrapper around scipy.KDtree to PeriodicKDTree --- package/MDAnalysis/core/selection.py | 15 +- package/MDAnalysis/lib/NeighborSearch.py | 7 +- package/MDAnalysis/lib/distances.py | 5 +- package/MDAnalysis/lib/pkdtree.py | 211 +----------------- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 210 ++--------------- 5 files changed, 43 insertions(+), 405 deletions(-) diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index 9aae2f75f36..f607f3accca 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -48,9 +48,8 @@ import numpy as np from numpy.lib.utils import deprecate -from Bio.KDTree import KDTree -from MDAnalysis.lib.pkdtree import Periodic_cKDTree +from MDAnalysis.lib.pkdtree import PeriodicKDTree from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core import flags from ..lib import distances @@ -284,9 +283,9 @@ def _apply_KDTree(self, group): sys = group[~np.in1d(group.indices, sel.indices)] box = self.validate_dimensions(group.dimensions) - + cut = self.cutoff if box is not None else None - kdtree = Periodic_cKDTree(box=box, leafsize=10) + kdtree = PeriodicKDTree(box=box, leafsize=10) kdtree.set_coords(sys.positions, cutoff=cut) kdtree.search(sel.positions, self.cutoff) unique_idx = np.asarray(kdtree.get_indices()) @@ -323,7 +322,7 @@ def _apply_KDTree(self, group): sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) ref = sel.center_of_geometry(pbc=self.periodic) - kdtree = Periodic_cKDTree(box=box) + kdtree = PeriodicKDTree(box=box) cutoff = self.exRadius if box is not None else None kdtree.set_coords(group.positions, cutoff=cutoff) @@ -365,9 +364,9 @@ def _apply_KDTree(self, group): sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) ref = sel.center_of_geometry(pbc=self.periodic) - + cut = self.cutoff if box is not None else None - kdtree = Periodic_cKDTree(box=box) + kdtree = PeriodicKDTree(box=box) kdtree.set_coords(group.positions, cutoff=cut) kdtree.search(ref, self.cutoff) found_indices = kdtree.get_indices() @@ -485,7 +484,7 @@ def __init__(self, parser, tokens): def _apply_KDTree(self, group): box = group.dimensions if self.periodic else None - kdtree = Periodic_cKDTree(box=box) + kdtree = PeriodicKDTree(box=box) cut = self.cutoff if box is not None else None kdtree.set_coords(group.positions, cutoff=cut) kdtree.search(self.ref, self.cutoff) diff --git a/package/MDAnalysis/lib/NeighborSearch.py b/package/MDAnalysis/lib/NeighborSearch.py index 19b864a40fd..4f24dd4727e 100644 --- a/package/MDAnalysis/lib/NeighborSearch.py +++ b/package/MDAnalysis/lib/NeighborSearch.py @@ -30,12 +30,12 @@ from __future__ import absolute_import import numpy as np -from Bio.KDTree import KDTree -from MDAnalysis.lib.pkdtree import Periodic_cKDTree +from MDAnalysis.lib.pkdtree import PeriodicKDTree from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core.groups import AtomGroup, Atom + class AtomNeighborSearch(object): """This class can be used to find all atoms/residues/segments within the radius of a given query position. @@ -65,7 +65,7 @@ def __init__(self, atom_group, box=None, bucket_size=10): self.atom_group = atom_group self._u = atom_group.universe self._box = box - self.kdtree = Periodic_cKDTree(box=box, leafsize=bucket_size) + self.kdtree = PeriodicKDTree(box=box, leafsize=bucket_size) def search(self, atoms, radius, level='A'): """ @@ -87,7 +87,6 @@ def search(self, atoms, radius, level='A'): else: positions = atoms.positions - # check if already built if self.kdtree._built: if self._box is not None: diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 56be28dba5e..57a5625b074 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -565,8 +565,7 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N Distance between two atoms corresponding to the (i, j) indices in pairs. """ - from .pkdtree import Periodic_cKDTree - from Bio.KDTree import KDTree + from .pkdtree import PeriodicKDTree pairs, distances = [], [] @@ -581,7 +580,7 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N _check_array(reference, 'reference') _check_array(configuration, 'configuration') - kdtree = Periodic_cKDTree(box=box) + kdtree = PeriodicKDTree(box=box) cut = max_cutoff if box is not None else None kdtree.set_coords(configuration, cutoff=cut) # Search for every query point diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 80226322823..29418155765 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -28,215 +28,22 @@ """ from __future__ import absolute_import -from six.moves import range import itertools import numpy as np -from Bio.KDTree import _CKDTree from scipy.spatial import cKDTree from MDAnalysis.lib._cutil import unique_int_1d from MDAnalysis.lib._augment import augment_coordinates, undo_augment -from MDAnalysis.lib.distances import _box_check, _check_array, apply_PBC -from MDAnalysis.lib.mdamath import norm, triclinic_vectors, triclinic_box +from MDAnalysis.lib.distances import apply_PBC __all__ = [ - 'PeriodicKDTree', 'Periodic_cKDTree' + 'PeriodicKDTree' ] class PeriodicKDTree(object): - """ - Wrapper around Bio.KDTree._CKDTree to enable search with periodic boundary - conditions. - - A tree is first constructed with the coordinates wrapped onto the central - cell. A query for neighbors around a center point is performed first by - wrapping the center point coordinates to the central cell, then generating - images of this wrapped center point (thanks to - https://github.com/patvarilly/periodic_kdtree for the idea) and finally - searching for neighbors close to the images. - - Only the necessary number of center point images is generated for each - case. For instance, if the wrapped center point lies well within the cell - and far away from the cell boundaries, there may be no need to generate - any center point image. - """ - - def __init__(self, box, bucket_size=10): - """ - Parameters - ---------- - box : array-like or ``None``, optional, default ``None`` - Simulation cell dimensions in the form of - :attr:`MDAnalysis.trajectory.base.Timestep.dimensions` when - periodic boundary conditions should be taken into account for - the calculation of contacts. - bucket_size : int - Number of entries in leafs of the KDTree. If you suffer poor - performance you can play around with this number. Increasing the - `bucket_size` will speed up the construction of the KDTree but - slow down the search. - """ - self.dim = 3 # 3D systems - self.box = None - self._dm = None # matrix of central-cell vectors - self._rm = None # matrix of normalized reciprocal vectors - self.initialize_bm(box) - self.kdt = _CKDTree.KDTree(self.dim, bucket_size) - self._indices = list() - - def initialize_bm(self, box): - """ - Store box information and define direct and reciprocal box matrices. - Rows of the direct matrix are the components of the central cell - vectors. Rows of the reciprocal matrix are the components of the - normalized reciprocal lattice vectors. Each row of the reciprocal - matrix represents the vector normal to the unit cell face - associated to each axis. - For instance, in an orthorhombic cell the YZ-plane is associated to - the X-axis and its normal vector is (1, 0, 0). In a triclinic cell, - the plane associated to vector ``\vec{a}`` is perpendicular to the - normalized cross product of ``\vec{b}`` and ``\vec{c}``. - - Parameters - ---------- - box : array-like or ``None``, optional, default ``None`` - Simulation cell dimensions in the form of - :attr:`MDAnalysis.trajectory.base.Timestep.dimensions` when - periodic boundary conditions should be taken into account for - the calculation of contacts. - """ - box_type = _box_check(box) - if box_type == 'ortho': - a, b, c = box[:3] - dm = np.array([[a, 0, 0], [0, b, 0], [0, 0, c]], dtype=np.float32) - rm = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.float32) - elif box_type in 'tri_box tri_vecs tri_vecs_bad': - if box_type == 'tri_box': - dm = triclinic_vectors(box) - elif box_type == 'tri_vecs': - dm = box.copy('C') - else: # case 'tri_vecs_bad' - dm = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - rm = np.zeros(9, dtype=np.float32).reshape(3, 3) - rm[0] = np.cross(dm[1], dm[2]) - rm[1] = np.cross(dm[2], dm[0]) - rm[2] = np.cross(dm[0], dm[1]) - for i in range(self.dim): - rm[i] /= norm(rm[i]) # normalize - else: - raise ValueError('Failed to initialize direct/reciprocal matrices') - self.box = box - self._dm = dm - self._rm = rm - - def set_coords(self, coords): - """ - Add coordinates of the points. Wrapping of coordinates to the central - cell is enforced along the periodic axes. - - Parameters - ---------- - coords: array_like - Positions of points, shape=(N, 3) for N atoms. - """ - _check_array(np.asanyarray(coords), 'coords') - wrapped_data = apply_PBC(coords, self.box) - self.kdt.set_data(wrapped_data) - self.built = 1 - - def find_images(self, center_points, radius): - """ - Find relevant images of a a set of center points, inspired by - https://github.com/patvarilly/periodic_kdtree - - Parameters - ---------- - center_points: array_like (N,3) - Coordinates of the query center points. Must be in centrall cell. - radius: float - Maximum distance from center in search for neighbors - - Returns - ------ - :class:`List` - images of the center points close to any cell boundary plane - """ - images = list() - - center_points = np.asanyarray(center_points) - if center_points.shape == (3, ): - center_points = center_points.reshape((1, 3)) - - # Calculating displacement vectors for images of `center_point` - # possible point for parallel loop version (Benchmark before!) - for center_point in center_points: - # distances to cell boundary planes passing through the origin - distances = np.dot(self._rm, center_point) - displacements = list(self._dm[np.where(distances < radius)[0]]) - # distances to the remaining three cell boundary planes - distances = np.einsum('ij,ij->i', self._rm, - self._dm - center_point) - displacements.extend( - list(-self._dm[np.where(distances < radius)[0]])) - # If we have displacements along more than one axis, we have - # to combine them. This happens when center_point is close - # to any edge or vertex of the central cell. - # face case: n_displacements==1; no combination - # edge case: n_displacements==2; one extra displacement - # vertex case: n_displacements==3; five extra displacements - n_displacements = len(displacements) - if n_displacements > 1: - for start in range(n_displacements - 1, -1, -1): - for i in range(start+1, len(displacements)): - displacements.append(displacements[start]+displacements[i]) - images.extend([center_point + d for d in displacements]) - return images - - def search(self, centers, radius): - """Search all points within radius of centers and its periodic images. - Wrapping of center coordinates is enforced to enable comparison to - wrapped coordinates of points in the tree. - - Parameter - --------- - centers: array_like (N,3) - origins around which to search for neighbors - radius: float - maximum distance around which to search for neighbors. The search - radius is half the smallest periodicity if radius exceeds this value - """ - if not self.built: - raise RuntimeError('Unbuilt tree. Run tree.set_coords(...) first') - centers = np.asarray(centers) - if centers.shape == (self.dim, ): - centers = centers.reshape((1, self.dim)) - wrapped_centers = apply_PBC(centers, self.box) - self._indices = set() # clear previous search - # possible loop for parallel execution (benchmark before!) - for c in itertools.chain(wrapped_centers, - self.find_images(wrapped_centers, radius)): - self.kdt.search_center_radius(c, radius) - n = self.kdt.get_count() - if n: - new_indices = np.empty(n, int) - self.kdt.get_indices(new_indices) - self._indices.update(new_indices) - self._indices = sorted(list(self._indices)) - - def get_indices(self): - """ - Returns - ------ - indices : list - neighbors for the last query points and search radius - """ - return self._indices - - -class Periodic_cKDTree(object): """Wrapper around scipy.spatial.cKDtree Creates an object which can handle periodic as well as @@ -314,11 +121,13 @@ def set_coords(self, coords, cutoff=None): # Check if already built if self._built: - raise RuntimeError('Tree is already built. If need to change the cutoff radius' - 'Run tree.set_cutoff(cutoff)') + raise RuntimeError('Tree is already built.' + 'If need to change the cutoff radius' + 'Run tree.set_cutoff(cutoff)') # If no cutoff distance is provided but PBC aware if self.periodic and (cutoff is None): - raise RuntimeError('Provide a cutoff distance with tree.set_coords(...)') + raise RuntimeError('Provide a cutoff distance' + ' with tree.set_coords(...)') # set coords dtype to float32 # augment coordinates will work only with float32 @@ -338,7 +147,8 @@ def set_coords(self, coords, cutoff=None): else: # if cutoff distance is provided for non PBC calculations if cutoff is not None: - raise RuntimeError('Donot provide cutoff distance for non PBC aware calculations') + raise RuntimeError('Donot provide cutoff distance for' + ' non PBC aware calculations') self.coords = coords self.ckdt = cKDTree(self.coords, self.leafsize) self._built = True @@ -361,7 +171,8 @@ def search(self, centers, radius): """Search all points within radius from centers and their periodic images. All the centers coordinates are wrapped around the central cell - to enable distance evaluations from points in the tree and their images. + to enable distance evaluations from points in the tree + and their images. Parameter --------- diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index f6c50110f14..5549e32a35b 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -21,65 +21,15 @@ # from __future__ import print_function, absolute_import -from six.moves import zip -from itertools import product import pytest import numpy as np -from numpy.testing import assert_equal, assert_almost_equal +from numpy.testing import assert_equal from MDAnalysis.lib.pkdtree import PeriodicKDTree -from MDAnalysis.lib.pkdtree import Periodic_cKDTree -from MDAnalysis.lib.mdamath import triclinic_vectors -from MDAnalysis.lib.distances import (_box_check, transform_RtoS, - transform_StoR, apply_PBC) +from MDAnalysis.lib.distances import transform_StoR -# -# Testing initialization with different boxes. -# -boxes_1 = (np.array([1, 2, 3, 90, 90, 90], dtype=np.float32), # ortho - np.array([1, 2, 3, 30, 45, 60], dtype=np.float32), # tri_box - triclinic_vectors( # tri_vecs - np.array([1, 2, 3, 90, 90, 45], dtype=np.float32)), - np.array([[0.5, 0.9, 1.9], # tri_vecs_bad - [2.0, 0.4, 0.1], - [0.0, 0.6, 0.5]], dtype=np.float32) - ) -rec_m = (np.array([[1, 0, 0], - [0, 1, 0], - [0, 0, 1]], dtype=np.float32), - np.array([[0.67044002, -0.38707867, -0.6329931], - [0, 0.54741204, -0.83686334], - [0, 0, 1]], dtype=np.float32), - np.array([[0.707106829, -0.707106829, 0], - [0, 1, 0], - [0, 0, 1]], dtype=np.float32), - np.array([[0.42783618, -0.16049984, -0.88949198], - [-0, 0.95654362, 0.29158944], - [0, 0, 1]], dtype=np.float32), - ) - - -@pytest.mark.parametrize('box, rm', zip(boxes_1, rec_m)) -def test_initialize_bm(box, rm): - """ - Assert the construction of the recripocal box matrix. - """ - assert_almost_equal(PeriodicKDTree(box)._rm, rm, decimal=7) - - -def test_set_coords(): - match = 'coords must be a sequence of 3 dimensional coordinates' - with pytest.raises(ValueError, match=match): - xy = np.array([[2, 2], [5, 5], [1.1, 1.1]], dtype=np.float32) - tree = PeriodicKDTree(boxes_1[0]) - tree.set_coords(xy) - - -# -# Testing for correct images generation for a given query point. -# # fractional coordinates for data points f_dataset = np.array([[0.2, 0.2, 0.2], # center of the box @@ -89,128 +39,7 @@ def test_set_coords(): [2.1, 2.1, 0.3]], # wrapped to [1, 1, 3] dtype=np.float32) -radius = 1.5 - -boxes_2 = ([10, 10, 10, 90, 90, 90], # ortho - [10, 10, 10, 45, 60, 90]) # tri_box - -# Find images for several query points, here in fractional coordinates. -queries = ([0.1, 0.5, 0.5], # box face - [0.5, 0.5, 0.5], # box center - [0.5, -0.1, 0.5], # box face - [0.1, 0.1, 0.5], # box edge - [0.5, -0.1, 1.1], # box edge - [0.1, 0.1, 0.1], # box vertex - [0.1, -0.1, 1.1], # box vertex - [2.1, -3.1, 0.1] # box vertex - ) - -# Images for the previous query vectors, here in fractional coordinates. -images = (([1.1, 0.5, 0.5],), - (), - ([0.5, -0.1, 0.5],), - ([1.1, 0.1, 0.5], [0.1, 1.1, 0.5], [1.1, 1.1, 0.5]), - ([0.5, -0.1, 0.1], [0.5, 0.9, 1.1], [0.5, -0.1, 1.1]), - ([1.1, 0.1, 0.1], [0.1, 1.1, 0.1], [0.1, 0.1, 1.1], - [0.1, 1.1, 1.1], [1.1, 1.1, 0.1], [1.1, 0.1, 1.1], - [1.1, 1.1, 1.1]), - ([1.1, 0.9, 0.1], [0.1, -0.1, 0.1], [0.1, 0.9, 1.1], - [0.1, -0.1, 1.1], [1.1, -0.1, 0.1], [1.1, 0.9, 1.1], - [1.1, -0.1, 1.1]), - ([1.1, 0.9, 0.1], [0.1, -0.1, 0.1], [0.1, 0.9, 1.1], - [0.1, -0.1, 1.1], [1.1, -0.1, 0.1], [1.1, 0.9, 1.1], - [1.1, -0.1, 1.1])) - - -@pytest.mark.parametrize('b, qcs', product(boxes_2, zip(queries, images))) -def test_find_images(b, qcs): - """ - Test the generation of images for a given query vector and type of box. - - Parameters - ---------- - b : list - MDAnalysis dimensions like list - qns : tuple - a query point and a list of expected neighbors. - """ - b = np.array(b, dtype=np.float32) - q = transform_StoR(np.array(qcs[0], dtype=np.float32), b) - tree = PeriodicKDTree(b) - coords = transform_StoR(f_dataset, b) - tree.set_coords(coords) # Input real space coordinates - cs = np.sort(transform_StoR(np.array(qcs[1], dtype=np.float32), b), axis=0) - q_wrapped = apply_PBC(q.reshape((1, 3)), b) - found_images = np.sort(tree.find_images(q_wrapped, radius), axis=0) - assert_almost_equal(found_images, cs, decimal=6) - -# -# Testing for neighbor finding -# - -# Find neighbors for a given query vector, here in fractional coordinates. -queries_2 = ([0.5, 0.5, 0.5], # case box center - [0, 1, 0.07], # box face - [0.1, 0.1, 0.5], # box edge - [0.1, 0.1, 0.1], # box vertex - ([-1.9, 4.2, 0.2], [2.1, -3.1, 0.1]) # multiple queries - ) -# Expected neighbors of queries_2 in the orthogonal box case, here in -# fractional coordinates. -n_ortho = (([0.5, 0.5, 0.5],), - ([1.1, -1.1, 1.1], ), - (), - ([0.11, 0.11, 0.11], ), - ([0.2, 0.2, 0.2], [0.11, 0.11, 0.11], [2.1, 2.1, 0.3], - [1.1, -1.1, 1.1]) - ) -# Expected neighbors for previous queries in the trigonal box case -n_tric = (([0.5, 0.5, 0.5],), - ([1.1, -1.1, 1.1], ), - (), - ([0.11, 0.11, 0.11], ), - ([0.2, 0.2, 0.2], [2.1, 2.1, 0.3], [1.1, -1.1, 1.1]) - ) - -# Combinations of boxes, query points, and expected neighbors. -doublets = list() -for b, n in zip(boxes_2, (n_ortho, n_tric)): - doublets.extend(list(product([b], zip(queries_2, n)))) - - -@pytest.mark.parametrize('b, qns', doublets) -def test_search(b, qns): - """ - Test finding neighbors for a given query vector and type of box. - Parameters - ---------- - b : list - MDAnalysis dimensions like list - qns : tuple - a query point and a list of expected neighbors. - """ - b = np.array(b, dtype=np.float32) - q = transform_StoR(np.array(qns[0], dtype=np.float32), b) - # Setting up the periodic tree - tree = PeriodicKDTree(b) - coords = transform_StoR(f_dataset, b) - tree.set_coords(coords) # Input real space coordinates - # Carry out the search and retrieve results - tree.search(q, radius) - indices = tree.get_indices() - if indices: - found_neighbors = np.sort(coords[indices], axis=0) - else: - found_neighbors = list() - if qns[1]: - expected_neighbors = transform_StoR(np.array(qns[1], dtype=np.float32), b) - expected_neighbors = np.sort(expected_neighbors, axis=0) - else: - expected_neighbors = list() - assert_equal(found_neighbors, expected_neighbors) - -# Test Periodic cKDTree @pytest.mark.parametrize('b, cut, result', ( (None, 1.0, 'Donot provide cutoff distance' @@ -218,11 +47,11 @@ def test_search(b, qns): ([10, 10, 10, 90, 90, 90], None, 'Provide a cutoff distance with' ' tree.set_coords(...)'))) -def test_ckd_setcoords(b, cut, result): +def test_setcoords(b, cut, result): coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) if b is not None: b = np.array(b, dtype=np.float32) - tree = Periodic_cKDTree(box=b) + tree = PeriodicKDTree(box=b) print(b, tree.box, cut, result) with pytest.raises(RuntimeError, match=result): tree.set_coords(coords, cutoff=cut) @@ -233,32 +62,33 @@ def test_ckd_setcoords(b, cut, result): 'No need to build'), ([10, 10, 10, 90, 90, 90], 1.0, 0.9, 'No need to build'))) -def test_ckd_setcutoff_fail(b, cut, new_cut, result): +def test_setcutoff_fail(b, cut, new_cut, result): coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) if b is not None: b = np.array(b, dtype=np.float32) - tree = Periodic_cKDTree(box=b) + tree = PeriodicKDTree(box=b) tree.set_coords(coords, cutoff=cut) with pytest.raises(RuntimeError, match=result): tree.set_cutoff(new_cut) -def test_ckd_setcutoff_pass(): +def test_setcutoff_pass(): b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) cutoff, new_cutoff = 1.0, 1.2 coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) b = np.array(b, dtype=np.float32) - tree = Periodic_cKDTree(box=b) + tree = PeriodicKDTree(box=b) tree.set_coords(coords, cutoff=cutoff) tree.set_cutoff(new_cutoff) assert_equal(tree.cutoff, new_cutoff) -def test_ckd_directsetcutoff(): +def test_directsetcutoff(): b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) cutoff = 1.0 - tree = Periodic_cKDTree(box=b) - with pytest.raises(RuntimeError, match='Unbuilt tree. Run tree.set_coords(...)'): + tree = PeriodicKDTree(box=b) + with pytest.raises(RuntimeError, + match='Unbuilt tree. Run tree.set_coords(...)'): tree.set_cutoff(cutoff) @@ -268,7 +98,7 @@ def test_searchfail(): cutoff = 1.0 search_radius = 2.0 query = np.array([1, 1, 1], dtype=np.float32) - tree = Periodic_cKDTree(box=b) + tree = PeriodicKDTree(box=b) tree.set_coords(coords, cutoff=cutoff) match = 'Set cutoff greater or equal to the radius.' \ ' Use tree.set_cutoff(...)' @@ -281,22 +111,22 @@ def test_searchfail(): ([10, 10, 10, 90, 90, 90], [2.1, -3.1, 0.1], [2, 3, 4]), ([10, 10, 10, 45, 60, 90], [2.1, -3.1, 0.1], [2, 3]) )) -def test_ckd_search(b, q, result): +def test_search(b, q, result): b = np.array(b, dtype=np.float32) q = transform_StoR(np.array(q, dtype=np.float32), b) cutoff = 3.0 coords = transform_StoR(f_dataset, b) - tree = Periodic_cKDTree(box=b) + tree = PeriodicKDTree(box=b) tree.set_coords(coords, cutoff=cutoff) indices = tree.search(q, cutoff) assert_equal(indices, result) -def test_ckd_nopbc(): +def test_nopbc(): cutoff = 0.3 q = np.array([0.2, 0.3, 0.1]) coords = f_dataset.copy() - tree = Periodic_cKDTree(box=None) + tree = PeriodicKDTree(box=None) tree.set_coords(coords) indices = tree.search(q, cutoff) assert_equal(indices, [0, 2]) @@ -317,11 +147,11 @@ def test_ckd_nopbc(): ' Use tree.set_cutoff(...)'), ([10, 10, 10, 45, 60, 90], 0.1, []) )) -def test_ckd_searchpairs(b, radius, result): +def test_searchpairs(b, radius, result): b = np.array(b, dtype=np.float32) cutoff = 3.0 coords = transform_StoR(f_dataset, b) - tree = Periodic_cKDTree(box=b) + tree = PeriodicKDTree(box=b) tree.set_coords(coords, cutoff=cutoff) if cutoff < radius: with pytest.raises(RuntimeError, match=result): @@ -335,7 +165,7 @@ def test_ckd_searchpairs(b, radius, result): (0.3, [[0, 2]]))) def test_ckd_searchpairs_nopbc(radius, result): coords = f_dataset.copy() - tree = Periodic_cKDTree() + tree = PeriodicKDTree() tree.set_coords(coords) indices = tree.search_pairs(radius) assert_equal(indices, result) From 83f6cf23e1afedd571d11c82910751943460f4c7 Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Sat, 21 Jul 2018 19:36:10 -0700 Subject: [PATCH 266/455] TST: test_unique_int_1d now enforces int64 type * the Cython function unique_int_1d() is clearly defined and documented to accept an int64 argument type, but its associated unit test was not enforcing this type, which caused 6 test failures on the Windows platform --- testsuite/MDAnalysisTests/lib/test_cutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/lib/test_cutil.py b/testsuite/MDAnalysisTests/lib/test_cutil.py index 2b79975a092..73c94b24d89 100644 --- a/testsuite/MDAnalysisTests/lib/test_cutil.py +++ b/testsuite/MDAnalysisTests/lib/test_cutil.py @@ -37,5 +37,5 @@ [1, 2, 2, 6, 4, 4, ], # duplicates, non-monotonic )) def test_unique_int_1d(values): - array = np.array(values, dtype=int) + array = np.array(values, dtype=np.int64) assert_equal(unique_int_1d(array), np.unique(array)) From 9ba25f1f07e173089b2edc449ef559c634d14f59 Mon Sep 17 00:00:00 2001 From: davidercruz Date: Sun, 22 Jul 2018 04:19:36 +0100 Subject: [PATCH 267/455] fixed typos --- .../transformations/test_rotate.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 2ed878a7614..425f5794384 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -171,16 +171,26 @@ def test_rotateby_bad_pbc(rotate_universes): with pytest.raises(ValueError): rotateby(angle, vector, ag = ag, wrap=True)(ts) -def test_rotateby_bad_center(rotate_universes): + +@pytest.mark.parametrize('weights', ( + " ", + "totallynotmasses", + 123456789, + [0, 1, 2, 3, 4], + np.array([0, 1]), + np.array([0, 1, 2, 3, 4]), + np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])) +) +def test_rotateby_bad_weights(rotate_universes, weights): # this universe as a box size zero ts = rotate_universes[0].trajectory.ts ag = rotate_universes[0].residues[0].atoms # what if a wrong center type name is passed? angle = 90 vector = [0, 0, 1] - bad_center = " " + bad_weights = " " with pytest.raises(ValueError): - rotateby(angle, vector, ag = ag, weights=bad_center)(ts) + rotateby(angle, vector, ag = ag, weights=bad_weights)(ts) def test_rotateby_no_masses(rotate_universes): # this universe as a box size zero From 9e5db309609cd46642d06f647102393eb0ecaede Mon Sep 17 00:00:00 2001 From: davidercruz Date: Sun, 22 Jul 2018 12:51:31 +0100 Subject: [PATCH 268/455] code cleanup --- package/MDAnalysis/transformations/rotate.py | 14 ++++++++------ .../MDAnalysisTests/transformations/test_rotate.py | 6 +++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 53a87f38e50..4bd791281a9 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -103,14 +103,16 @@ def rotateby(angle, direction, point=None, weights=None, wrap=False, ag=None): raise ValueError('{} is not a valid point'.format(point)) elif ag: try: - weights = get_weights(ag.atoms, weights=weights) - except (ValueError, TypeError): - raise ValueError("weights must be {'mass', None} or an iterable of the " - "same size as the atomgroup.") - try: - center_method = partial(ag.atoms.center, weights, pbc=wrap) + atoms = ag.atoms except AttributeError: raise ValueError('{} is not an AtomGroup object'.format(ag)) + else: + try: + weights = get_weights(atoms, weights=weights) + except (ValueError, TypeError): + raise TypeError("weights must be {'mass', None} or an iterable of the " + "same size as the atomgroup.") + center_method = partial(atoms.center, weights, pbc=wrap) else: raise ValueError('A point or an AtomGroup must be specified') diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 425f5794384..5205f3a6998 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -147,7 +147,7 @@ def test_rotateby_bad_ag(rotate_universes): angle = 90 vector = [0, 0, 1] bad_ag = 1 - with pytest.raises(AttributeError): + with pytest.raises(ValueError): rotateby(angle, vector, ag = bad_ag)(ts) def test_rotateby_bad_position(rotate_universes): @@ -189,7 +189,7 @@ def test_rotateby_bad_weights(rotate_universes, weights): angle = 90 vector = [0, 0, 1] bad_weights = " " - with pytest.raises(ValueError): + with pytest.raises(TypeError): rotateby(angle, vector, ag = ag, weights=bad_weights)(ts) def test_rotateby_no_masses(rotate_universes): @@ -200,7 +200,7 @@ def test_rotateby_no_masses(rotate_universes): angle = 90 vector = [0, 0, 1] bad_center = "mass" - with pytest.raises(ValueError): + with pytest.raises(TypeError): rotateby(angle, vector, ag = ag, weights=bad_center)(ts) def test_rotateby_no_args(rotate_universes): From f8d49fbfbc5bd4080792169be20d624abff3175f Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sun, 22 Jul 2018 22:33:17 +0100 Subject: [PATCH 269/455] added checks for direction ; added tests for direction --- package/MDAnalysis/transformations/rotate.py | 24 +++++-- .../transformations/test_rotate.py | 64 +++++++++++++++++-- 2 files changed, 76 insertions(+), 12 deletions(-) diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index 4bd791281a9..b16292d7ca0 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -37,20 +37,26 @@ from ..lib.transformations import rotation_matrix from ..lib.util import get_weights -def rotateby(angle, direction, point=None, weights=None, wrap=False, ag=None): +def rotateby(angle, direction, point=None, ag=None, weights=None, wrap=False): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a point. This point can be the center of geometry or the center of mass of a user defined AtomGroup, or a list defining custom - coordinates. - e.g. rotate the coordinates by 90 degrees on a x axis centered on a given atom group: + coordinates. + + Examples + -------- + + e.g. rotate the coordinates by 90 degrees on a axis formed by the [0,0,1] vector and + the center of geometry of a given AtomGroup: .. code-block:: python ts = u.trajectory.ts angle = 90 ag = u.atoms() - rotated = MDAnalysis.transformations.rotate(angle, ag)(ts) + d = [0,0,1] + rotated = MDAnalysis.transformations.rotate(angle, direction=d, ag=ag)(ts) e.g. rotate the coordinates by a custom axis: @@ -60,7 +66,7 @@ def rotateby(angle, direction, point=None, weights=None, wrap=False, ag=None): angle = 90 p = [1,2,3] d = [0,0,1] - rotated = MDAnalysis.transformations.rotate(angle, point=point, direction=d)(ts) + rotated = MDAnalysis.transformations.rotate(angle, direction=d, point=point)(ts) Parameters ---------- @@ -97,10 +103,18 @@ def rotateby(angle, direction, point=None, weights=None, wrap=False, ag=None): ''' angle = np.deg2rad(angle) + try: + direction = np.asarray(direction, np.float32) + if direction.shape != (3, ) and direction.shape != (1, 3): + raise ValueError('{} is not a valid direction'.format(direction)) + direction = direction.reshape(3, ) + except ValueError: + raise ValueError('{} is not a valid direction'.format(direction)) if point: point = np.asarray(point, np.float32) if point.shape != (3, ) and point.shape != (1, 3): raise ValueError('{} is not a valid point'.format(point)) + point = point.reshape(3, ) elif ag: try: atoms = ag.atoms diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 5205f3a6998..823c8be4310 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -39,6 +39,7 @@ def rotate_universes(): transformed.trajectory.ts.dimensions = np.array([372., 373., 374., 90, 90, 90]) return reference, transformed + def test_rotation_matrix(): # test if the rotation_matrix function is working properly # simple angle and unit vector on origin @@ -74,7 +75,8 @@ def test_rotateby_custom_position(rotate_universes): ref_u.atoms.transform(matrix) transformed = rotateby(angle, vector, point=pos)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) - + + def test_rotateby_atomgroup_cog_nopbc(rotate_universes): # what happens when we rotate arround the center of geometry of a residue # without pbc? @@ -91,6 +93,7 @@ def test_rotateby_atomgroup_cog_nopbc(rotate_universes): transformed = rotateby(angle, vector, ag=selection, weights=None)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + def test_rotateby_atomgroup_com_nopbc(rotate_universes): # what happens when we rotate arround the center of mass of a residue # without pbc? @@ -106,6 +109,7 @@ def test_rotateby_atomgroup_com_nopbc(rotate_universes): ref_u.atoms.transform(matrix) transformed = rotateby(angle, vector, ag=selection, weights='mass')(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + def test_rotateby_atomgroup_cog_pbc(rotate_universes): # what happens when we rotate arround the center of geometry of a residue @@ -123,6 +127,7 @@ def test_rotateby_atomgroup_cog_pbc(rotate_universes): transformed = rotateby(angle, vector, ag=selection, weights=None, wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + def test_rotateby_atomgroup_com_pbc(rotate_universes): # what happens when we rotate arround the center of mass of a residue # with pbc? @@ -138,8 +143,19 @@ def test_rotateby_atomgroup_com_pbc(rotate_universes): ref_u.atoms.transform(matrix) transformed = rotateby(angle, vector, ag=selection, weights='mass', wrap=True)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) - -def test_rotateby_bad_ag(rotate_universes): + + +@pytest.mark.parametrize('ag', ( + [0, 1], + [0, 1, 2, 3, 4], + np.array([0, 1]), + np.array([0, 1, 2, 3, 4]), + np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), + np.array([[0], [1], [2]]), + 'thisisnotanag', + 1) +) +def test_rotateby_bad_ag(rotate_universes, ag): # this universe as a box size zero ts = rotate_universes[0].trajectory.ts ag = rotate_universes[0].residues[0].atoms @@ -150,24 +166,56 @@ def test_rotateby_bad_ag(rotate_universes): with pytest.raises(ValueError): rotateby(angle, vector, ag = bad_ag)(ts) -def test_rotateby_bad_position(rotate_universes): + +@pytest.mark.parametrize('point', ( + [0, 1], + [0, 1, 2, 3, 4], + np.array([0, 1]), + np.array([0, 1, 2, 3, 4]), + np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), + np.array([[0], [1], [2]]), + 'thisisnotapoint', + 1) +) +def test_rotateby_bad_point(rotate_universes, point): # this universe as a box size zero ts = rotate_universes[0].trajectory.ts # what if the box is in the wrong format? angle = 90 vector = [0, 0, 1] - bad_position = [1] + bad_position = point with pytest.raises(ValueError): rotateby(angle, vector, point=bad_position)(ts) - + + +@pytest.mark.parametrize('direction', ( + [0, 1], + [0, 1, 2, 3, 4], + np.array([0, 1]), + np.array([0, 1, 2, 3, 4]), + np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), + np.array([[0], [1], [2]]), + 'thisisnotadirection', + 1) +) +def test_rotateby_bad_direction(rotate_universes, direction): + # this universe as a box size zero + ts = rotate_universes[0].trajectory.ts + # what if the box is in the wrong format? + angle = 90 + point = [0, 0, 0] + with pytest.raises(ValueError): + rotateby(angle, direction, point=point)(ts) + + def test_rotateby_bad_pbc(rotate_universes): # this universe as a box size zero ts = rotate_universes[0].trajectory.ts ag = rotate_universes[0].residues[0].atoms # is pbc passed to the center methods? # if yes it should raise an exception for boxes that are zero in size + vector = [1, 0, 0] angle = 90 - vector = [0, 0, 1] with pytest.raises(ValueError): rotateby(angle, vector, ag = ag, wrap=True)(ts) @@ -191,6 +239,7 @@ def test_rotateby_bad_weights(rotate_universes, weights): bad_weights = " " with pytest.raises(TypeError): rotateby(angle, vector, ag = ag, weights=bad_weights)(ts) + def test_rotateby_no_masses(rotate_universes): # this universe as a box size zero @@ -203,6 +252,7 @@ def test_rotateby_no_masses(rotate_universes): with pytest.raises(TypeError): rotateby(angle, vector, ag = ag, weights=bad_center)(ts) + def test_rotateby_no_args(rotate_universes): # this universe as a box size zero ts = rotate_universes[0].trajectory.ts From dfadeffdd52932ca6d71ade9ded9fab84faf4212 Mon Sep 17 00:00:00 2001 From: ayush Date: Sun, 22 Jul 2018 19:53:08 -0700 Subject: [PATCH 270/455] Modified search pair to check the number of bonds --- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index 5549e32a35b..b0e7fcdc05a 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -133,14 +133,10 @@ def test_nopbc(): @pytest.mark.parametrize('b, radius, result', ( - ([10, 10, 10, 90, 90, 90], 3.0, [[0, 2], + ([10, 10, 10, 90, 90, 90], 2.0, [[0, 2], [0, 4], - [2, 3], - [2, 4], - [3, 4]]), - ([10, 10, 10, 45, 60, 90], 3.0, [[0, 2], - [0, 4], - [2, 3], + [2, 4]]), + ([10, 10, 10, 45, 60, 90], 2.0, [[0, 4], [2, 4]]), ([10, 10, 10, 45, 60, 90], 4.5, 'Set cutoff greater or equal to the radius.' @@ -149,7 +145,7 @@ def test_nopbc(): )) def test_searchpairs(b, radius, result): b = np.array(b, dtype=np.float32) - cutoff = 3.0 + cutoff = 2.0 coords = transform_StoR(f_dataset, b) tree = PeriodicKDTree(box=b) tree.set_coords(coords, cutoff=cutoff) @@ -158,7 +154,7 @@ def test_searchpairs(b, radius, result): indices = tree.search_pairs(radius) else: indices = tree.search_pairs(radius) - assert_equal(indices, result) + assert_equal(len(indices), len(result)) @pytest.mark.parametrize('radius, result', ((0.1, []), From 87cce214b3aedf3c0c7f7b888694c7c9d0ddb1d0 Mon Sep 17 00:00:00 2001 From: mat Date: Mon, 23 Jul 2018 15:35:50 +0100 Subject: [PATCH 271/455] Trailing lines --- package/MDAnalysis/analysis/waterdynamics.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 780bcdb473d..d497f3d5cbd 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1267,5 +1267,4 @@ def run(self): # user can investigate the distribution and sample size self.sp_timeseries = sp_timeseries - return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] - + return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] \ No newline at end of file From cc4db3599e74efc150048c5afb9bd441289fa975 Mon Sep 17 00:00:00 2001 From: mat Date: Mon, 23 Jul 2018 15:42:17 +0100 Subject: [PATCH 272/455] Author and changelog updated. --- package/AUTHORS | 1 + package/CHANGELOG | 2 ++ testsuite/AUTHORS | 2 ++ 3 files changed, 5 insertions(+) diff --git a/package/AUTHORS b/package/AUTHORS index 4870f02ac30..0d8f941c4f9 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -98,6 +98,7 @@ Chronological list of authors 2018 - Nabarun Pal - Mateusz Bieniek + - Paul Smith - Navya Khare - Johannes Zeman - Ayush Suhane diff --git a/package/CHANGELOG b/package/CHANGELOG index 1e3f317ea3d..9b3e75043cd 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -53,6 +53,8 @@ Changes duplicates. Otherwise, the group itself is returned. Repeated access of *Group.unique will always return the same object unless the group is updated or modified. (PR #1922) + * SurvivalProbability does not dilute SP anymore when the reference frame (t0) + cannot find any molecules in the first place. (PR #1995) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, diff --git a/testsuite/AUTHORS b/testsuite/AUTHORS index 32fb9b8fbed..908a5d2a0f1 100644 --- a/testsuite/AUTHORS +++ b/testsuite/AUTHORS @@ -84,6 +84,8 @@ Chronological list of authors 2018 - Johannes Zeman - Ayush Suhane + - Paul Smith + - Mateusz Bieniek External code From e83bd9aade3b4392d51ba068d3ceef79725f65ce Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Mon, 23 Jul 2018 11:54:20 -0700 Subject: [PATCH 273/455] Fixed imports and docstring --- package/MDAnalysis/analysis/dihedrals.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 36c06f8b06d..30d344251f6 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -41,7 +41,8 @@ See Also -------- -:mod:`MDAnalysis.lib.distances.calc_diherals` +:mod:`MDAnalysis.lib.distances` + contains functions to calculate dihedral angles from atom positions Example application @@ -84,16 +85,18 @@ .. attribute:: angles - Contains the time series of the phi and psi angles for each residue as - an N×2 :class:`numpy.ndarray` array with content - ``[[phi, psi], [...], ...]``. + Contains the time steps of the phi and psi angles for each residue as + an n_frames×n_residuesx2 :class:`numpy.ndarray` array with content + ``[[[phi, psi], [residue 2], ...], [time step 2], ...]``. """ +from __future__ import absolute_import +from six.moves import zip, range + import numpy as np import matplotlib.pyplot as plt + import warnings -import six -from six.moves import zip import MDAnalysis as mda from MDAnalysis.analysis.base import AnalysisBase From 756123291154d781c452babcf948c45b002e690d Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Mon, 23 Jul 2018 13:58:20 -0700 Subject: [PATCH 274/455] Fixed docstring --- package/MDAnalysis/analysis/dihedrals.py | 33 +++++++++++------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 30d344251f6..09f0c7dce92 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -34,22 +34,22 @@ selected frames or whole trajectories. A list of time steps that contain phi and psi angles for each residue is -generated, and a basic Ramachandran plot can be generated using the attribute -:meth:`Ramachandran.plot`. This plot is best used as a reference, but it also +generated, and a basic Ramachandran plot can be generated using the method +:meth:`Ramachandran.plot()`. This plot is best used as a reference, but it also allows for user customization. See Also -------- -:mod:`MDAnalysis.lib.distances` - contains functions to calculate dihedral angles from atom positions +:func:`MDAnalysis.lib.distances.calc_dihedrals()` + function to calculate dihedral angles from atom positions Example application ------------------- This example will show how to calculate the phi and psi angles of adenylate -kinase and generate a basic Ramachandran plot. The trajectory is included with -the test data files:: +kinase (AdK) and generate a basic Ramachandran plot. The trajectory is included +within the test data files:: import MDAnalysis as mda from MDAnalysisTests.datafiles import GRO, XTC @@ -65,7 +65,7 @@ R.plot(ax=ax, color='k', marker='s') Alternatively, if you wanted to plot the data yourself, the angles themselves -can be accessed using :meth:`Ramachandran.angles`:: +can be accessed using :attr:`Ramachandran.angles`:: fig, ax = plt.subplots(figsize=plt.figaspect(1)) ax.axis([-180,180,-180,180]) @@ -86,7 +86,7 @@ .. attribute:: angles Contains the time steps of the phi and psi angles for each residue as - an n_frames×n_residuesx2 :class:`numpy.ndarray` array with content + an n_frames×n_residues×2 :class:`numpy.ndarray` with content ``[[[phi, psi], [residue 2], ...], [time step 2], ...]``. """ @@ -104,23 +104,20 @@ class Ramachandran(AnalysisBase): - r"""Calculate phi and psi dihedral angles of specified residues. + """Calculate phi and psi dihedral angles of selected residues. - Phi and psi angles wil be calculated for each residue in `atomgroup` for - each time step in the trajectory. A ReisdueGroup is generated from - `atomgroup` which is compared to the protein to determine if it is a - legitimate selection. + Phi and psi angles will be calculated for each residue corresponding to + `atomgroup` for each time step in the trajectory. A :class:`ResidueGroup` + is generated from `atomgroup` which is compared to the protein to determine + if it is a legitimate selection. Note ---- If the residue selection is beyond the scope of the protein, then an error - will be raised. If the residue selection includes the first or last residue + will be raised. If the residue selection includes the first or last residue, then a warning will be raised and they will be removed from the list of residues, but the analysis will still run. - Run the analysis with :meth:`Ramachandran.run()`, whcih stores the results in the - array :attr:`Ramachandran.angles` - """ def __init__(self, atomgroup, **kwargs): """Parameters @@ -175,7 +172,7 @@ def _conclude(self): def plot(self, ax=None, **kwargs): """Plots data into standard ramachandran plot. Each time step in - self.angles is plotted onto the same graph. + :attr:`Ramachandran.angles` is plotted onto the same graph. Parameters ---------- From c166ab20fcfb4e97b0f73967413c813bf4688580 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 24 Jul 2018 15:36:52 +0100 Subject: [PATCH 275/455] Documentation and requested changes PR #1995. --- package/CHANGELOG | 2 +- package/MDAnalysis/analysis/waterdynamics.py | 124 ++++++++++--------- 2 files changed, 65 insertions(+), 61 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 9b3e75043cd..9edadccf99e 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,7 +14,7 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, - VOD555, davidercruz + VOD555, davidercruz, bieniekmateusz, p-j-smith * 0.18.1 diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index d497f3d5cbd..f5df6bc725b 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -283,23 +283,22 @@ import MDAnalysis from MDAnalysis.analysis.waterdynamics import SurvivalProbability as SP + import matplotlib.pyplot as plt - u = MDAnalysis.Universe(pdb, trajectory) + universe = MDAnalysis.Universe(pdb, trajectory) selection = "byres name OH2 and sphzone 12.3 (resid 42 or resid 26 or resid 34 or resid 80) " - SP_analysis = SP(universe, selection, 0, 100, 20) - SP_analysis.run() - #now we print data ready to graph. The graph - #represents SP vs t - time = 0 - for sp in SP_analysis.timeseries: - print("{time} {sp}".format(time=time, sp=sp)) - time += 1 + sp = SP(universe, selection, verbose=True) + taus, sp_timeseries = sp.run(start=0, stop=100, tau_max=20) - #Plot - plt.xlabel('time') + # print in console + for tau, sp in zip(taus, sp_timeseries): + print("{time} {sp}".format(time=tau, sp=sp)) + + # plot + plt.xlabel('Time') plt.ylabel('SP') plt.title('Survival Probability') - plt.plot(range(0,time),MSD_analysis.timeseries) + plt.plot(taus, sp_timeseries) plt.show() @@ -376,16 +375,13 @@ SurvivalProbability ~~~~~~~~~~~~~~~~~~~ -Survival Probability (SP) data is returned in a list, which each element -represents a SP value in its respective window timestep. Data is stored in -:attr:`SurvivalProbability.timeseries`:: - - results = [ - # SP values order by window timestep - , , ... - ] +Survival Probability (SP) returns two lists: a list of taus and a list of their corresponding mean survival +probabilities. Additionally, a list :attr:`SurvivalProbability.sp_timeseries` is provided which contains +a list of SPs for each tau. This provides the number of datapoints gathered and the distribution. + results = [ tau1, tau2, ..., tau_n ], [ sp_tau1, sp_tau2, ..., sp_tau_n] +Additionally, for each Classes -------- @@ -413,7 +409,6 @@ """ from __future__ import print_function, division, absolute_import -from numpy.core.multiarray import ndarray from six.moves import range, zip_longest import numpy as np @@ -1187,7 +1182,8 @@ class SurvivalProbability(object): P(\tau) = \frac1T \sum_{t=1}^T \frac{N(t,t+\tau)}{N(t)} where :math:`T` is the maximum time of simulation, :math:`\tau` is the - timestep and :math:`N` the number of particles in certain time. + timestep, :math:`N(t)` the number of particles at time t, and + :math:`N(t, t+\tau)` is the number of particles at every frame from t to `\tau`. Parameters @@ -1196,73 +1192,81 @@ class SurvivalProbability(object): Universe object selection : str Selection string; any selection is allowed. With this selection you - define the region/zone where to analyze, e.g.: "selection_a" and "zone" - (see `SP-examples`_ ) - t0 : int - Zero-based index of the first frame to be analysed - tf : int - Zero-based index of the last frame to be analysed (inclusive) - tau_max : int - Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + define the region/zone where to analyze, e.g.: "resname SOL and around 5 (resname LIPID)" + and "resname ION and around 10 (resid 20)" (see `SP-examples`_ ) verbose : Boolean If True, prints progress and comments to the console. - Returns - ------- - tau_timeseries : list - tau from 1 to tau_max - sp_timeseries : list - survival probability for each value of `tau` - .. versionadded:: 0.11.0 """ - def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): - - if tf >= len(universe.trajectory): - raise ValueError("\"end\" must be smaller than the number of frames in the trajectory.") - + def __init__(self, universe, selection, verbose=False): self.universe = universe self.selection = selection - self.t0 = t0 - self.tf = len(list(universe.trajectory[:tf])) + 1 - self.tau_max = tau_max self.verbose = verbose - if self.tau_max > self.tf - self.t0: - raise ValueError("Too few frames selected for given tau_max.") - def print(self, *args): if self.verbose: print(args) - def run(self): + def run(self, tau_max, start=0, stop=-1, step=1): """ Computes and returns the survival probability timeseries + + Parameters + ---------- + start : int + Zero-based index of the first frame to be analysed + stop : int + Zero-based index of the last frame to be analysed (inclusive) + step : int + Jump every `step`'th frame + tau_max : int + Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + + Returns + ------- + tau_timeseries : list + tau from 1 to tau_max + sp_timeseries : list + survival probability for each value of `tau` """ - + + if stop >= len(self.universe.trajectory): + raise ValueError("\"stop\" must be smaller than the number of frames in the trajectory.") + + if stop == -1: + stop = self.universe.trajectory[-1].frame + 1 + else: + stop = stop + 1 + + if tau_max > (stop - start): + raise ValueError("Too few frames selected for given tau_max.") + # load all frames to an array of sets - selected = [] - for _ in self.universe.trajectory[self.t0:self.tf]: - selected.append(set(self.universe.select_atoms(self.selection).ids)) + selected_ids = [] + for ts in self.universe.trajectory[start:stop]: + self.print("Loading frame:", ts) + selected_ids.append(set(self.universe.select_atoms(self.selection).ids)) - tau_timeseries = list(range(1, self.tau_max + 1)) - sp_timeseries = [[] for _ in range(self.tau_max)] + tau_timeseries = np.arange(1, tau_max + 1) + sp_timeseries = [[] for _ in range(tau_max)] - for t in range(len(selected)): - Nt = len(selected[t]) + for t in range(0, len(selected_ids), step): + Nt = len(selected_ids[t]) if Nt == 0: self.print("At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) continue for tau in tau_timeseries: - if t + tau >= len(selected): + if t + tau >= len(selected_ids): break - Ntau = len(set.intersection(*selected[t:t + tau + 1])) - sp_timeseries[tau - 1].append(Ntau / float(Nt) ) + # ids that survive from t to t + tau and at every frame in between + Ntau = len(set.intersection(*selected_ids[t:t + tau + 1])) + sp_timeseries[tau - 1].append(Ntau / float(Nt)) # user can investigate the distribution and sample size self.sp_timeseries = sp_timeseries From 505f5494c89a0e981a99f8e451e59598a1a36440 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 24 Jul 2018 15:41:47 +0100 Subject: [PATCH 276/455] Tests adjusted to the new interface. --- .../analysis/test_waterdynamics.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index a4ada7d5730..3ff8c3faa4d 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -89,8 +89,8 @@ def test_SurvivalProbability_t0tf(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1), (0, )] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop(2)) # atom IDs fed set by set - sp = waterdynamics.SurvivalProbability(universe, "", 2, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=2, stop=6) assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) @@ -98,8 +98,8 @@ def test_SurvivalProbability_definedTaus(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: ids = [(9, 8, 7), (8, 7, 6), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set - sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=0, stop=6) assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) @@ -107,16 +107,16 @@ def test_SurvivalProbability_zeroMolecules(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: # no atom IDs found select_atoms_mock.return_value = Mock(ids=[]) - sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=3, stop=6) assert all(np.isnan(timeseries)) def test_SurvivalProbability_alwaysPresent(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: # always the same atom IDs found - select_atoms_mock.return_value = Mock(ids=[7, 8, 1, 9]) + select_atoms_mock.return_value = Mock(ids=[7, 8]) - sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=0, stop=6) assert all(np.equal(timeseries, 1)) \ No newline at end of file From affc0abb0012b911606c848c38dc1066667aa82d Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 24 Jul 2018 17:44:24 +0100 Subject: [PATCH 277/455] Conforming to the run() interface defined in #1463. --- package/MDAnalysis/analysis/waterdynamics.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index f5df6bc725b..61acc756326 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1206,11 +1206,13 @@ def __init__(self, universe, selection, verbose=False): self.selection = selection self.verbose = verbose - def print(self, *args): + def print(self, verbose, *args): if self.verbose: print(args) + elif verbose: + print(args) - def run(self, tau_max, start=0, stop=-1, step=1): + def run(self, tau_max, start=0, stop=-1, step=1, verbose=False): """ Computes and returns the survival probability timeseries @@ -1224,6 +1226,8 @@ def run(self, tau_max, start=0, stop=-1, step=1): Jump every `step`'th frame tau_max : int Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + verbose : Boolean + Overwrite the constructor's verbosity Returns ------- @@ -1247,7 +1251,7 @@ def run(self, tau_max, start=0, stop=-1, step=1): # load all frames to an array of sets selected_ids = [] for ts in self.universe.trajectory[start:stop]: - self.print("Loading frame:", ts) + self.print(verbose, "Loading frame:", ts) selected_ids.append(set(self.universe.select_atoms(self.selection).ids)) tau_timeseries = np.arange(1, tau_max + 1) @@ -1257,7 +1261,8 @@ def run(self, tau_max, start=0, stop=-1, step=1): Nt = len(selected_ids[t]) if Nt == 0: - self.print("At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) + self.print(verbose, + "At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) continue for tau in tau_timeseries: From 193e503fae739130dcd59a0bedc1972a3b4e1345 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Tue, 24 Jul 2018 11:40:04 -0700 Subject: [PATCH 278/455] Fixed imports of test_dihedral.py --- testsuite/MDAnalysisTests/analysis/test_dihedrals.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 8de1289abb4..07e4b89e1d7 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -19,6 +19,8 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # +from __future__ import absolute_import + import numpy as np from numpy.testing import assert_almost_equal import matplotlib From eadcf3fbd692669174751bc244919f023997d38c Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 24 Jul 2018 16:35:23 -0700 Subject: [PATCH 279/455] modified the sorting, and made pbc a property --- package/MDAnalysis/lib/pkdtree.py | 42 ++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 29418155765..34639dde857 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -33,8 +33,9 @@ import numpy as np from scipy.spatial import cKDTree -from MDAnalysis.lib._cutil import unique_int_1d -from MDAnalysis.lib._augment import augment_coordinates, undo_augment +from ._cutil import unique_int_1d +from ._augment import augment_coordinates, undo_augment +from .util import unique_rows from MDAnalysis.lib.distances import apply_PBC @@ -79,13 +80,24 @@ def __init__(self, box=None, leafsize=10): self.leafsize = leafsize self.dim = 3 # 3D systems self.box = box - self.periodic = False - if box is not None: - self.periodic = True - self._indices = list() + self._pbc = False + if self.box is not None: + self._pbc = True self._built = False self.cutoff = None + @property + def pbc(self): + return self._pbc + + @pbc.setter + def pbc(self, value): + self._pbc = value + + @pbc.getter + def pbc(self): + return self._pbc + def set_coords(self, coords, cutoff=None): """Constructs KDTree from the coordinates @@ -125,7 +137,7 @@ def set_coords(self, coords, cutoff=None): 'If need to change the cutoff radius' 'Run tree.set_cutoff(cutoff)') # If no cutoff distance is provided but PBC aware - if self.periodic and (cutoff is None): + if self.pbc and (cutoff is None): raise RuntimeError('Provide a cutoff distance' ' with tree.set_coords(...)') @@ -133,7 +145,7 @@ def set_coords(self, coords, cutoff=None): # augment coordinates will work only with float32 coords = np.asarray(coords, dtype=np.float32) - if self.periodic: + if self.pbc: self.cutoff = cutoff # Bring the coordinates in the central cell self.coords = apply_PBC(coords, self.box) @@ -157,7 +169,7 @@ def set_cutoff(self, cutoff): """Change the cutoff to rebuild the tree""" if not self._built: raise RuntimeError('Unbuilt tree. Run tree.set_coords(...)') - if self.periodic: + if self.pbc: if self.cutoff < cutoff: self.cutoff = cutoff self._built = False @@ -190,7 +202,7 @@ def search(self, centers, radius): centers = centers.reshape((1, self.dim)) self._indices = set() # clear previous search - if self.periodic: + if self.pbc: if self.cutoff < radius: raise RuntimeError('Set cutoff greater or equal to the radius.' ' Use tree.set_cutoff(...)') @@ -240,22 +252,18 @@ def search_pairs(self, radius): if not self._built: raise RuntimeError(' Unbuilt Tree. Run tree.set_coords(...)') - if self.periodic: + if self.pbc: if self.cutoff < radius: raise RuntimeError('Set cutoff greater or equal to the radius.' ' Use tree.set_cutoff(...)') pairs = np.array(list(self.ckdt.query_pairs(radius)), dtype=np.int64) - if self.periodic: + if self.pbc: if len(pairs) > 1: pairs[:, 0] = undo_augment(pairs[:, 0], self.mapping, len(self.coords)) pairs[:, 1] = undo_augment(pairs[:, 1], self.mapping, len(self.coords)) if pairs.size > 0: - pairs = np.sort(pairs, axis=1) - unique_pairs = [tuple(x) for x in pairs] - unique_pairs = sorted(set(unique_pairs), - key=lambda x: x[0]) - pairs = np.asarray(unique_pairs, dtype=np.int64) + pairs = unique_rows(pairs) return pairs From a064686070d64b076a4eda5aabed9d0af234c107 Mon Sep 17 00:00:00 2001 From: mat Date: Wed, 25 Jul 2018 01:53:19 +0100 Subject: [PATCH 280/455] Backward compatibility (and priority) with warnings. --- package/MDAnalysis/analysis/waterdynamics.py | 26 ++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 61acc756326..f7348a4b192 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -409,6 +409,8 @@ """ from __future__ import print_function, division, absolute_import +import warnings + from six.moves import range, zip_longest import numpy as np @@ -1201,18 +1203,32 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, verbose=False): + def __init__(self, universe, selection, t0=None, tf=None, dtmax=None, verbose=False): self.universe = universe self.selection = selection self.verbose = verbose + # backward compatibility + self.start = self.stop = self.tau_max = None + if t0 is not None: + self.start = t0 + warnings.warn("t0 is deprecated, use run(start=t0) instead", category=DeprecationWarning) + + if tf is not None: + self.stop = tf + warnings.warn("tf is deprecated, use run(stop=tf) instead", category=DeprecationWarning) + + if dtmax is not None: + self.tau_max = dtmax + warnings.warn("dtmax is deprecated, use run(tau_max=dtmax) instead", category=DeprecationWarning) + def print(self, verbose, *args): if self.verbose: print(args) elif verbose: print(args) - def run(self, tau_max, start=0, stop=-1, step=1, verbose=False): + def run(self, tau_max=20, start=0, stop=-1, step=1, verbose=False): """ Computes and returns the survival probability timeseries @@ -1237,6 +1253,12 @@ def run(self, tau_max, start=0, stop=-1, step=1, verbose=False): survival probability for each value of `tau` """ + # backward compatibility (and priority) + start = self.start if self.start is not None else start + stop = self.stop if self.stop is not None else stop + tau_max = self.tau_max if self.tau_max is not None else tau_max + + # sanity checks if stop >= len(self.universe.trajectory): raise ValueError("\"stop\" must be smaller than the number of frames in the trajectory.") From 666370e3aa5f394bcb8e057d2b52af602b9997e3 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 24 Jul 2018 17:53:36 -0700 Subject: [PATCH 281/455] removed set_cutoff, and modified the pbc property definition --- package/MDAnalysis/lib/pkdtree.py | 40 ++---------------- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 41 +------------------ 2 files changed, 6 insertions(+), 75 deletions(-) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 34639dde857..2e7af555e0f 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -80,23 +80,12 @@ def __init__(self, box=None, leafsize=10): self.leafsize = leafsize self.dim = 3 # 3D systems self.box = box - self._pbc = False - if self.box is not None: - self._pbc = True self._built = False self.cutoff = None @property def pbc(self): - return self._pbc - - @pbc.setter - def pbc(self, value): - self._pbc = value - - @pbc.getter - def pbc(self): - return self._pbc + return self.box is not None def set_coords(self, coords, cutoff=None): """Constructs KDTree from the coordinates @@ -130,12 +119,6 @@ def set_coords(self, coords, cutoff=None): """ - - # Check if already built - if self._built: - raise RuntimeError('Tree is already built.' - 'If need to change the cutoff radius' - 'Run tree.set_cutoff(cutoff)') # If no cutoff distance is provided but PBC aware if self.pbc and (cutoff is None): raise RuntimeError('Provide a cutoff distance' @@ -165,20 +148,6 @@ def set_coords(self, coords, cutoff=None): self.ckdt = cKDTree(self.coords, self.leafsize) self._built = True - def set_cutoff(self, cutoff): - """Change the cutoff to rebuild the tree""" - if not self._built: - raise RuntimeError('Unbuilt tree. Run tree.set_coords(...)') - if self.pbc: - if self.cutoff < cutoff: - self.cutoff = cutoff - self._built = False - self.set_coords(self.coords, self.cutoff) - else: - raise RuntimeError('No need to build') - else: - raise RuntimeError('No need to build') - def search(self, centers, radius): """Search all points within radius from centers and their periodic images. @@ -202,10 +171,10 @@ def search(self, centers, radius): centers = centers.reshape((1, self.dim)) self._indices = set() # clear previous search + # Sanity check if self.pbc: if self.cutoff < radius: - raise RuntimeError('Set cutoff greater or equal to the radius.' - ' Use tree.set_cutoff(...)') + raise RuntimeError('Set cutoff greater or equal to the radius.') # Bring all query points to the central cell wrapped_centers = apply_PBC(centers, self.box) indices = list(self.ckdt.query_ball_point(wrapped_centers, @@ -254,8 +223,7 @@ def search_pairs(self, radius): if self.pbc: if self.cutoff < radius: - raise RuntimeError('Set cutoff greater or equal to the radius.' - ' Use tree.set_cutoff(...)') + raise RuntimeError('Set cutoff greater or equal to the radius.') pairs = np.array(list(self.ckdt.query_pairs(radius)), dtype=np.int64) if self.pbc: diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index b0e7fcdc05a..a073057cf77 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -57,41 +57,6 @@ def test_setcoords(b, cut, result): tree.set_coords(coords, cutoff=cut) -@pytest.mark.parametrize('b, cut, new_cut, result', - ((None, None, 1.0, - 'No need to build'), - ([10, 10, 10, 90, 90, 90], 1.0, 0.9, - 'No need to build'))) -def test_setcutoff_fail(b, cut, new_cut, result): - coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) - if b is not None: - b = np.array(b, dtype=np.float32) - tree = PeriodicKDTree(box=b) - tree.set_coords(coords, cutoff=cut) - with pytest.raises(RuntimeError, match=result): - tree.set_cutoff(new_cut) - - -def test_setcutoff_pass(): - b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) - cutoff, new_cutoff = 1.0, 1.2 - coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) - b = np.array(b, dtype=np.float32) - tree = PeriodicKDTree(box=b) - tree.set_coords(coords, cutoff=cutoff) - tree.set_cutoff(new_cutoff) - assert_equal(tree.cutoff, new_cutoff) - - -def test_directsetcutoff(): - b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) - cutoff = 1.0 - tree = PeriodicKDTree(box=b) - with pytest.raises(RuntimeError, - match='Unbuilt tree. Run tree.set_coords(...)'): - tree.set_cutoff(cutoff) - - def test_searchfail(): coords = np.array([[1, 1, 1], [2, 2, 2]], dtype=np.float32) b = np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) @@ -100,8 +65,7 @@ def test_searchfail(): query = np.array([1, 1, 1], dtype=np.float32) tree = PeriodicKDTree(box=b) tree.set_coords(coords, cutoff=cutoff) - match = 'Set cutoff greater or equal to the radius.' \ - ' Use tree.set_cutoff(...)' + match = 'Set cutoff greater or equal to the radius.' with pytest.raises(RuntimeError, match=match): tree.search(query, search_radius) @@ -139,8 +103,7 @@ def test_nopbc(): ([10, 10, 10, 45, 60, 90], 2.0, [[0, 4], [2, 4]]), ([10, 10, 10, 45, 60, 90], 4.5, - 'Set cutoff greater or equal to the radius.' - ' Use tree.set_cutoff(...)'), + 'Set cutoff greater or equal to the radius.'), ([10, 10, 10, 45, 60, 90], 0.1, []) )) def test_searchpairs(b, radius, result): From 182d8671a40a12257e5e16ec745ad08620fe27a3 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 24 Jul 2018 18:31:24 -0700 Subject: [PATCH 282/455] removed set_cutoff from Neighboursearch as well --- package/MDAnalysis/lib/NeighborSearch.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/lib/NeighborSearch.py b/package/MDAnalysis/lib/NeighborSearch.py index 4f24dd4727e..39cd5b3f7a6 100644 --- a/package/MDAnalysis/lib/NeighborSearch.py +++ b/package/MDAnalysis/lib/NeighborSearch.py @@ -88,13 +88,9 @@ def search(self, atoms, radius, level='A'): positions = atoms.positions # check if already built - if self.kdtree._built: - if self._box is not None: - if self.kdtree.cutoff < radius: - self.kdtree.set_cutoff(radius) - else: - cutoff = radius if self._box is not None else None - self.kdtree.set_coords(self.atom_group.positions, cutoff=cutoff) + + cutoff = radius if self._box is not None else None + self.kdtree.set_coords(self.atom_group.positions, cutoff=cutoff) indices = [] for pos in positions: From 917dbec057e0e7d6381977338f448f755d43e3ce Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 26 Jul 2018 01:01:51 -0700 Subject: [PATCH 283/455] pair sorting before picking out the unique pairs. Previously resulting repeat pairs --- package/MDAnalysis/lib/pkdtree.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 2e7af555e0f..8ab562dbd45 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -233,5 +233,7 @@ def search_pairs(self, radius): pairs[:, 1] = undo_augment(pairs[:, 1], self.mapping, len(self.coords)) if pairs.size > 0: + # First sort the pairs then pick the unique pairs + pairs = np.sort(pairs, axis=1) pairs = unique_rows(pairs) return pairs From f1e72ab0fff760d3025216110d92e0fd5cc76f38 Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Thu, 26 Jul 2018 21:06:29 -0700 Subject: [PATCH 284/455] BUG: fix several Windows test failures with int64 type enforcement for unique_int_1d in selection.py. --- package/MDAnalysis/core/selection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index a6b9d43ba15..880efd396ec 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -220,7 +220,7 @@ class ByResSelection(UnarySelection): def apply(self, group): res = self.sel.apply(group) - unique_res = unique_int_1d(res.resids) + unique_res = unique_int_1d(res.resids.astype(np.int64)) mask = np.in1d(group.resids, unique_res) return group[mask].unique From b827bc09179a6ad550c30573c2865340eaa381ec Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 21 Jun 2018 16:44:05 +0100 Subject: [PATCH 285/455] The windows size tau + t was already accounted for in _getMeanOnePoint upstream --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 72f5d14bf04..968659ba5b6 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1285,7 +1285,7 @@ def _NumPart_tau(self, selected, t, tau): """ survivors = set(selected[t]) i = 0 - while (t + i) < t + tau and (t + i) < len(selected): + while (t + i) < t + tau: next = set(selected[t + i]) survivors = survivors.intersection(next) i += 1 From cdcd942db0eac4e4dd497a53a5f1501c7270d697 Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 21 Jun 2018 17:01:52 +0100 Subject: [PATCH 286/455] Use reverse search for number of survivors. Stop search if no survivors. --- package/MDAnalysis/analysis/waterdynamics.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 968659ba5b6..a8dd38d0e76 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1249,7 +1249,7 @@ def _getMeanOnePoint(self, selected, window_size): """ n = 0 sumDeltaP = 0.0 - for frame_no in range(len(selected) - window_size): + for frame_no in range(len(selected) - window_size - 1): delta = self._getOneDeltaPoint(selected, frame_no, window_size) sumDeltaP += delta n += 1 @@ -1278,15 +1278,15 @@ def _getOneDeltaPoint(self, selected, t, tau): def _NumPart_tau(self, selected, t, tau): """ - Compares the molecules in t selection and t+tau selection and - select only the particles that remain from t to t+tau and - at each point in between. - It returns the number of remaining particles. + Returns the number of particles that persist from t to t + tau. """ + survivors = set(selected[t]) - i = 0 - while (t + i) < t + tau: + # For optimisation, start from t + tau + for i in range(tau, 0, -1): next = set(selected[t + i]) survivors = survivors.intersection(next) - i += 1 + if len(survivors) == 0: + return 0 + return len(survivors) \ No newline at end of file From 351fc5d813944b138aa0c1b5b2b5207ab316286c Mon Sep 17 00:00:00 2001 From: p-j-smith Date: Fri, 22 Jun 2018 16:34:39 +0100 Subject: [PATCH 287/455] Optimised calculation of survival probability. Atom selections at each frame are now stored as sets rather than lists, so determining the intersection of selections is faster. Survival probability is now calculated by a single function. --- package/MDAnalysis/analysis/waterdynamics.py | 78 +++++--------------- 1 file changed, 19 insertions(+), 59 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index a8dd38d0e76..1f84dfa0a05 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1218,75 +1218,35 @@ def __init__(self, universe, selection, t0, tf, dtmax): def run(self): - """Analyze trajectory and produce timeseries""" + """ + Analyze trajectory and produce timeseries of the survival probability. + """ - # select all frames to an array - selected = self._selection_serial(self.universe, self.selection) + # select all survivors to an array of sets + selected = [] + for ts in self.universe.trajectory[self.t0:self.tf]: + selected.append(set(self.universe.select_atoms(self.selection))) if len(selected) < self.dtmax: - print ("ERROR: Cannot select fewer frames than dtmax") + print("ERROR: Cannot select fewer frames than dtmax") return - for window_size in list(range(1, self.dtmax + 1)): - output = self._getMeanOnePoint(selected, window_size) - self.timeseries.append(output) + for tau in list(range(1, self.dtmax + 1): - def _selection_serial(self, universe, selection_str): - selected = [] - pm = ProgressMeter(self.tf-self.t0, interval=10, - verbose=True, offset=-self.t0) - for ts in universe.trajectory[self.t0:self.tf]: - selected.append(universe.select_atoms(selection_str)) - pm.echo(ts.frame) - return selected + deltaP = [] + for t in range(len(selected) - tau): + Nt = float(len(selected[t])) - def _getMeanOnePoint(self, selected, window_size): - """ - This function gets one point of the plot P(t) vs t. It uses the - _getOneDeltaPoint() function to calculate the average. - """ - n = 0 - sumDeltaP = 0.0 - for frame_no in range(len(selected) - window_size - 1): - delta = self._getOneDeltaPoint(selected, frame_no, window_size) - sumDeltaP += delta - n += 1 - - return sumDeltaP/n - + if Nt == 0: + continue - def _getOneDeltaPoint(self, selected, t, tau): - """ - Gives one point to calculate the mean and - gets one point of the plot C_vect vs t. - - Ex: t=1 and tau=1 calculates - how many selected water molecules survive from the frame 1 to 2 - - Ex: t=5 and tau=3 calculates - how many selected water molecules survive from the frame 5 to 8 - """ + Ntau = len(set.intersection(*selected[t:t+tau] - Nt = len(selected[t]) - if Nt == 0: - return 0 - - # fraction of water molecules that survived - Ntau = self._NumPart_tau(selected, t, tau) - return Ntau/Nt - - - def _NumPart_tau(self, selected, t, tau): - """ - Returns the number of particles that persist from t to t + tau. - """ + # store survival probability at each t + deltaP.append(Ntau / Nt) - survivors = set(selected[t]) - # For optimisation, start from t + tau - for i in range(tau, 0, -1): - next = set(selected[t + i]) - survivors = survivors.intersection(next) - if len(survivors) == 0: - return 0 + # store mean survival probability for each tau + self.timeseries.append(np.mean(np.asarray(deltaP))) - return len(survivors) \ No newline at end of file From 6d35ed9a4901fa5fcf768dbd07072f47fb69b25e Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 22 Jun 2018 17:14:13 +0100 Subject: [PATCH 288/455] Syntax errors --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 1f84dfa0a05..5fcc3923113 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1242,7 +1242,7 @@ def run(self): if Nt == 0: continue - Ntau = len(set.intersection(*selected[t:t+tau] + Ntau = len(set.intersection(*selected[t:t+tau])) # store survival probability at each t deltaP.append(Ntau / Nt) From 99ada4d8678b47fe7d4f8f8ac74a37cf8849f575 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 29 Jun 2018 20:09:37 +0100 Subject: [PATCH 289/455] Changed expected output from 0.0 to Nan. The survival probability is a measure of how likely a selected molecule is to remain within a specified region over a period of time. If at t0 the selected molecule is not in the specified region, no survival probability can be calculated. For example, consider that we would like to calculate the survival probability of an ion at an interface. If the ion never approaches the interface, the previous test would return a survival probability of 0, which suggests that the ion comes to the interface but leaves immediately. However, as the ion was never at the interface, no survival probability can be calculated from this data. --- testsuite/MDAnalysisTests/analysis/test_waterdynamics.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index a4cd5f0e247..3b4abbfe7a3 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -101,8 +101,7 @@ def test_SurvivalProbability_t0Ignored(universe_prot): assert_almost_equal(sp.timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) - def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) sp_zero.run() - assert_almost_equal(sp_zero.timeseries[1], 0.0) + assert np.isnan(sp_zero.timeseries[1]) From 522e7172f95c74436a44a5157f56321243d85877 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 14:37:52 +0100 Subject: [PATCH 290/455] Minor changes: -return the list rather than require the user to access the internal list -use tau_max variable name which is consistent with the equation, in contrast to dtmax --- package/MDAnalysis/analysis/waterdynamics.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 5fcc3923113..7bfd46bd02e 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1208,32 +1208,30 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, t0, tf, dtmax): + def __init__(self, universe, selection, t0, tf, tau_max): self.universe = universe self.selection = selection self.t0 = t0 self.tf = tf - self.dtmax = dtmax - self.timeseries = [] + self.tau_max = tau_max def run(self): """ Analyze trajectory and produce timeseries of the survival probability. """ - + # select all survivors to an array of sets selected = [] - for ts in self.universe.trajectory[self.t0:self.tf]: + for _ in self.universe.trajectory[self.t0:self.tf]: selected.append(set(self.universe.select_atoms(self.selection))) - if len(selected) < self.dtmax: + if len(selected) < self.tau_max: print("ERROR: Cannot select fewer frames than dtmax") return - - for tau in list(range(1, self.dtmax + 1): - + timeseries = [] + for tau in list(range(1, self.tau_max + 1)): deltaP = [] for t in range(len(selected) - tau): @@ -1248,5 +1246,6 @@ def run(self): deltaP.append(Ntau / Nt) # store mean survival probability for each tau - self.timeseries.append(np.mean(np.asarray(deltaP))) + timeseries.append(np.mean(np.asarray(deltaP))) + return timeseries From da0f59482b17193f575e6f9f7be4489b8522d9a8 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 17:05:32 +0100 Subject: [PATCH 291/455] Switch the nested loops. Looping only once over the entire trajectory and more times over tau. This will lead to faster code (local memory/cache optimisation). Additionally, opens the door for combining multiple taus together. --- package/MDAnalysis/analysis/waterdynamics.py | 29 ++++++++------------ 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 7bfd46bd02e..8567b159463 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1200,8 +1200,8 @@ class SurvivalProbability(object): frame where analysis begins tf : int frame where analysis ends - dtmax : int - Maximum dt size, `dtmax` < `tf` or it will crash. + tau_max : int + Maximum dt size, `tau_max` must be < `tf` .. versionadded:: 0.11.0 @@ -1215,10 +1215,9 @@ def __init__(self, universe, selection, t0, tf, tau_max): self.tf = tf self.tau_max = tau_max - def run(self): """ - Analyze trajectory and produce timeseries of the survival probability. + Computes and returns the survival probability timeseries """ # select all survivors to an array of sets @@ -1230,22 +1229,18 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - timeseries = [] - for tau in list(range(1, self.tau_max + 1)): - deltaP = [] - for t in range(len(selected) - tau): + timeseries = [[] for tau in list(range(1, self.tau_max + 1))] + for t in range(len(selected)): + for tau in list(range(1, self.tau_max + 1)): + if tau + t > len(selected) - 1: + break - Nt = float(len(selected[t])) + Nt = len(selected[t]) if Nt == 0: continue - Ntau = len(set.intersection(*selected[t:t+tau])) - - # store survival probability at each t - deltaP.append(Ntau / Nt) - - # store mean survival probability for each tau - timeseries.append(np.mean(np.asarray(deltaP))) - return timeseries + Ntau = len(set.intersection(*selected[t:t + tau])) + timeseries[tau - 1].append( Ntau / float(Nt) ) + return [np.mean(tau_timeseries) for tau_timeseries in timeseries] From cd2abb986d72f2b4240408685a3c54d20c14d075 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 17:12:04 +0100 Subject: [PATCH 292/455] No need to check t+tau for any tau if at t it is empty. --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 8567b159463..5bd7a401372 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1238,7 +1238,7 @@ def run(self): Nt = len(selected[t]) if Nt == 0: - continue + break Ntau = len(set.intersection(*selected[t:t + tau])) timeseries[tau - 1].append( Ntau / float(Nt) ) From 054228bec308924586bbdba1ceb069843e0ad6b3 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 17:38:31 +0100 Subject: [PATCH 293/455] If there is no atom at t, this does not need to be checked for each t+tau. Refactoring. --- package/MDAnalysis/analysis/waterdynamics.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 5bd7a401372..54f9ba50318 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1229,18 +1229,18 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - timeseries = [[] for tau in list(range(1, self.tau_max + 1))] + tau_timeseries = [[] for _ in list(range(1, self.tau_max + 1))] for t in range(len(selected)): - for tau in list(range(1, self.tau_max + 1)): - if tau + t > len(selected) - 1: - break + Nt = len(selected[t]) - Nt = len(selected[t]) + if Nt == 0: + continue - if Nt == 0: + for tau in list(range(1, self.tau_max + 1)): + if tau + t > len(selected) - 1: break Ntau = len(set.intersection(*selected[t:t + tau])) - timeseries[tau - 1].append( Ntau / float(Nt) ) - return [np.mean(tau_timeseries) for tau_timeseries in timeseries] + tau_timeseries[tau - 1].append( Ntau / float(Nt) ) + return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] From 3928107359a5b4d807c42373cf935df2b21c5e31 Mon Sep 17 00:00:00 2001 From: mat Date: Sun, 1 Jul 2018 19:58:49 +0100 Subject: [PATCH 294/455] Should the first data point be always 1? In that case first tau = 0. Or should the first data point reflect the first tau which is non-zero and therefore the first change is quantified? I believe it is the latter. This breaks the current tests which, for example, by asking for 4 datapoints, always get the first datapoint for tau=0 that is 1. --- package/MDAnalysis/analysis/waterdynamics.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 54f9ba50318..3f12412d2dd 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1236,11 +1236,14 @@ def run(self): if Nt == 0: continue + survivors = set(selected[t]) + for tau in list(range(1, self.tau_max + 1)): if tau + t > len(selected) - 1: break - Ntau = len(set.intersection(*selected[t:t + tau])) + survivors = survivors.intersection(set(selected[t + tau])) + Ntau = len(survivors) tau_timeseries[tau - 1].append( Ntau / float(Nt) ) return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] From 3cc426d7c8a1218a275b5ebf24fef737e1e0ed7e Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 11:25:12 +0100 Subject: [PATCH 295/455] Using the set.intersection argument unpacking: easier to read, neater code and no performance drawbacks. Tests: the user should not be forced to rely on the internal data structures .timeseries. Returning the results with the function run(). --- package/MDAnalysis/analysis/waterdynamics.py | 5 +---- .../MDAnalysisTests/analysis/test_waterdynamics.py | 12 ++++++------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 3f12412d2dd..54f9ba50318 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1236,14 +1236,11 @@ def run(self): if Nt == 0: continue - survivors = set(selected[t]) - for tau in list(range(1, self.tau_max + 1)): if tau + t > len(selected) - 1: break - survivors = survivors.intersection(set(selected[t + tau])) - Ntau = len(survivors) + Ntau = len(set.intersection(*selected[t:t + tau])) tau_timeseries[tau - 1].append( Ntau / float(Nt) ) return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 3b4abbfe7a3..233bd225789 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -91,17 +91,17 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): def test_SurvivalProbability(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 0, 10, 4) - sp.run() - assert_almost_equal(sp.timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) + timeseries = sp.run() + assert_almost_equal(timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) def test_SurvivalProbability_t0Ignored(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 10, 4) - sp.run() - assert_almost_equal(sp.timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) + timeseries = sp.run() + assert_almost_equal(timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) - sp_zero.run() - assert np.isnan(sp_zero.timeseries[1]) + timeseries = sp_zero.run() + assert np.isnan(timeseries[1]) From 01e6fec9061cd97b781b2a3298eb40da0ecd3111 Mon Sep 17 00:00:00 2001 From: p-j-smith Date: Tue, 3 Jul 2018 14:01:58 +0100 Subject: [PATCH 296/455] Returning the survival probability and the values of tau as numpy arrays. Changed the name of tau_timeseries to sp_timeseries as it is a more accurate descriptor. Removed some of the +/- 1 in indices to improve readability. --- package/MDAnalysis/analysis/waterdynamics.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 54f9ba50318..0f05ab207cf 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -412,6 +412,8 @@ """ from __future__ import print_function, division, absolute_import + +from numpy.core.multiarray import ndarray from six.moves import range, zip_longest import numpy as np @@ -1229,18 +1231,21 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - tau_timeseries = [[] for _ in list(range(1, self.tau_max + 1))] + tau_timeseries = np.arange(1, tau_max + 1) + sp_timeseries = [[] for _ in range(self.tau_max)] + for t in range(len(selected)): Nt = len(selected[t]) if Nt == 0: continue - for tau in list(range(1, self.tau_max + 1)): - if tau + t > len(selected) - 1: + for tau in tau_timeseries: + if t + tau > len(selected): break Ntau = len(set.intersection(*selected[t:t + tau])) - tau_timeseries[tau - 1].append( Ntau / float(Nt) ) - return [np.mean(tau_timeseries) for tau_timeseries in tau_timeseries] + sp_timeseries[tau - 1].append(Ntau / float(Nt) ) + + return np.asarray(np.mean(sp) for sp in sp_timeseries), tau_timeseries From 7cf8318b2465d8dc14f30caedf57aed412d2f6ac Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 14:37:03 +0100 Subject: [PATCH 297/455] Adjusting the tests because the return function gives back taus too. --- package/MDAnalysis/analysis/waterdynamics.py | 6 +++--- testsuite/MDAnalysisTests/analysis/test_waterdynamics.py | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 0f05ab207cf..1c45f8e0f40 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1231,7 +1231,7 @@ def run(self): print("ERROR: Cannot select fewer frames than dtmax") return - tau_timeseries = np.arange(1, tau_max + 1) + tau_timeseries = np.arange(1, self.tau_max + 1) sp_timeseries = [[] for _ in range(self.tau_max)] for t in range(len(selected)): @@ -1244,8 +1244,8 @@ def run(self): if t + tau > len(selected): break - Ntau = len(set.intersection(*selected[t:t + tau])) + Ntau = len(set.intersection(*selected[t:t + tau + 1])) sp_timeseries[tau - 1].append(Ntau / float(Nt) ) - return np.asarray(np.mean(sp) for sp in sp_timeseries), tau_timeseries + return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 233bd225789..50ae28125a9 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -91,17 +91,18 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): def test_SurvivalProbability(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 0, 10, 4) - timeseries = sp.run() + taus, timeseries = sp.run() + print (timeseries) assert_almost_equal(timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) def test_SurvivalProbability_t0Ignored(universe_prot): sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 10, 4) - timeseries = sp.run() + taus, timeseries = sp.run() assert_almost_equal(timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) - timeseries = sp_zero.run() + taus, timeseries = sp_zero.run() assert np.isnan(timeseries[1]) From d8f4a60f9795d859c37490113a9c244140516b72 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 16:36:32 +0100 Subject: [PATCH 298/455] Moving the checks to the constructor. Saving the extracted data for the user to be able to dig deeper, if necessary. --- package/MDAnalysis/analysis/waterdynamics.py | 26 +++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 1c45f8e0f40..7c6805cef7f 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1210,30 +1210,35 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, t0, tf, tau_max): + def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20): self.universe = universe self.selection = selection self.t0 = t0 - self.tf = tf + if tf == -1: + self.tf = len(universe.trajectory) + else: + self.tf = tf self.tau_max = tau_max + if tf - t0 <= self.tau_max: + raise ValueError("ERROR: Cannot select fewer frames than tau_max + 1") + + """ + FIXME - definition explaining each argument + """ + def run(self): """ Computes and returns the survival probability timeseries """ - # select all survivors to an array of sets + # load all frames to an array of sets selected = [] for _ in self.universe.trajectory[self.t0:self.tf]: selected.append(set(self.universe.select_atoms(self.selection))) - if len(selected) < self.tau_max: - print("ERROR: Cannot select fewer frames than dtmax") - return - tau_timeseries = np.arange(1, self.tau_max + 1) sp_timeseries = [[] for _ in range(self.tau_max)] - for t in range(len(selected)): Nt = len(selected[t]) @@ -1241,11 +1246,14 @@ def run(self): continue for tau in tau_timeseries: - if t + tau > len(selected): + if t + tau > len(selected) - 1: break Ntau = len(set.intersection(*selected[t:t + tau + 1])) sp_timeseries[tau - 1].append(Ntau / float(Nt) ) + # user can investigate the distribution and sample size + self.sp_timeseries = sp_timeseries + return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] From b5d07e9c71ae9fbfbd8c778804f4bc4c31076fc1 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 17:13:27 +0100 Subject: [PATCH 299/455] verbose mode added + better documentation. --- package/MDAnalysis/analysis/waterdynamics.py | 35 +++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 7c6805cef7f..e575c667933 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1210,22 +1210,40 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20): + def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): + """ + FIXME - definition explaining each argument + tf is inclusive + + Return: + taus, sp_timeseries + + Special: + :param universe: + :param selection: + :param t0: First frame to be analysed + :param tf: Last frame to be analysed (must be below the max number of frames) + :param tau_max: The last tau to be calculated (inclusive), starts from 1 + :param verbose: If True, will highlight the starting point, ending point, progress + """ self.universe = universe self.selection = selection self.t0 = t0 if tf == -1: - self.tf = len(universe.trajectory) - else: + self.tf = len(universe.trajectory) - 1 + elif tf <= len(universe.trajectory): self.tf = tf + else: + raise ValueError("tf cannot be bigger than the number of frames in the simulation") self.tau_max = tau_max + self.verbose = verbose if tf - t0 <= self.tau_max: - raise ValueError("ERROR: Cannot select fewer frames than tau_max + 1") + raise ValueError("cannot select fewer frames than tau_max + 1") - """ - FIXME - definition explaining each argument - """ + def print(self, *args): + if self.verbose: + print(args) def run(self): """ @@ -1243,10 +1261,11 @@ def run(self): Nt = len(selected[t]) if Nt == 0: + self.print("At t=", t, "the selection did not find any molecule. Moving on to the next frame") continue for tau in tau_timeseries: - if t + tau > len(selected) - 1: + if t + tau > len(selected) - 1 - 1: break Ntau = len(set.intersection(*selected[t:t + tau + 1])) From d348cc783e70d836c57fba7e77b587ed9f52337a Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 3 Jul 2018 17:32:22 +0100 Subject: [PATCH 300/455] The tf is inclusive. --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index e575c667933..b618b72644c 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1265,7 +1265,7 @@ def run(self): continue for tau in tau_timeseries: - if t + tau > len(selected) - 1 - 1: + if t + tau > len(selected): break Ntau = len(set.intersection(*selected[t:t + tau + 1])) From 0ef10576c096ad5accf3bd49c506053fd86b8271 Mon Sep 17 00:00:00 2001 From: p-j-smith Date: Thu, 5 Jul 2018 12:24:03 +0100 Subject: [PATCH 301/455] Storing a set of atom ids at each timestep, rather than a set containing an atom group, to reduce the memory load. Updated the docstring. --- package/MDAnalysis/analysis/waterdynamics.py | 51 +++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index b618b72644c..9dcf27f815e 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1199,47 +1199,39 @@ class SurvivalProbability(object): define the region/zone where to analyze, e.g.: "selection_a" and "zone" (see `SP-examples`_ ) t0 : int - frame where analysis begins + Zero-based index of the first frame to be analysed tf : int - frame where analysis ends + Zero-based index of the last frame to be analysed (inclusive) tau_max : int - Maximum dt size, `tau_max` must be < `tf` + Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + verbose : Boolean + If True, prints progress and comments to the console. + Returns + ------- + tau_timeseries : list + tau from 1 to tau_max + sp_timeseries : list + survival probability for each value of `tau` .. versionadded:: 0.11.0 """ def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): - """ - FIXME - definition explaining each argument - tf is inclusive - - Return: - taus, sp_timeseries - - Special: - :param universe: - :param selection: - :param t0: First frame to be analysed - :param tf: Last frame to be analysed (must be below the max number of frames) - :param tau_max: The last tau to be calculated (inclusive), starts from 1 - :param verbose: If True, will highlight the starting point, ending point, progress - """ + + if tf >= len(universe.trajectory): + raise ValueError("\"end\" must be smaller than the number of frames in the trajectory.") + self.universe = universe self.selection = selection self.t0 = t0 - if tf == -1: - self.tf = len(universe.trajectory) - 1 - elif tf <= len(universe.trajectory): - self.tf = tf - else: - raise ValueError("tf cannot be bigger than the number of frames in the simulation") + self.tf = len(universe.trajectory[:tf]) + 1 self.tau_max = tau_max self.verbose = verbose - if tf - t0 <= self.tau_max: - raise ValueError("cannot select fewer frames than tau_max + 1") + if self.tau_max > self.tf - self.t0: + raise ValueError("Too few frames selected for given tau_max.") def print(self, *args): if self.verbose: @@ -1253,15 +1245,16 @@ def run(self): # load all frames to an array of sets selected = [] for _ in self.universe.trajectory[self.t0:self.tf]: - selected.append(set(self.universe.select_atoms(self.selection))) + selected.append(set(self.universe.select_atoms(self.selection).ids)) - tau_timeseries = np.arange(1, self.tau_max + 1) + tau_timeseries = list(range(1, self.tau_max + 1)) sp_timeseries = [[] for _ in range(self.tau_max)] + for t in range(len(selected)): Nt = len(selected[t]) if Nt == 0: - self.print("At t=", t, "the selection did not find any molecule. Moving on to the next frame") + self.print("At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) continue for tau in tau_timeseries: From 8470c4ca83127638ef002939e0de2269000772a6 Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 5 Jul 2018 17:02:22 +0100 Subject: [PATCH 302/455] tiny bug --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 9dcf27f815e..652d82ba3f2 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1226,7 +1226,7 @@ def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): self.universe = universe self.selection = selection self.t0 = t0 - self.tf = len(universe.trajectory[:tf]) + 1 + self.tf = len(list(universe.trajectory[:tf])) + 1 self.tau_max = tau_max self.verbose = verbose From 40e926d3e17cfc99078327f5d834bfdbc8630a36 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 17 Jul 2018 19:03:19 +0100 Subject: [PATCH 303/455] Check if all tau == 1 when the same atom IDs are returned at each frame --- .../analysis/test_waterdynamics.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 50ae28125a9..f483c231656 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -22,12 +22,14 @@ from __future__ import print_function, absolute_import import MDAnalysis from MDAnalysis.analysis import waterdynamics -import pytest from MDAnalysisTests.datafiles import waterPSF, waterDCD from MDAnalysisTests.datafiles import PDB, XTC +import pytest import numpy as np +from mock import patch +from mock import Mock from numpy.testing import assert_almost_equal SELECTION1 = "byres name OH2" @@ -106,3 +108,14 @@ def test_SurvivalProbability_zeroMolecules(universe): sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) taus, timeseries = sp_zero.run() assert np.isnan(timeseries[1]) + + +def test_SurvivalProbability_alwaysPresent(universe): + with patch.object(universe, 'select_atoms') as select_atoms_mock: + select_atoms_mock.return_value = returned_mock_atom_group = Mock() + # fake atom IDs - always the same + returned_mock_atom_group.ids = [7, 8, 1, 9] + + sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) + taus, timeseries = sp.run() + assert np.array_equal(timeseries, [1.0, 1.0, 1.0]) \ No newline at end of file From c66f3dbf48f832c3eee87f02be552861a1407516 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 17 Jul 2018 19:41:47 +0100 Subject: [PATCH 304/455] Mock data for the test case. --- .../MDAnalysisTests/analysis/test_waterdynamics.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index f483c231656..eff70eb08bc 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -105,9 +105,14 @@ def test_SurvivalProbability_t0Ignored(universe_prot): def test_SurvivalProbability_zeroMolecules(universe): - sp_zero = waterdynamics.SurvivalProbability(universe, SELECTION2, 0, 6, 3) - taus, timeseries = sp_zero.run() - assert np.isnan(timeseries[1]) + with patch.object(universe, 'select_atoms') as select_atoms_mock: + select_atoms_mock.return_value = returned_mock_atom_group = Mock() + # fake atom IDs - always the same + returned_mock_atom_group.ids = [] + + sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) + taus, timeseries = sp.run() + assert all(np.isnan(timeseries)) def test_SurvivalProbability_alwaysPresent(universe): @@ -118,4 +123,4 @@ def test_SurvivalProbability_alwaysPresent(universe): sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) taus, timeseries = sp.run() - assert np.array_equal(timeseries, [1.0, 1.0, 1.0]) \ No newline at end of file + assert all(np.equal(timeseries, 1)) \ No newline at end of file From ab21e39ef2773c33fe0ec41bbc5d598bae135745 Mon Sep 17 00:00:00 2001 From: mat Date: Wed, 18 Jul 2018 14:06:58 +0100 Subject: [PATCH 305/455] Simple test that checks for the known Survival Probability. Waterdynamics: removed an index bug that went 1 too high tau. --- package/MDAnalysis/analysis/waterdynamics.py | 2 +- .../analysis/test_waterdynamics.py | 29 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 652d82ba3f2..780bcdb473d 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1258,7 +1258,7 @@ def run(self): continue for tau in tau_timeseries: - if t + tau > len(selected): + if t + tau >= len(selected): break Ntau = len(set.intersection(*selected[t:t + tau + 1])) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index eff70eb08bc..79218724e15 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -91,25 +91,25 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): assert_almost_equal(msd_zero.timeseries[1], 0.0) -def test_SurvivalProbability(universe_prot): - sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 0, 10, 4) +def test_SurvivalProbability_t0Ignored(universe_prot): + sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 9, 4) taus, timeseries = sp.run() - print (timeseries) - assert_almost_equal(timeseries, [1.0, 0.354, 0.267, 0.242], decimal=3) + assert_almost_equal(timeseries, [0.37 , 0.282, 0.258, 0.252], decimal=3) -def test_SurvivalProbability_t0Ignored(universe_prot): - sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 10, 4) - taus, timeseries = sp.run() - assert_almost_equal(timeseries, [1.0, 0.391, 0.292, 0.261], decimal=3) +def test_SurvivalProbability_checkMockGen(universe): + with patch.object(universe, 'select_atoms') as select_atoms_mock: + ids = [(9, 8, 7), (8, 7, 6), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] + select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set + sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) + taus, timeseries = sp.run() + assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) def test_SurvivalProbability_zeroMolecules(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: - select_atoms_mock.return_value = returned_mock_atom_group = Mock() - # fake atom IDs - always the same - returned_mock_atom_group.ids = [] - + # no atom IDs found + select_atoms_mock.return_value = Mock(ids=[]) sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) taus, timeseries = sp.run() assert all(np.isnan(timeseries)) @@ -117,9 +117,8 @@ def test_SurvivalProbability_zeroMolecules(universe): def test_SurvivalProbability_alwaysPresent(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: - select_atoms_mock.return_value = returned_mock_atom_group = Mock() - # fake atom IDs - always the same - returned_mock_atom_group.ids = [7, 8, 1, 9] + # always the same atom IDs found + select_atoms_mock.return_value = Mock(ids=[7, 8, 1, 9]) sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) taus, timeseries = sp.run() From a53a6736db3adafa0bdb4d05912a749815e8d2e4 Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 19 Jul 2018 00:23:36 +0100 Subject: [PATCH 306/455] Defined dataset for the test case t0 != 0. The code will be correct if the first two frames are skipped. --- .../analysis/test_waterdynamics.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 79218724e15..b9e4b44dea9 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -34,7 +34,6 @@ SELECTION1 = "byres name OH2" SELECTION2 = "byres name P1" -SELECTION3 = "around 4 (resid 151 and name OE1)" @pytest.fixture(scope='module') @@ -42,11 +41,6 @@ def universe(): return MDAnalysis.Universe(waterPSF, waterDCD) -@pytest.fixture(scope='module') -def universe_prot(): - return MDAnalysis.Universe(PDB, XTC) - - def test_HydrogenBondLifetimes(universe): hbl = waterdynamics.HydrogenBondLifetimes( universe, SELECTION1, SELECTION1, 0, 5, 3) @@ -91,13 +85,16 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): assert_almost_equal(msd_zero.timeseries[1], 0.0) -def test_SurvivalProbability_t0Ignored(universe_prot): - sp = waterdynamics.SurvivalProbability(universe_prot, SELECTION3, 3, 9, 4) - taus, timeseries = sp.run() - assert_almost_equal(timeseries, [0.37 , 0.282, 0.258, 0.252], decimal=3) +def test_SurvivalProbability_t0Ignored(universe): + with patch.object(universe, 'select_atoms') as select_atoms_mock: + ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] + select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set + sp = waterdynamics.SurvivalProbability(universe, "", 2, 6, 3) + taus, timeseries = sp.run() + assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) -def test_SurvivalProbability_checkMockGen(universe): +def test_SurvivalProbability_definedTaus(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: ids = [(9, 8, 7), (8, 7, 6), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set From 9a208469acb19d7b5d20e17249d57360995d4c54 Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 19 Jul 2018 00:40:40 +0100 Subject: [PATCH 307/455] t0 testcase covers also tf. If one too many frames is used, wrong results will be given. --- testsuite/MDAnalysisTests/analysis/test_waterdynamics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index b9e4b44dea9..a4ada7d5730 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -85,10 +85,10 @@ def test_MeanSquareDisplacement_zeroMolecules(universe): assert_almost_equal(msd_zero.timeseries[1], 0.0) -def test_SurvivalProbability_t0Ignored(universe): +def test_SurvivalProbability_t0tf(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: - ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] - select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set + ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1), (0, )] + select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop(2)) # atom IDs fed set by set sp = waterdynamics.SurvivalProbability(universe, "", 2, 6, 3) taus, timeseries = sp.run() assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) From 9f8c677cf223fca491e13d950d83e3d6343b7961 Mon Sep 17 00:00:00 2001 From: mat Date: Mon, 23 Jul 2018 15:35:50 +0100 Subject: [PATCH 308/455] Trailing lines --- package/MDAnalysis/analysis/waterdynamics.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 780bcdb473d..d497f3d5cbd 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1267,5 +1267,4 @@ def run(self): # user can investigate the distribution and sample size self.sp_timeseries = sp_timeseries - return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] - + return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] \ No newline at end of file From c01c9942e303bf71668f4be3a1921f3588b67438 Mon Sep 17 00:00:00 2001 From: mat Date: Mon, 23 Jul 2018 15:42:17 +0100 Subject: [PATCH 309/455] Author and changelog updated. --- package/AUTHORS | 1 + package/CHANGELOG | 8 +++++--- testsuite/AUTHORS | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/package/AUTHORS b/package/AUTHORS index 1015e5bce8e..2b915642ee1 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -98,6 +98,7 @@ Chronological list of authors 2018 - Nabarun Pal - Mateusz Bieniek + - Paul Smith - Navya Khare - Johannes Zeman - Ayush Suhane diff --git a/package/CHANGELOG b/package/CHANGELOG index 05e9b078d1c..17f65f70515 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,9 +20,9 @@ The rules for this file: Enhancements - * Added augment functionality to create relevant images of particles + * Added augment functionality to create relevant images of particles in the vicinity of central cell to handle periodic boundary - conditions (PR #1977) + conditions (PR #1977) * Added lib.distances.capped_distance function to quickly calculate all distances up to a given maximum distance (PR #1941) * Added a rotation coordinate transformation (PR #1937) @@ -51,7 +51,7 @@ Enhancements generated with gromacs -noappend (PR #1728) * MDAnalysis.lib.mdamath now supports triclinic boxes and rewrote in Cython (PR #1965) * AtomGroup.write can write a trajectory of selected frames (Issue #1037) - * Added dihedrals.py with Ramachandran class to analysis module + * Added dihedrals.py with Ramachandran class to analysis module Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) @@ -78,6 +78,8 @@ Changes duplicates. Otherwise, the group itself is returned. Repeated access of *Group.unique will always return the same object unless the group is updated or modified. (PR #1922) + * SurvivalProbability does not dilute SP anymore when the reference frame (t0) + cannot find any molecules in the first place. (PR #1995) * The TPR parser reads SETTLE constraints as bonds. (Issue #1949) * Indexing a trajectory with a slice or an array now returns an iterable (Issue #1894) diff --git a/testsuite/AUTHORS b/testsuite/AUTHORS index 32fb9b8fbed..908a5d2a0f1 100644 --- a/testsuite/AUTHORS +++ b/testsuite/AUTHORS @@ -84,6 +84,8 @@ Chronological list of authors 2018 - Johannes Zeman - Ayush Suhane + - Paul Smith + - Mateusz Bieniek External code From 036ccc6925d0d1ae4b52e34bc007efa92d9a5a18 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 24 Jul 2018 15:36:52 +0100 Subject: [PATCH 310/455] Documentation and requested changes PR #1995. --- package/CHANGELOG | 4 + package/MDAnalysis/analysis/waterdynamics.py | 124 ++++++++++--------- 2 files changed, 68 insertions(+), 60 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 17f65f70515..ef9a608d4b0 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,7 +14,11 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, +<<<<<<< HEAD VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull +======= + VOD555, davidercruz, bieniekmateusz, p-j-smith +>>>>>>> Documentation and requested changes PR #1995. * 0.18.1 diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index d497f3d5cbd..f5df6bc725b 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -283,23 +283,22 @@ import MDAnalysis from MDAnalysis.analysis.waterdynamics import SurvivalProbability as SP + import matplotlib.pyplot as plt - u = MDAnalysis.Universe(pdb, trajectory) + universe = MDAnalysis.Universe(pdb, trajectory) selection = "byres name OH2 and sphzone 12.3 (resid 42 or resid 26 or resid 34 or resid 80) " - SP_analysis = SP(universe, selection, 0, 100, 20) - SP_analysis.run() - #now we print data ready to graph. The graph - #represents SP vs t - time = 0 - for sp in SP_analysis.timeseries: - print("{time} {sp}".format(time=time, sp=sp)) - time += 1 + sp = SP(universe, selection, verbose=True) + taus, sp_timeseries = sp.run(start=0, stop=100, tau_max=20) - #Plot - plt.xlabel('time') + # print in console + for tau, sp in zip(taus, sp_timeseries): + print("{time} {sp}".format(time=tau, sp=sp)) + + # plot + plt.xlabel('Time') plt.ylabel('SP') plt.title('Survival Probability') - plt.plot(range(0,time),MSD_analysis.timeseries) + plt.plot(taus, sp_timeseries) plt.show() @@ -376,16 +375,13 @@ SurvivalProbability ~~~~~~~~~~~~~~~~~~~ -Survival Probability (SP) data is returned in a list, which each element -represents a SP value in its respective window timestep. Data is stored in -:attr:`SurvivalProbability.timeseries`:: - - results = [ - # SP values order by window timestep - , , ... - ] +Survival Probability (SP) returns two lists: a list of taus and a list of their corresponding mean survival +probabilities. Additionally, a list :attr:`SurvivalProbability.sp_timeseries` is provided which contains +a list of SPs for each tau. This provides the number of datapoints gathered and the distribution. + results = [ tau1, tau2, ..., tau_n ], [ sp_tau1, sp_tau2, ..., sp_tau_n] +Additionally, for each Classes -------- @@ -413,7 +409,6 @@ """ from __future__ import print_function, division, absolute_import -from numpy.core.multiarray import ndarray from six.moves import range, zip_longest import numpy as np @@ -1187,7 +1182,8 @@ class SurvivalProbability(object): P(\tau) = \frac1T \sum_{t=1}^T \frac{N(t,t+\tau)}{N(t)} where :math:`T` is the maximum time of simulation, :math:`\tau` is the - timestep and :math:`N` the number of particles in certain time. + timestep, :math:`N(t)` the number of particles at time t, and + :math:`N(t, t+\tau)` is the number of particles at every frame from t to `\tau`. Parameters @@ -1196,73 +1192,81 @@ class SurvivalProbability(object): Universe object selection : str Selection string; any selection is allowed. With this selection you - define the region/zone where to analyze, e.g.: "selection_a" and "zone" - (see `SP-examples`_ ) - t0 : int - Zero-based index of the first frame to be analysed - tf : int - Zero-based index of the last frame to be analysed (inclusive) - tau_max : int - Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + define the region/zone where to analyze, e.g.: "resname SOL and around 5 (resname LIPID)" + and "resname ION and around 10 (resid 20)" (see `SP-examples`_ ) verbose : Boolean If True, prints progress and comments to the console. - Returns - ------- - tau_timeseries : list - tau from 1 to tau_max - sp_timeseries : list - survival probability for each value of `tau` - .. versionadded:: 0.11.0 """ - def __init__(self, universe, selection, t0=0, tf=-1, tau_max=20, verbose=False): - - if tf >= len(universe.trajectory): - raise ValueError("\"end\" must be smaller than the number of frames in the trajectory.") - + def __init__(self, universe, selection, verbose=False): self.universe = universe self.selection = selection - self.t0 = t0 - self.tf = len(list(universe.trajectory[:tf])) + 1 - self.tau_max = tau_max self.verbose = verbose - if self.tau_max > self.tf - self.t0: - raise ValueError("Too few frames selected for given tau_max.") - def print(self, *args): if self.verbose: print(args) - def run(self): + def run(self, tau_max, start=0, stop=-1, step=1): """ Computes and returns the survival probability timeseries + + Parameters + ---------- + start : int + Zero-based index of the first frame to be analysed + stop : int + Zero-based index of the last frame to be analysed (inclusive) + step : int + Jump every `step`'th frame + tau_max : int + Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + + Returns + ------- + tau_timeseries : list + tau from 1 to tau_max + sp_timeseries : list + survival probability for each value of `tau` """ - + + if stop >= len(self.universe.trajectory): + raise ValueError("\"stop\" must be smaller than the number of frames in the trajectory.") + + if stop == -1: + stop = self.universe.trajectory[-1].frame + 1 + else: + stop = stop + 1 + + if tau_max > (stop - start): + raise ValueError("Too few frames selected for given tau_max.") + # load all frames to an array of sets - selected = [] - for _ in self.universe.trajectory[self.t0:self.tf]: - selected.append(set(self.universe.select_atoms(self.selection).ids)) + selected_ids = [] + for ts in self.universe.trajectory[start:stop]: + self.print("Loading frame:", ts) + selected_ids.append(set(self.universe.select_atoms(self.selection).ids)) - tau_timeseries = list(range(1, self.tau_max + 1)) - sp_timeseries = [[] for _ in range(self.tau_max)] + tau_timeseries = np.arange(1, tau_max + 1) + sp_timeseries = [[] for _ in range(tau_max)] - for t in range(len(selected)): - Nt = len(selected[t]) + for t in range(0, len(selected_ids), step): + Nt = len(selected_ids[t]) if Nt == 0: self.print("At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) continue for tau in tau_timeseries: - if t + tau >= len(selected): + if t + tau >= len(selected_ids): break - Ntau = len(set.intersection(*selected[t:t + tau + 1])) - sp_timeseries[tau - 1].append(Ntau / float(Nt) ) + # ids that survive from t to t + tau and at every frame in between + Ntau = len(set.intersection(*selected_ids[t:t + tau + 1])) + sp_timeseries[tau - 1].append(Ntau / float(Nt)) # user can investigate the distribution and sample size self.sp_timeseries = sp_timeseries From 4b1ee1403f5b8a5a1aaf11d049453e4728c8a2e5 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 24 Jul 2018 15:41:47 +0100 Subject: [PATCH 311/455] Tests adjusted to the new interface. --- .../analysis/test_waterdynamics.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index a4ada7d5730..3ff8c3faa4d 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -89,8 +89,8 @@ def test_SurvivalProbability_t0tf(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1), (0, )] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop(2)) # atom IDs fed set by set - sp = waterdynamics.SurvivalProbability(universe, "", 2, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=2, stop=6) assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) @@ -98,8 +98,8 @@ def test_SurvivalProbability_definedTaus(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: ids = [(9, 8, 7), (8, 7, 6), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set - sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=0, stop=6) assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) @@ -107,16 +107,16 @@ def test_SurvivalProbability_zeroMolecules(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: # no atom IDs found select_atoms_mock.return_value = Mock(ids=[]) - sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=3, stop=6) assert all(np.isnan(timeseries)) def test_SurvivalProbability_alwaysPresent(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: # always the same atom IDs found - select_atoms_mock.return_value = Mock(ids=[7, 8, 1, 9]) + select_atoms_mock.return_value = Mock(ids=[7, 8]) - sp = waterdynamics.SurvivalProbability(universe, "", 0, 6, 3) - taus, timeseries = sp.run() + sp = waterdynamics.SurvivalProbability(universe, "") + taus, timeseries = sp.run(tau_max=3, start=0, stop=6) assert all(np.equal(timeseries, 1)) \ No newline at end of file From 2c36f371b42f70d5e3adc806d138952b73721b23 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 24 Jul 2018 17:44:24 +0100 Subject: [PATCH 312/455] Conforming to the run() interface defined in #1463. --- package/MDAnalysis/analysis/waterdynamics.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index f5df6bc725b..61acc756326 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1206,11 +1206,13 @@ def __init__(self, universe, selection, verbose=False): self.selection = selection self.verbose = verbose - def print(self, *args): + def print(self, verbose, *args): if self.verbose: print(args) + elif verbose: + print(args) - def run(self, tau_max, start=0, stop=-1, step=1): + def run(self, tau_max, start=0, stop=-1, step=1, verbose=False): """ Computes and returns the survival probability timeseries @@ -1224,6 +1226,8 @@ def run(self, tau_max, start=0, stop=-1, step=1): Jump every `step`'th frame tau_max : int Survival probability is calculated for the range :math:`1 <= \tau <= tau_max` + verbose : Boolean + Overwrite the constructor's verbosity Returns ------- @@ -1247,7 +1251,7 @@ def run(self, tau_max, start=0, stop=-1, step=1): # load all frames to an array of sets selected_ids = [] for ts in self.universe.trajectory[start:stop]: - self.print("Loading frame:", ts) + self.print(verbose, "Loading frame:", ts) selected_ids.append(set(self.universe.select_atoms(self.selection).ids)) tau_timeseries = np.arange(1, tau_max + 1) @@ -1257,7 +1261,8 @@ def run(self, tau_max, start=0, stop=-1, step=1): Nt = len(selected_ids[t]) if Nt == 0: - self.print("At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) + self.print(verbose, + "At frame {} the selection did not find any molecule. Moving on to the next frame".format(t)) continue for tau in tau_timeseries: From 5988f96be2ec5b1968158607a8cf585b288ca778 Mon Sep 17 00:00:00 2001 From: mat Date: Wed, 25 Jul 2018 01:53:19 +0100 Subject: [PATCH 313/455] Backward compatibility (and priority) with warnings. --- package/MDAnalysis/analysis/waterdynamics.py | 26 ++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 61acc756326..f7348a4b192 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -409,6 +409,8 @@ """ from __future__ import print_function, division, absolute_import +import warnings + from six.moves import range, zip_longest import numpy as np @@ -1201,18 +1203,32 @@ class SurvivalProbability(object): """ - def __init__(self, universe, selection, verbose=False): + def __init__(self, universe, selection, t0=None, tf=None, dtmax=None, verbose=False): self.universe = universe self.selection = selection self.verbose = verbose + # backward compatibility + self.start = self.stop = self.tau_max = None + if t0 is not None: + self.start = t0 + warnings.warn("t0 is deprecated, use run(start=t0) instead", category=DeprecationWarning) + + if tf is not None: + self.stop = tf + warnings.warn("tf is deprecated, use run(stop=tf) instead", category=DeprecationWarning) + + if dtmax is not None: + self.tau_max = dtmax + warnings.warn("dtmax is deprecated, use run(tau_max=dtmax) instead", category=DeprecationWarning) + def print(self, verbose, *args): if self.verbose: print(args) elif verbose: print(args) - def run(self, tau_max, start=0, stop=-1, step=1, verbose=False): + def run(self, tau_max=20, start=0, stop=-1, step=1, verbose=False): """ Computes and returns the survival probability timeseries @@ -1237,6 +1253,12 @@ def run(self, tau_max, start=0, stop=-1, step=1, verbose=False): survival probability for each value of `tau` """ + # backward compatibility (and priority) + start = self.start if self.start is not None else start + stop = self.stop if self.stop is not None else stop + tau_max = self.tau_max if self.tau_max is not None else tau_max + + # sanity checks if stop >= len(self.universe.trajectory): raise ValueError("\"stop\" must be smaller than the number of frames in the trajectory.") From 46a7f69208b9bba747310e8a978578c28b201561 Mon Sep 17 00:00:00 2001 From: mat Date: Sat, 28 Jul 2018 16:41:08 +0100 Subject: [PATCH 314/455] Rebased and resolved conflict with CHANGELOG --- package/CHANGELOG | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index ef9a608d4b0..379a370dacb 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,11 +14,8 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, -<<<<<<< HEAD - VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull -======= - VOD555, davidercruz, bieniekmateusz, p-j-smith ->>>>>>> Documentation and requested changes PR #1995. + VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull, bieniekmateusz, + p-j-smith * 0.18.1 From e60b268f279b93210f19456b0a5738a1c8aae4e4 Mon Sep 17 00:00:00 2001 From: Davide Cruz Date: Sat, 28 Jul 2018 17:02:39 +0100 Subject: [PATCH 315/455] Improved docs; test point and vector in 2 shapes --- package/MDAnalysis/transformations/rotate.py | 29 +++++++++-------- .../trajectory_transformations.rst | 1 + .../transformations/rotate.rst | 1 + .../transformations/test_rotate.py | 32 ++++++++++++++++--- 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 package/doc/sphinx/source/documentation_pages/transformations/rotate.rst diff --git a/package/MDAnalysis/transformations/rotate.py b/package/MDAnalysis/transformations/rotate.py index b16292d7ca0..ce6df7b8e26 100644 --- a/package/MDAnalysis/transformations/rotate.py +++ b/package/MDAnalysis/transformations/rotate.py @@ -21,12 +21,14 @@ # """\ -Rotate trajectory --- :mod:`MDAnalysis.transformations.translate` -================================================================= +Trajectory rotation --- :mod:`MDAnalysis.transformations.rotate` +================================================================ Rotates the coordinates by a given angle arround an axis formed by a direction and a point - + +.. autofunction:: rotateby + """ from __future__ import absolute_import @@ -41,8 +43,8 @@ def rotateby(angle, direction, point=None, ag=None, weights=None, wrap=False): ''' Rotates the trajectory by a given angle on a given axis. The axis is defined by the user, combining the direction vector and a point. This point can be the center - of geometry or the center of mass of a user defined AtomGroup, or a list defining custom - coordinates. + of geometry or the center of mass of a user defined AtomGroup, or an array defining + custom coordinates. Examples -------- @@ -74,10 +76,14 @@ def rotateby(angle, direction, point=None, ag=None, weights=None, wrap=False): rotation angle in degrees direction: array-like vector that will define the direction of a custom axis of rotation from the - provided point. + provided point. Expected shapes are (3, ) or (1, 3). ag: AtomGroup, optional - use the eighted center of an AtomGroup as the point from where the rotation axis - will be defined + use the weighted center of an AtomGroup as the point from where the rotation axis + will be defined. If no AtomGroup is given, the `point` argument becomes mandatory + point: array-like, optional + list of the coordinates of the point from where a custom axis of rotation will + be defined. Expected shapes are (3, ) or (1, 3). If no point is given, the + `ag` argument becomes mandatory. weights: {"mass", ``None``} or array_like, optional define the weights of the atoms when calculating the center of the AtomGroup. With ``"mass"`` uses masses as weights; with ``None`` weigh each atom equally. @@ -88,13 +94,10 @@ def rotateby(angle, direction, point=None, ag=None, weights=None, wrap=False): If `True`, all the atoms from the given AtomGroup will be moved to the unit cell before calculating the center of mass or geometry. Default is `False`, no changes to the atom coordinates are done before calculating the center of the AtomGroup. - point: array-like, optional - list of the coordinates of the point from where a custom axis of rotation will - be defined. Returns ------- - :class:`~MDAnalysis.coordinates.base.Timestep` object + MDAnalysis.coordinates.base.Timestep Warning ------- @@ -110,7 +113,7 @@ def rotateby(angle, direction, point=None, ag=None, weights=None, wrap=False): direction = direction.reshape(3, ) except ValueError: raise ValueError('{} is not a valid direction'.format(direction)) - if point: + if point is not None: point = np.asarray(point, np.float32) if point.shape != (3, ) and point.shape != (1, 3): raise ValueError('{} is not a valid point'.format(point)) diff --git a/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst index 71599ff44f9..6ed38cdcf62 100644 --- a/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst +++ b/package/doc/sphinx/source/documentation_pages/trajectory_transformations.rst @@ -96,3 +96,4 @@ e.g. giving a workflow as a keyword argument when defining the universe: .. toctree:: ./transformations/translate + ./transformations/rotate \ No newline at end of file diff --git a/package/doc/sphinx/source/documentation_pages/transformations/rotate.rst b/package/doc/sphinx/source/documentation_pages/transformations/rotate.rst new file mode 100644 index 00000000000..38bae418c86 --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/transformations/rotate.rst @@ -0,0 +1 @@ +.. automodule:: MDAnalysis.transformations.rotate \ No newline at end of file diff --git a/testsuite/MDAnalysisTests/transformations/test_rotate.py b/testsuite/MDAnalysisTests/transformations/test_rotate.py index 823c8be4310..39384712e51 100644 --- a/testsuite/MDAnalysisTests/transformations/test_rotate.py +++ b/testsuite/MDAnalysisTests/transformations/test_rotate.py @@ -61,19 +61,41 @@ def test_rotation_matrix(): matrix = rotation_matrix(np.deg2rad(angle), vector, pos)[:3, :3] assert_array_almost_equal(matrix, ref_matrix, decimal=6) - -def test_rotateby_custom_position(rotate_universes): +@pytest.mark.parametrize('point', ( + np.asarray([0, 0, 0]), + np.asarray([[0, 0, 0]])) +) +def test_rotateby_custom_point(rotate_universes, point): # what happens when we use a custom point for the axis of rotation? ref_u = rotate_universes[0] trans_u = rotate_universes[1] trans = trans_u.trajectory.ts ref = ref_u.trajectory.ts - vector = [1,0,0] - pos = [0,0,0] + vector = [1, 0, 0] + pos = point.reshape(3, ) angle = 90 matrix = rotation_matrix(np.deg2rad(angle), vector, pos) ref_u.atoms.transform(matrix) - transformed = rotateby(angle, vector, point=pos)(trans) + transformed = rotateby(angle, vector, point=point)(trans) + assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) + + +@pytest.mark.parametrize('vector', ( + np.asarray([1, 0, 0]), + np.asarray([[1, 0, 0]])) +) +def test_rotateby_vector(rotate_universes, vector): + # what happens when we use a custom point for the axis of rotation? + ref_u = rotate_universes[0] + trans_u = rotate_universes[1] + trans = trans_u.trajectory.ts + ref = ref_u.trajectory.ts + point = [0, 0, 0] + angle = 90 + vec = vector.reshape(3, ) + matrix = rotation_matrix(np.deg2rad(angle), vec, point) + ref_u.atoms.transform(matrix) + transformed = rotateby(angle, vector, point=point)(trans) assert_array_almost_equal(transformed.positions, ref.positions, decimal=6) From 8536d546fa66413de5672c0e8c576b5fa1c2a7be Mon Sep 17 00:00:00 2001 From: mat Date: Sat, 28 Jul 2018 17:14:01 +0100 Subject: [PATCH 316/455] Conforming to MDAnalysis overall API design. PR #1995 --- package/MDAnalysis/analysis/waterdynamics.py | 18 ++++++++++-------- .../analysis/test_waterdynamics.py | 17 ++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index f7348a4b192..d11220bc351 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -1228,7 +1228,7 @@ def print(self, verbose, *args): elif verbose: print(args) - def run(self, tau_max=20, start=0, stop=-1, step=1, verbose=False): + def run(self, tau_max=20, start=0, stop=None, step=1, verbose=False): """ Computes and returns the survival probability timeseries @@ -1259,11 +1259,11 @@ def run(self, tau_max=20, start=0, stop=-1, step=1, verbose=False): tau_max = self.tau_max if self.tau_max is not None else tau_max # sanity checks - if stop >= len(self.universe.trajectory): + if stop is not None and stop >= len(self.universe.trajectory): raise ValueError("\"stop\" must be smaller than the number of frames in the trajectory.") - if stop == -1: - stop = self.universe.trajectory[-1].frame + 1 + if stop is None: + stop = len(self.universe.trajectory) else: stop = stop + 1 @@ -1277,7 +1277,7 @@ def run(self, tau_max=20, start=0, stop=-1, step=1, verbose=False): selected_ids.append(set(self.universe.select_atoms(self.selection).ids)) tau_timeseries = np.arange(1, tau_max + 1) - sp_timeseries = [[] for _ in range(tau_max)] + sp_timeseries_data = [[] for _ in range(tau_max)] for t in range(0, len(selected_ids), step): Nt = len(selected_ids[t]) @@ -1293,9 +1293,11 @@ def run(self, tau_max=20, start=0, stop=-1, step=1, verbose=False): # ids that survive from t to t + tau and at every frame in between Ntau = len(set.intersection(*selected_ids[t:t + tau + 1])) - sp_timeseries[tau - 1].append(Ntau / float(Nt)) + sp_timeseries_data[tau - 1].append(Ntau / float(Nt)) # user can investigate the distribution and sample size - self.sp_timeseries = sp_timeseries + self.sp_timeseries_data = sp_timeseries_data - return tau_timeseries, [np.mean(sp) for sp in sp_timeseries] \ No newline at end of file + self.tau_timeseries = tau_timeseries + self.sp_timeseries = [np.mean(sp) for sp in sp_timeseries_data] + return self \ No newline at end of file diff --git a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py index 3ff8c3faa4d..f735e336cf5 100644 --- a/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py +++ b/testsuite/MDAnalysisTests/analysis/test_waterdynamics.py @@ -90,8 +90,8 @@ def test_SurvivalProbability_t0tf(universe): ids = [(0, ), (0, ), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1), (0, )] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop(2)) # atom IDs fed set by set sp = waterdynamics.SurvivalProbability(universe, "") - taus, timeseries = sp.run(tau_max=3, start=2, stop=6) - assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) + sp.run(tau_max=3, start=2, stop=6) + assert_almost_equal(sp.sp_timeseries, [2 / 3.0, 1 / 3.0, 0]) def test_SurvivalProbability_definedTaus(universe): @@ -99,8 +99,8 @@ def test_SurvivalProbability_definedTaus(universe): ids = [(9, 8, 7), (8, 7, 6), (7, 6, 5), (6, 5, 4), (5, 4, 3), (4, 3, 2), (3, 2, 1)] select_atoms_mock.side_effect = lambda selection: Mock(ids=ids.pop()) # atom IDs fed set by set sp = waterdynamics.SurvivalProbability(universe, "") - taus, timeseries = sp.run(tau_max=3, start=0, stop=6) - assert_almost_equal(timeseries, [2 / 3.0, 1 / 3.0, 0]) + sp.run(tau_max=3, start=0, stop=6) + assert_almost_equal(sp.sp_timeseries, [2 / 3.0, 1 / 3.0, 0]) def test_SurvivalProbability_zeroMolecules(universe): @@ -108,15 +108,14 @@ def test_SurvivalProbability_zeroMolecules(universe): # no atom IDs found select_atoms_mock.return_value = Mock(ids=[]) sp = waterdynamics.SurvivalProbability(universe, "") - taus, timeseries = sp.run(tau_max=3, start=3, stop=6) - assert all(np.isnan(timeseries)) + sp.run(tau_max=3, start=3, stop=6) + assert all(np.isnan(sp.sp_timeseries)) def test_SurvivalProbability_alwaysPresent(universe): with patch.object(universe, 'select_atoms') as select_atoms_mock: # always the same atom IDs found select_atoms_mock.return_value = Mock(ids=[7, 8]) - sp = waterdynamics.SurvivalProbability(universe, "") - taus, timeseries = sp.run(tau_max=3, start=0, stop=6) - assert all(np.equal(timeseries, 1)) \ No newline at end of file + sp.run(tau_max=3, start=0, stop=6) + assert all(np.equal(sp.sp_timeseries, 1)) \ No newline at end of file From 82c84887ff9a815d07f0918d4da00f5939b1f14e Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Sat, 28 Jul 2018 17:27:45 -0700 Subject: [PATCH 317/455] BUG: fix Windows file permission setting in test_universe * test_Universe_invalidpermissionfile_IE_msg unit test now properly sets Windows file permission to deny read access --- testsuite/MDAnalysisTests/core/test_universe.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/core/test_universe.py b/testsuite/MDAnalysisTests/core/test_universe.py index d237d03f12d..ceccbd752d2 100644 --- a/testsuite/MDAnalysisTests/core/test_universe.py +++ b/testsuite/MDAnalysisTests/core/test_universe.py @@ -25,6 +25,7 @@ from six.moves import cPickle import os +import subprocess try: from cStringIO import StringIO @@ -168,7 +169,12 @@ def test_Universe_invalidpermissionfile_IE_msg(self): temp_file = os.path.join(temp_dir.name, 'permission.denied.tpr') with open(temp_file, 'w'): pass - os.chmod(temp_file, 0o200) + + if os.name == 'nt': + subprocess.call("icacls {filename} /deny Users:RX".format(filename=temp_file), + shell=True) + else: + os.chmod(temp_file, 0o200) try: mda.Universe(os.path.join(temp_dir.name, 'permission.denied.tpr')) except IOError as e: From eb3cc9402651cce0850ddb2d5e6c790aae9a2bd2 Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Sun, 29 Jul 2018 09:06:40 -0700 Subject: [PATCH 318/455] BUG: test_persistent_offsets_readonly Windows fix * test_persistent_offsets_readonly() now properly denies write access to the test file on Windows --- testsuite/MDAnalysisTests/coordinates/test_xdr.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/testsuite/MDAnalysisTests/coordinates/test_xdr.py b/testsuite/MDAnalysisTests/coordinates/test_xdr.py index bd09cbb21fe..a82b3375bb8 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_xdr.py +++ b/testsuite/MDAnalysisTests/coordinates/test_xdr.py @@ -28,6 +28,7 @@ import numpy as np import os import shutil +import subprocess from numpy.testing import (assert_equal, assert_almost_equal) @@ -768,7 +769,14 @@ def test_unsupported_format(self, traj): def test_persistent_offsets_readonly(self, tmpdir): shutil.copy(self.filename, str(tmpdir)) - os.chmod(str(tmpdir), 0o555) + + if os.name == 'nt': + # Windows platform has a unique way to deny write access + subprocess.call("icacls {fname} /deny Users:W".format(fname=tmpdir), + shell=True) + else: + os.chmod(str(tmpdir), 0o555) + filename = str(tmpdir.join(os.path.basename(self.filename))) # try to write a offsets file self._reader(filename) From 441d5baf4db55d0460309fba697fded346f86064 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 3 Aug 2018 13:50:33 +0100 Subject: [PATCH 319/455] Updated comments --- package/MDAnalysis/analysis/waterdynamics.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 8e0d1ecd9d7..2428095e8c5 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -288,10 +288,12 @@ universe = MDAnalysis.Universe(pdb, trajectory) selection = "byres name OH2 and sphzone 12.3 (resid 42 or resid 26 or resid 34 or resid 80) " sp = SP(universe, selection, verbose=True) - taus, sp_timeseries = sp.run(start=0, stop=100, tau_max=20) + sp.run(start=0, stop=100, tau_max=20) + tau_timeseries = sp.tau_timeseries + sp_timeseries = sp.sp_timeseries # print in console - for tau, sp in zip(taus, sp_timeseries): + for tau, sp in zip(tau_timeseries, sp_timeseries): print("{time} {sp}".format(time=tau, sp=sp)) # plot @@ -375,9 +377,9 @@ SurvivalProbability ~~~~~~~~~~~~~~~~~~~ -Survival Probability (SP) returns two lists: a list of taus and a list of their corresponding mean survival -probabilities. Additionally, a list :attr:`SurvivalProbability.sp_timeseries` is provided which contains -a list of SPs for each tau. This provides the number of datapoints gathered and the distribution. +Survival Probability (SP) computes two lists: a list of taus (:attr:`SurvivalProbability.tau_timeseries`) and a list of their corresponding mean survival +probabilities (:attr:`SurvivalProbability.sp_timeseries`). Additionally, a list :attr:`SurvivalProbability.sp_timeseries_data` is provided which contains +a list of SPs for each tau, which can be used to compute their distribution, etc. results = [ tau1, tau2, ..., tau_n ], [ sp_tau1, sp_tau2, ..., sp_tau_n] @@ -1249,9 +1251,9 @@ def run(self, tau_max=20, start=0, stop=None, step=1, verbose=False): Returns ------- tau_timeseries : list - tau from 1 to tau_max + tau from 1 to tau_max. Saved in the field tau_timeseries. sp_timeseries : list - survival probability for each value of `tau` + survival probability for each value of `tau`. Saved in the field sp_timeseries. """ # backward compatibility (and priority) From c00a04a454da92acc6bf866a0b357f7987aefd20 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Sat, 4 Aug 2018 08:15:22 -0500 Subject: [PATCH 320/455] removed use of pytest.approx (#2019) * removed use of pytest.approx * removed mock decorator, playing badly with pytest fixtures --- testsuite/MDAnalysisTests/topology/test_mmtf.py | 9 +++++---- testsuite/MDAnalysisTests/topology/test_pqr.py | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/testsuite/MDAnalysisTests/topology/test_mmtf.py b/testsuite/MDAnalysisTests/topology/test_mmtf.py index 1389e567745..0c4bfd66051 100644 --- a/testsuite/MDAnalysisTests/topology/test_mmtf.py +++ b/testsuite/MDAnalysisTests/topology/test_mmtf.py @@ -108,11 +108,12 @@ def u(self): class TestMMTFFetch(TestMMTFUniverse): @pytest.fixture() - @mock.patch('mmtf.fetch') - def u(self, mock_fetch): + def u(self): top = mmtf.parse(MMTF) - mock_fetch.return_value = top - return mda.fetch_mmtf('173D') # string is irrelevant + with mock.patch('mmtf.fetch') as mock_fetch: + mock_fetch.return_value = top + + return mda.fetch_mmtf('173D') # string is irrelevant class TestSelectModels(object): diff --git a/testsuite/MDAnalysisTests/topology/test_pqr.py b/testsuite/MDAnalysisTests/topology/test_pqr.py index 216a7a71c2d..c6c89ab5d2b 100644 --- a/testsuite/MDAnalysisTests/topology/test_pqr.py +++ b/testsuite/MDAnalysisTests/topology/test_pqr.py @@ -90,7 +90,7 @@ def test_gromacs_flavour(): assert u.atoms[0].type == 'O' assert u.atoms[0].segid == 'SYSTEM' assert not u._topology.types.is_guessed - assert u.atoms[0].radius == pytest.approx(1.48) - assert u.atoms[0].charge == pytest.approx(-0.67) + assert_almost_equal(u.atoms[0].radius, 1.48, decimal=5) + assert_almost_equal(u.atoms[0].charge, -0.67, decimal=5) # coordinatey things assert_almost_equal(u.atoms[0].position, [15.710, 17.670, 23.340], decimal=4) From 2c9d6c50dfeb75b07f8aa87e299a717536b51931 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sun, 5 Aug 2018 18:50:09 +0200 Subject: [PATCH 321/455] Use stricter type for pkdtree indices (#2025) Using consistently np.int64 for the indices used in pkdtree avoids type errors when using unique_int_1d. This should reduce the number of failing tests on windows. --- package/MDAnalysis/lib/pkdtree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 8ab562dbd45..5b1b21594f2 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -192,7 +192,7 @@ def search(self, centers, radius): radius)) self._indices = np.array(list( itertools.chain.from_iterable(indices)), - dtype=np.int) + dtype=np.int64) self._indices = np.asarray(unique_int_1d(self._indices)) return self._indices From fe792a1e0aceb6ccd27ff49aa9f00bcdf607eeb4 Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Sun, 5 Aug 2018 10:23:18 -0700 Subject: [PATCH 322/455] BUG: Force 64-bit storage for xdr file offsets * Fixes Issue #2021 with Windows xdr large file offset handling * on the Windows platform xdr file offsets are now forced to use a 64-bit storage type so that, for example, file seeks beyond 4 GB are correctly reported --- package/MDAnalysis/lib/formats/src/xdrfile.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/lib/formats/src/xdrfile.c b/package/MDAnalysis/lib/formats/src/xdrfile.c index 470bd26fe76..19a1c0b93b4 100644 --- a/package/MDAnalysis/lib/formats/src/xdrfile.c +++ b/package/MDAnalysis/lib/formats/src/xdrfile.c @@ -45,6 +45,7 @@ #endif #include +#define _FILE_OFFSET_BITS 64 #ifdef _WIN32 # include @@ -2518,8 +2519,8 @@ static int xdrstdio_getlong (XDR *, int32_t *); static int xdrstdio_putlong (XDR *, int32_t *); static int xdrstdio_getbytes (XDR *, char *, unsigned int); static int xdrstdio_putbytes (XDR *, char *, unsigned int); -static off_t xdrstdio_getpos (XDR *); -static int xdrstdio_setpos (XDR *, off_t, int); +static int64_t xdrstdio_getpos (XDR *); +static int xdrstdio_setpos (XDR *, int64_t, int); static void xdrstdio_destroy (XDR *); /* @@ -2601,7 +2602,7 @@ xdrstdio_putbytes (XDR *xdrs, char *addr, unsigned int len) } -static off_t +static int64_t xdrstdio_getpos (XDR *xdrs) { #ifdef _WIN32 @@ -2612,7 +2613,7 @@ xdrstdio_getpos (XDR *xdrs) } static int -xdrstdio_setpos (XDR *xdrs, off_t pos, int whence) +xdrstdio_setpos (XDR *xdrs, int64_t pos, int whence) { /* A reason for failure can be filesystem limits on allocation units, * before the actual off_t overflow (ext3, with a 4K clustersize, @@ -2640,7 +2641,7 @@ int xdr_seek(XDRFILE *xd, int64_t pos, int whence) /* Seeks to position in file */ { int result; - if ((result = xdrstdio_setpos(xd->xdr, (off_t) pos, whence)) != 0) + if ((result = xdrstdio_setpos(xd->xdr, (int64_t) pos, whence)) != 0) return result; return exdrOK; From 6b74bac909141477a6576b4560755708db50c632 Mon Sep 17 00:00:00 2001 From: ayushsuhane <34154224+ayushsuhane@users.noreply.github.com> Date: Sun, 5 Aug 2018 12:45:11 -0700 Subject: [PATCH 323/455] Using Self Capped distance function in guess_bonds (#2006) * added an option to check for pairs within coordinate array using bruteforce_capped_self, pkdtree_capped_self + tests * Modified guess bonds to use capped function * seperated the self_capped_function, added tests, modified the guess_bonds function * modified CHANGELOG, and minor modifications * modified test for increased coverage, minor modifications to the self_capped_distance --- package/CHANGELOG | 6 + package/MDAnalysis/lib/distances.py | 304 ++++++++++++++++-- package/MDAnalysis/topology/guessers.py | 27 +- .../MDAnalysisTests/lib/test_distances.py | 64 +++- .../MDAnalysisTests/topology/test_guessers.py | 11 + 5 files changed, 358 insertions(+), 54 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 05e9b078d1c..08234a6cb6e 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,6 +20,12 @@ The rules for this file: Enhancements + + * Modified topology.guessers.guess_bonds to automatically select the + fastest method for guessing bonds using + lib.distance.self_capped_distance (PR # 2006) + * Added lib.distances.self_capped_distance to internally select the + optimized method for distance evaluations of coordinates with itself. (PR # 2006) * Added augment functionality to create relevant images of particles in the vicinity of central cell to handle periodic boundary conditions (PR #1977) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 57a5625b074..1cb86147235 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -59,6 +59,8 @@ .. autofunction:: calc_angles(atom1, atom2, atom3 [,box [, result [, backend]]]) .. autofunction:: calc_dihedrals(atom1, atom2, atom3, atom4 [,box [, result [, backend]]]) .. autofunction:: apply_PBC(coordinates, box [, backend]) +.. autofunction:: capped_distance(reference, configuration, max_cutoff [, min_cutoff [, box [, method]]]) +.. autofunction:: self_capped_distance(reference, max_cutoff, [, min_cutoff [, box [, method]]]) .. autofunction:: transform_RtoS(coordinates, box [, backend]) .. autofunction:: transform_StoR(coordinates, box [,backend]) .. autofunction:: MDAnalysis.lib._augment.augment_coordinates(coordinates, box, radius) @@ -400,8 +402,9 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): return distances -def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None): - """Calculates the pairs and distance within a specified distance +def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, + box=None, method=None): + """Calculates the pairs and distances within a specified distance If a *box* is supplied, then a minimum image convention is used to evaluate the distances. @@ -460,7 +463,6 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=N .. SeeAlso:: :func:'MDAnalysis.lib.distances.distance_array' .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree' - """ if box is not None: if box.shape[0] != 6: @@ -483,12 +485,38 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, All the rules to select the method based on the input can be incorporated here. + Parameters + ---------- + reference : array + reference coordinates array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)`` + configuration : array + Configuration coordinate array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)`` + max_cutoff : float + Maximum cutoff distance between the reference and configuration + min_cutoff : (optional) float + Minimum cutoff distance between reference and configuration [None] + box : (optional) array or None + The dimensions, if provided, must be provided in the same + The unitcell dimesions for this system format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention + is applied if the box is provided [None] + method : (optional) 'bruteforce' or 'pkdtree' or 'None' + Keyword to override the automatic guessing of method built-in + in the function [None] + Returns ------- - Function object based on the rules and specified method - Currently implemented methods are - bruteforce : returns ``_bruteforce_capped`` - PKDtree : return ``_pkdtree_capped` + Method : Function object + Returns function object based on the rules and specified method + + Note + ---- + Currently implemented methods are present in the ``methods`` dictionary + bruteforce : returns ``_bruteforce_capped`` + PKDtree : return ``_pkdtree_capped` """ methods = {'bruteforce': _bruteforce_capped, @@ -498,37 +526,49 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, return methods[method] if len(reference) > 5000 and len(configuration) > 5000: - if box is None and reference.shape[0] != 3 and configuration.shape[0] != 3: + if box is None: min_dim = np.array([reference.min(axis=0), configuration.min(axis=0)]) max_dim = np.array([reference.max(axis=0), configuration.max(axis=0)]) size = max_dim.max(axis=0) - min_dim.min(axis=0) - elif box is not None: - if np.allclose(box[3:], 90): - size = box[:3] - else: - tribox = triclinic_vectors(box) - size = tribox.max(axis=0) - tribox.min(axis=0) - - if (np.any(size < 10.0*max_cutoff) and + elif np.allclose(box[3:], 90): + size = box[:3] + else: + tribox = triclinic_vectors(box) + size = tribox.max(axis=0) - tribox.min(axis=0) + + if ((np.any(size < 10.0*max_cutoff) and len(reference) > 100000 and - len(configuration) > 100000): + len(configuration) > 100000)): return methods['bruteforce'] else: return methods['pkdtree'] return methods['bruteforce'] -def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): - """ - Using naive distance calulations, returns a list +def _bruteforce_capped(reference, configuration, max_cutoff, + min_cutoff=None, box=None): + """Internal method for bruteforce calculations + + Uses naive distance calulations and returns a list containing the indices with one from each reference and configuration arrays, such that the distance between them is less than the specified cutoff distance + + Returns + ------- + pairs : list + List of ``[(i, j)]`` pairs such that atom-index ``i`` is + from reference and ``j`` from configuration array + distance: list + Distance between ``reference[i]`` and ``configuration[j]`` + atom coordinate + """ pairs, distance = [], [] + reference = np.asarray(reference, dtype=np.float32) configuration = np.asarray(configuration, dtype=np.float32) @@ -543,18 +583,21 @@ def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, bo for i, coords in enumerate(reference): dist = distance_array(coords[None, :], configuration, box=box)[0] if min_cutoff is not None: - idx = np.where((dist <= max_cutoff) & (dist > min_cutoff))[0] + idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[0] else: - idx = np.where((dist <= max_cutoff))[0] + idx = np.where((dist < max_cutoff))[0] for j in idx: pairs.append((i, j)) distance.append(dist[j]) return pairs, distance -def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): +def _pkdtree_capped(reference, configuration, max_cutoff, + min_cutoff=None, box=None): """ Capped Distance evaluations using KDtree. + Uses minimum image convention if *box* is specified + Returns: -------- pairs : list @@ -564,6 +607,7 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N distance : list Distance between two atoms corresponding to the (i, j) indices in pairs. + """ from .pkdtree import PeriodicKDTree @@ -600,6 +644,220 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=N return pairs, distances +def self_capped_distance(reference, max_cutoff, min_cutoff=None, + box=None, method=None): + """Finds all the pairs and respective distances within a specified cutoff + for a configuration *reference* + + If a *box* is supplied, then a minimum image convention is used + to evaluate the distances. + + An automatic guessing of optimized method to calculate the distances is + included in the function. An optional keyword for the method is also + provided. Users can override the method with this functionality. + Currently pkdtree and bruteforce are implemented. + + Parameters + ----------- + reference : array + reference coordinates array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)`` + max_cutoff : float + Maximum cutoff distance to check the neighbors with itself + min_cutoff : (optional) float + Minimum cutoff distance [None] + box : (optional) array or None + The dimensions, if provided, must be provided in the same + The unitcell dimesions for this system format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention + is applied if the box is provided [None] + method : (optional) 'bruteforce' or 'pkdtree' or 'None' + Keyword to override the automatic guessing of method built-in + in the function [None] + + Returns + ------- + pairs : array + Pair of indices such that distance between them is + within the ``max_cutoff`` and ``min_cutoff`` + distances : array + Distances corresponding to each pair of indices. + d[k] corresponding to the pairs[i,j] gives the distance between + i-th and j-th coordinate in reference + + .. code-block:: python + + pairs, distances = self_capped_distances(reference, max_cutoff) + for indx, [a,b] in enumerate(pairs): + coord1, coords2 = reference[a], reference[b] + distance = distances[indx] + + Note + ----- + Currently only supports brute force and Periodic KDtree + + .. SeeAlso:: :func:'MDAnalysis.lib.distances.self_distance_array' + .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree' + """ + if box is not None: + if box.shape[0] != 6: + raise ValueError('Box Argument is of incompatible type. The dimension' + 'should be either None or ' + 'of the type [lx, ly, lz, alpha, beta, gamma]') + method = _determine_method_self(reference, max_cutoff, + min_cutoff=min_cutoff, + box=box, method=method) + pairs, dist = method(reference, max_cutoff, + min_cutoff=min_cutoff, box=box) + + return np.asarray(pairs), np.asarray(dist) + + +def _determine_method_self(reference, max_cutoff, min_cutoff=None, + box=None, method=None): + """ + Switch between different methods based on the the optimized time. + All the rules to select the method based on the input can be + incorporated here. + + Parameters + ---------- + reference : array + reference coordinates array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)`` + max_cutoff : float + Maximum cutoff distance + min_cutoff : (optional) float + Minimum cutoff distance [None] + box : (optional) array or None + The dimensions, if provided, must be provided in the same + The unitcell dimesions for this system format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention + is applied if the box is provided [None] + method : (optional) 'bruteforce' or 'pkdtree' or 'None' + Keyword to override the automatic guessing of method built-in + in the function [None] + + Returns + ------- + Method : Function object + Returns function object based on the rules and specified method + + Note + ---- + Currently implemented methods are present in the ``methods`` dictionary + bruteforce : returns ``_bruteforce_capped_self`` + PKDtree : return ``_pkdtree_capped_self`` + + """ + methods = {'bruteforce': _bruteforce_capped_self, + 'pkdtree': _pkdtree_capped_self} + + if method is not None: + return methods[method] + + if len(reference) > 5000: + if box is None: + min_dim = np.array([reference.min(axis=0)]) + max_dim = np.array([reference.max(axis=0)]) + size = max_dim.max(axis=0) - min_dim.min(axis=0) + elif np.allclose(box[3:], 90): + size = box[:3] + else: + tribox = triclinic_vectors(box) + size = tribox.max(axis=0) - tribox.min(axis=0) + + if ((np.any(size < 10.0*max_cutoff) and + (len(reference) > 100000))): + return methods['bruteforce'] + else: + return methods['pkdtree'] + return methods['bruteforce'] + + +def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, + box=None): + """Finds all the pairs among the *reference* coordinates within + a fixed distance using brute force method + + Internal method using brute force method to evaluate all the pairs + of atoms within a fixed distance. + + Returns + ------- + pairs : array + Arrray of ``[i, j]`` pairs such that atom-index ``i`` + and ``j`` from reference array are within the fixed distance + distance: array + Distance between ``reference[i]`` and ``reference[j]`` + atom coordinate + + """ + pairs, distance = [], [] + + reference = np.asarray(reference, dtype=np.float32) + if reference.shape == (3, ): + reference = reference[None, :] + for i, coords in enumerate(reference): + # Each pair of atoms needs to be checked only once. + # Only calculate distance for atomA and atomB + # if atomidA < atomidB + dist = distance_array(coords[None, :], reference[i+1:], + box=box)[0] + + if min_cutoff is not None: + idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[0] + else: + idx = np.where((dist < max_cutoff))[0] + for other_idx in idx: + # Actual atomid for atomB + # can be direclty obtained in this way + j = other_idx + 1 + i + pairs.append((i, j)) + distance.append(dist[other_idx]) + return np.asarray(pairs), np.asarray(distance) + + +def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, + box=None): + """Finds all the pairs among the coordinates within a fixed distance + using PeriodicKDTree + + Internal method using PeriodicKDTree method to evaluate all the pairs + of atoms within a fixed distance. + + Returns + ------- + pairs : array + Array of ``[(i, j)]`` pairs such that atom-index ``i`` + and ``j`` from reference array are within the fixed distance + distance: array + Distance between ``reference[i]`` and ``reference[j]`` + atom coordinate + + """ + from .pkdtree import PeriodicKDTree + + reference = np.asarray(reference, dtype=np.float32) + if reference.shape == (3, ): + reference = reference[None, :] + + pairs, distance = [], [] + kdtree = PeriodicKDTree(box=box) + cut = max_cutoff if box is not None else None + kdtree.set_coords(reference, cutoff=cut) + pairs = kdtree.search_pairs(max_cutoff) + if pairs.size > 0: + refA, refB = pairs[:, 0], pairs[:, 1] + distance = calc_bonds(reference[refA], reference[refB], box=box) + if min_cutoff is not None: + mask = np.where(distance > min_cutoff)[0] + pairs, distance = pairs[mask], distance[mask] + return np.asarray(pairs), np.asarray(distance) + + def transform_RtoS(inputcoords, box, backend="serial"): """Transform an array of coordinates from real space to S space (aka lambda space) diff --git a/package/MDAnalysis/topology/guessers.py b/package/MDAnalysis/topology/guessers.py index 06689168079..bed9cca8b05 100644 --- a/package/MDAnalysis/topology/guessers.py +++ b/package/MDAnalysis/topology/guessers.py @@ -232,25 +232,14 @@ def guess_bonds(atoms, coords, box=None, **kwargs): bonds = [] - for i, atom in enumerate(atoms[:-1]): - vdw_i = vdwradii[atomtypes[i]] - max_d = (vdw_i + max_vdw) * fudge_factor - - # using self_distance_array scales O(n^2) - # 20,000 atoms = 1.6 Gb memory - dist = distances.distance_array(coords[i][None, :], coords[i + 1:], - box=box)[0] - idx = np.where((dist > lower_bound) & (dist <= max_d))[0] - - for a in idx: - j = i + 1 + a - atom_j = atoms[j] - - if dist[a] < (vdw_i + vdwradii[atomtypes[j]]) * fudge_factor: - # because of method used, same bond won't be seen twice, - # so don't need to worry about duplicates - bonds.append((atom.index, atom_j.index)) - + pairs, dist = distances.self_capped_distance(coords, + max_cutoff=2.0*max_vdw, + min_cutoff=lower_bound, + box=box) + for idx, (i, j) in enumerate(pairs): + d = (vdwradii[atomtypes[i]] + vdwradii[atomtypes[j]])*fudge_factor + if (dist[idx] < d): + bonds.append((atoms[i].index, atoms[j].index)) return tuple(bonds) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 37133cb5abc..38f634844e3 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -106,7 +106,56 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1], axis=0)) +@pytest.mark.parametrize('npoints', npoints_1) +@pytest.mark.parametrize('box', boxes_1) +@pytest.mark.parametrize('method', method_1) +@pytest.mark.parametrize('min_cutoff', min_cutoff_1) +def test_self_capped_distance(npoints, box, method, min_cutoff): + np.random.seed(90003) + points = (np.random.uniform(low=0, high=1.0, + size=(npoints, 3))*(boxes_1[0][:3])).astype(np.float32) + max_cutoff = 0.1 + pairs, distance = mda.lib.distances.self_capped_distance(points, + max_cutoff, + min_cutoff=min_cutoff, + box=box, + method=method) + found_pairs, found_distance = [], [] + for i, coord in enumerate(points): + dist = mda.lib.distances.distance_array(coord[None, :], + points[i+1:], + box=box) + if min_cutoff is not None: + idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[0] + else: + idx = np.where((dist < max_cutoff))[0] + for other_idx in idx: + j = other_idx + 1 + i + found_pairs.append((i, j)) + found_distance.append(dist[other_idx]) + assert_equal(len(pairs), len(found_pairs)) + +@pytest.mark.parametrize('box', (None, + np.array([1, 1, 1, 90, 90, 90], dtype=np.float32), + np.array([1, 1, 1, 60, 75, 80], dtype=np.float32))) +@pytest.mark.parametrize('npoints,cutoff,meth', + [(1, 0.02, '_bruteforce_capped_self'), + (1, 0.2, '_bruteforce_capped_self'), + (6000, 0.02, '_pkdtree_capped_self'), + (6000, 0.2, '_pkdtree_capped_self'), + (200000, 0.02, '_pkdtree_capped_self'), + (200000, 0.2, '_bruteforce_capped_self')]) +def test_method_selfselection(box, npoints, cutoff, meth): + np.random.seed(90003) + points = (np.random.uniform(low=0, high=1.0, + size=(npoints, 3))).astype(np.float32) + method = mda.lib.distances._determine_method_self(points, cutoff, box=box) + assert_equal(method.__name__, meth) + +@pytest.mark.parametrize('box', (None, + np.array([1, 1, 1, 90, 90, 90], dtype=np.float32), + np.array([1, 1, 1, 60, 75, 80], dtype=np.float32))) @pytest.mark.parametrize('npoints,cutoff,meth', [(1, 0.02, '_bruteforce_capped'), (1, 0.2, '_bruteforce_capped'), @@ -114,20 +163,11 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): (6000, 0.2, '_pkdtree_capped'), (200000, 0.02, '_pkdtree_capped'), (200000, 0.2, '_bruteforce_capped')]) -def test_method_selection(npoints, cutoff, meth): +def test_method_selection(box, npoints, cutoff, meth): np.random.seed(90003) - box = np.array([1, 1, 1, 90, 90, 90], dtype=np.float32) points = (np.random.uniform(low=0, high=1.0, - size=(npoints, 3)) * (box[:3])).astype(np.float32) - if box is not None: - boxtype = mda.lib.distances._box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - method = mda.lib.distances._determine_method(points, points, - cutoff, box=box) + size=(npoints, 3)).astype(np.float32)) + method = mda.lib.distances._determine_method(points, points, cutoff, box=box) assert_equal(method.__name__, meth) diff --git a/testsuite/MDAnalysisTests/topology/test_guessers.py b/testsuite/MDAnalysisTests/topology/test_guessers.py index 574d8bd7a45..7bbb585bf22 100644 --- a/testsuite/MDAnalysisTests/topology/test_guessers.py +++ b/testsuite/MDAnalysisTests/topology/test_guessers.py @@ -25,11 +25,13 @@ from numpy.testing import assert_equal import numpy as np +import MDAnalysis as mda from MDAnalysis.topology import guessers from MDAnalysis.core.topologyattrs import Angles from MDAnalysisTests import make_Universe from MDAnalysisTests.core.test_fragments import make_starshape +from MDAnalysisTests.datafiles import two_water_gro class TestGuessMasses(object): @@ -99,3 +101,12 @@ def test_guess_impropers(): vals = guessers.guess_improper_dihedrals(ag.angles) assert_equal(len(vals), 12) + + +def test_guess_bonds(): + u = mda.Universe(two_water_gro) + bonds = guessers.guess_bonds(u.atoms, u.atoms.positions, u.dimensions) + assert_equal(bonds, ((0, 1), + (0, 2), + (3, 4), + (3, 5))) From f92ec5da70805897bd6f874204e822fe76cb8722 Mon Sep 17 00:00:00 2001 From: ayushsuhane <34154224+ayushsuhane@users.noreply.github.com> Date: Sun, 5 Aug 2018 12:49:29 -0700 Subject: [PATCH 324/455] Around keyword can use KDTree for periodic boundary conditions (#2022) * kdtree now works with pbc, modified _apply_kdtree method in pointselections * CHANGELOG --- package/CHANGELOG | 3 ++- package/MDAnalysis/core/selection.py | 16 +++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 08234a6cb6e..93524527cd4 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,7 +20,8 @@ The rules for this file: Enhancements - + * Modified around selections to work with KDTree and periodic boundary + conditions. Should reduce memory usage (#974 PR #2022) * Modified topology.guessers.guess_bonds to automatically select the fastest method for guessing bonds using lib.distance.self_capped_distance (PR # 2006) diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index bc4a256e20e..4532ac854a7 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -243,9 +243,6 @@ def __init__(self): self.apply = self._apply_distmat self.periodic = flags['use_periodic_selections'] - # KDTree doesn't support periodic - if self.periodic: - self.apply = self._apply_distmat def validate_dimensions(self, dimensions): r"""Check if the system is periodic in all three-dimensions. @@ -282,6 +279,9 @@ def _apply_KDTree(self, group): # All atoms in group that aren't in sel sys = group[~np.in1d(group.indices, sel.indices)] + if not sys: + return sys[[]] + box = self.validate_dimensions(group.dimensions) cut = self.cutoff if box is not None else None @@ -321,7 +321,8 @@ def _apply_KDTree(self, group): """ sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) - ref = sel.center_of_geometry(pbc=self.periodic) + periodic = box is not None + ref = sel.center_of_geometry(pbc=periodic) kdtree = PeriodicKDTree(box=box) cutoff = self.exRadius if box is not None else None @@ -363,7 +364,8 @@ def _apply_KDTree(self, group): """ sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) - ref = sel.center_of_geometry(pbc=self.periodic) + periodic = box is not None + ref = sel.center_of_geometry(pbc=periodic) cut = self.cutoff if box is not None else None kdtree = PeriodicKDTree(box=box) @@ -483,7 +485,7 @@ def __init__(self, parser, tokens): self.cutoff = float(tokens.popleft()) def _apply_KDTree(self, group): - box = group.dimensions if self.periodic else None + box = self.validate_dimensions(group.dimensions) kdtree = PeriodicKDTree(box=box) cut = self.cutoff if box is not None else None kdtree.set_coords(group.positions, cutoff=cut) @@ -496,7 +498,7 @@ def _apply_distmat(self, group): ref_coor = self.ref[np.newaxis, ...] ref_coor = np.asarray(ref_coor, dtype=np.float32) - box = group.dimensions if self.periodic else None + box = self.validate_dimensions(group.dimensions) dist = distances.distance_array(group.positions, ref_coor, box) mask = (dist <= self.cutoff).any(axis=1) From c04301abd37f2268820010260cddf5e5edd40b61 Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 25 Jun 2018 20:10:22 -0700 Subject: [PATCH 325/455] First commit for gridded method --- package/MDAnalysis/lib/c_gridsearch.pyx | 747 ++++++++++++++++++++++++ package/setup.py | 9 +- 2 files changed, 755 insertions(+), 1 deletion(-) create mode 100644 package/MDAnalysis/lib/c_gridsearch.pyx diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx new file mode 100644 index 00000000000..82d7192544a --- /dev/null +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -0,0 +1,747 @@ +# -*- coding: utf-8; Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# Copyright (C) 2013-2016 Sébastien Buchoux +# +# This file is part of FATSLiM. +# +# FATSLiM is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# FATSLiM is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with FATSLiM. If not, see . +#cython: cdivision=True +#cython: boundscheck=False + +# Preprocessor DEFs +DEF DIM = 3 +DEF XX = 0 +DEF YY = 1 +DEF ZZ = 2 +DEF RET_OK = 1 +DEF RET_ERROR = 0 +DEF EPSILON = 1e-5 +DEF NEIGHBORHOOD_ALLOCATION_INCREMENT = 50 +DEF GRID_ALLOCATION_INCREMENT = 50 + +DEF BOX_MARGIN=1.0010 +DEF MAX_NTRICVEC=12 + + +# Cython C imports (no Python here!) +from cython.parallel cimport prange +from libc.stdlib cimport malloc, realloc, free, abort +from libc.stdio cimport fprintf, stderr +from libc.math cimport sqrt +from libc.math cimport abs as real_abs + +cimport openmp + + +# Python imports +import numpy as np +cimport numpy as np + +# Ctypes +ctypedef np.int_t ns_int +ctypedef np.float32_t real +ctypedef real rvec[DIM] +ctypedef real matrix[DIM][DIM] + +cdef struct ns_grid: + ns_int size + ns_int[DIM] ncells + real[DIM] cellsize + ns_int *nbeads + ns_int **beadids + +cdef struct ns_neighborhood: + real cutoff + ns_int allocated_size + ns_int size + ns_int *beadids + real *beaddist + ### +cdef struct ns_neighborhood_holder: + ns_int size + ns_neighborhood **neighborhoods + +# Useful stuff + +cdef real rvec_norm2(const rvec a) nogil: + return a[XX]*a[XX]+a[YY]*a[YY]+a[ZZ]*a[ZZ] + +cdef void rvec_clear(rvec a) nogil: + a[XX]=0.0 + a[YY]=0.0 + a[ZZ]=0.0 + +cdef struct cPBCBox_t: + matrix box + rvec fbox_diag + rvec hbox_diag + rvec mhbox_diag + real max_cutoff2 + ns_int ntric_vec + ns_int[DIM] tric_shift[MAX_NTRICVEC] + real[DIM] tric_vec[MAX_NTRICVEC] + +# noinspection PyNoneFunctionAssignment +cdef class PBCBox(object): + cdef cPBCBox_t c_pbcbox + cdef rvec center + cdef rvec bbox_center + + def __init__(self, real[:,::1] box): + self.update(box) + + cdef void fast_update(self, real[:,::1] box) nogil: + cdef ns_int i, j, k, d, jc, kc, shift + cdef real d2old, d2new, d2new_c + cdef rvec trial, pos + cdef ns_int ii, jj ,kk + cdef ns_int *order = [0, -1, 1, -2, 2] + cdef bint use + cdef real min_hv2, min_ss, tmp + + rvec_clear(self.center) + # Update matrix + for i in range(DIM): + for j in range(DIM): + self.c_pbcbox.box[i][j] = box[i, j] + self.center[j] += 0.5 * box[i, j] + self.bbox_center[i] = 0.5 * box[i, i] + + # Update diagonals + for i in range(DIM): + self.c_pbcbox.fbox_diag[i] = box[i, i] + self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 + self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] + + # Update maximum cutoff + + # Physical limitation of the cut-off + # by half the length of the shortest box vector. + min_hv2 = min(0.25 * rvec_norm2(&box[XX, XX]), 0.25 * rvec_norm2(&box[YY, XX])) + min_hv2 = min(min_hv2, 0.25 * rvec_norm2(&box[ZZ, XX])) + + # Limitation to the smallest diagonal element due to optimizations: + # checking only linear combinations of single box-vectors (2 in x) + # in the grid search and pbc_dx is a lot faster + # than checking all possible combinations. + tmp = box[YY, YY] + if box[ZZ, YY] < 0: + tmp -= box[ZZ, YY] + else: + tmp += box[ZZ, YY] + + min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) + + self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) + + # Update shift vectors + self.c_pbcbox.ntric_vec = 0 + # We will only use single shifts, but we will check a few + # more shifts to see if there is a limiting distance + # above which we can not be sure of the correct distance. + for kk in range(5): + k = order[kk] + + for jj in range(5): + j = order[jj] + + for ii in range(5): + i = order[ii] + + # A shift is only useful when it is trilinic + if j != 0 or k != 0: + d2old = 0 + d2new = 0 + + for d in range(DIM): + trial[d] = i*box[XX, d] + j*box[YY, d] + k*box[ZZ, d] + + # Choose the vector within the brick around 0,0,0 that + # will become the shortest due to shift try. + + if d == DIM: + trial[d] = 0 + pos[d] = 0 + else: + if trial[d] < 0: + pos[d] = min(self.c_pbcbox.hbox_diag[d], -trial[d]) + else: + pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) + + d2old += sqrt(pos[d]) + d2new += sqrt(pos[d] + trial[d]) + + if BOX_MARGIN*d2new < d2old: + if not (j < -1 or j > 1 or k < -1 or k > 1): + use = True + + for dd in range(DIM): + if dd == 0: + shift = i + elif dd == 1: + shift = j + else: + shift = k + + if shift: + d2new_c = 0 + + for d in range(DIM): + d2new_c += sqrt(pos[d] + trial[d] - shift*box[dd, d]) + + if d2new_c <= BOX_MARGIN*d2new: + use = False + + if use: # Accept this shift vector. + if self.c_pbcbox.ntric_vec >= MAX_NTRICVEC: + with gil: + print("\nWARNING: Found more than %d triclinic " + "correction vectors, ignoring some." + % MAX_NTRICVEC) + print(" There is probably something wrong with " + "your box.") + print(box) + else: + for d in range(DIM): + self.c_pbcbox.tric_vec[self.c_pbcbox.ntric_vec][d] = \ + trial[d] + self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][XX] = i + self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][YY] = j + self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][ZZ] = k + self.c_pbcbox.ntric_vec += 1 + + + def update(self, real[:,::1] box): + if box.shape[0] != DIM or box.shape[1] != DIM: + raise ValueError("Box must be a %i x %i matrix. (shape: %i x %i)" % + (DIM, DIM, box.shape[0], box.shape[1])) + if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + raise ValueError("Box does not correspond to PBC=xyz") + self.fast_update(box) + + cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: + cdef ns_int i, j + cdef rvec dx_start, trial + + for i in range(DIM): + dx[i] = other[i] - ref[i] + + for i in range (DIM-1, -1, -1): + while dx[i] > self.c_pbcbox.hbox_diag[i]: + for j in range (i, -1, -1): + dx[j] -= self.c_pbcbox.box[i][j] + + while dx[i] <= self.c_pbcbox.mhbox_diag[i]: + for j in range (i, -1, -1): + dx[j] += self.c_pbcbox.box[i][j] + + cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: + cdef ns_int i, m, d, natoms, wd = 0 + cdef real[:,::1] bbox_coords + + natoms = coords.shape[0] + with gil: + if natoms == 0: + bbox_coords = np.empty((0, DIM)) + else: + bbox_coords = coords.copy() + + for i in range(natoms): + for m in range(DIM - 1, -1, -1): + while bbox_coords[i, m] < 0: + for d in range(m+1): + bbox_coords[i, d] += self.c_pbcbox.box[m][d] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + for d in range(m+1): + bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + return bbox_coords + + def put_atoms_in_bbox(self, real[:,::1] coords): + return np.asarray(self.fast_put_atoms_in_bbox(coords)) + + + +######################################################################################################################## +# +# Neighbor Search Stuff +# +######################################################################################################################## +cdef struct ns_grid: + ns_int size + ns_int[DIM] ncells + real[DIM] cellsize + ns_int *nbeads + ns_int **beadids + +cdef ns_grid initialize_nsgrid(matrix box, + float cutoff) nogil: + cdef ns_grid grid + cdef ns_int i + + for i in range(DIM): + grid.ncells[i] = (box[i][i] / cutoff) + if grid.ncells[i] == 0: + grid.ncells[i] = 1 + grid.cellsize[i] = box[i][i] / grid.ncells[i] + + grid.size = grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ] + return grid + +cdef ns_int populate_grid(ns_grid *grid, + real[:,::1] coords) nogil: + cdef ns_int ncoords = coords.shape[0] + cdef bint ret_val + + ret_val = populate_grid_array(grid, + &coords[0, 0], + ncoords) + + return ret_val + +cdef ns_int populate_grid_array(ns_grid *grid, + rvec *coords, + ns_int ncoords) nogil: + cdef ns_int i, cellindex = -1 + cdef ns_int grid_size = grid.size + cdef ns_int *allocated_size = NULL + + if grid_size != grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ]: # Grid not initialized + return RET_ERROR + + + # Allocate memory + grid.nbeads = malloc(sizeof(ns_int) * grid_size) + if grid.nbeads == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS grid.nbeads (requested: %i bytes)\n", + sizeof(ns_int) * grid_size) + abort() + + allocated_size = malloc(sizeof(ns_int) * grid_size) + if allocated_size == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS allocated_size (requested: %i bytes)\n", + sizeof(ns_int) * grid_size) + abort() + + for i in range(grid_size): + grid.nbeads[i] = 0 + allocated_size[i] = GRID_ALLOCATION_INCREMENT + + grid.beadids = malloc(sizeof(ns_int *) * grid_size) + if grid.beadids == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids (requested: %i bytes)\n", + sizeof(ns_int *) * grid_size) + abort() + + for i in range(grid_size): + grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) + if grid.beadids[i] == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids[i] (requested: %i bytes)\n", + sizeof(ns_int) * allocated_size[i]) + abort() + + # Get cell indices for coords + for i in range(ncoords): + cellindex = (coords[i][ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ + (coords[i][YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ + (coords[i][XX] / grid.cellsize[XX]) + + grid.beadids[cellindex][grid.nbeads[cellindex]] = i + grid.nbeads[cellindex] += 1 + + if grid.nbeads[cellindex] >= allocated_size[cellindex]: + allocated_size[cellindex] += GRID_ALLOCATION_INCREMENT + grid.beadids[cellindex] = realloc( grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) + free(allocated_size) + return RET_OK + +cdef void destroy_nsgrid(ns_grid *grid) nogil: + cdef ns_int i + if grid.nbeads != NULL: + free(grid.nbeads) + + for i in range(grid.size): + if grid.beadids[i] != NULL: + free(grid.beadids[i]) + free(grid.beadids) + + +cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: + cdef ns_neighborhood_holder *holder + + holder = malloc(sizeof(ns_neighborhood_holder)) + + return holder + +cdef void free_neighborhood_holder(ns_neighborhood_holder *holder) nogil: + cdef ns_int i + + if holder == NULL: + return + + for i in range(holder.size): + if holder.neighborhoods[i].beadids != NULL: + free(holder.neighborhoods[i].beadids) + free(holder.neighborhoods[i]) + free(holder.neighborhoods) + free(holder) + +cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]neighborcoords, ns_grid *grid, PBCBox box, real cutoff2) nogil: + cdef ns_int d, m + cdef ns_int xi, yi, zi, bid + cdef real d2 + cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords + + cdef bint already_checked[27] + cdef bint skip + cdef ns_int nchecked = 0, icheck + cdef ns_int cell_index + + cdef ns_neighborhood *neighborhood = malloc(sizeof(ns_neighborhood)) + if neighborhood == NULL: + abort() + + neighborhood.size = 0 + neighborhood.allocated_size = NEIGHBORHOOD_ALLOCATION_INCREMENT + neighborhood.beadids = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(ns_int)) + ###Modified here + neighborhood.beaddist = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(real)) + ### + if neighborhood.beadids == NULL: + abort() + + for zi in range(3): + for yi in range(3): + for xi in range(3): + # Calculate and/or reinitialize shifted coordinates + shifted_coord[XX] = current_coords[XX] + (xi - 1) * grid.cellsize[XX] + shifted_coord[YY] = current_coords[YY] + (yi - 1) * grid.cellsize[YY] + shifted_coord[ZZ] = current_coords[ZZ] + (zi - 1) * grid.cellsize[ZZ] + + # Make sure the shifted coordinates is inside the brick-shaped box + for m in range(DIM - 1, -1, -1): + + while shifted_coord[m] < 0: + for d in range(m+1): + shifted_coord[d] += box.c_pbcbox.box[m][d] + + + while shifted_coord[m] >= box.c_pbcbox.box[m][m]: + for d in range(m+1): + shifted_coord[d] -= box.c_pbcbox.box[m][d] + + # Get the cell index corresponding to the coord + cell_index = (shifted_coord[ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ + (shifted_coord[YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ + (shifted_coord[XX] / grid.cellsize[XX]) + + # Just a safeguard + if cell_index >= grid.size: + continue + + # Check the cell index was not already selected + skip = False + for icheck in range(nchecked): + if already_checked[icheck] == cell_index: + skip = True + break + if skip: + continue + + # Search for neighbors inside this cell + for i_bead in range(grid.nbeads[cell_index]): + bid = grid.beadids[cell_index][i_bead] + + box.fast_pbc_dx(current_coords, &neighborcoords[bid, XX], dx) + + d2 = rvec_norm2(dx) + + if d2 < cutoff2: + if d2 < EPSILON: # Don't add the current bead as its own neighbor! + continue + + # Update neighbor lists + neighborhood.beadids[neighborhood.size] = bid + ### Modified here + neighborhood.beaddist[neighborhood.size] = d2 + ### + neighborhood.size += 1 + + if neighborhood.size >= neighborhood.allocated_size: + neighborhood.allocated_size += NEIGHBORHOOD_ALLOCATION_INCREMENT + neighborhood.beadids = realloc( neighborhood.beadids, neighborhood.allocated_size * sizeof(ns_int)) + ###Modified here + neighborhood.beaddist = realloc( neighborhood.beaddist, neighborhood.allocated_size * sizeof(real)) + ### + if neighborhood.beadids == NULL: + abort() + ###Modified + if neighborhood.beaddist == NULL: + abort() + ### + # Register the cell as checked + already_checked[nchecked] = cell_index + nchecked += 1 + + return neighborhood + + +cdef ns_neighborhood_holder *ns_core_parallel(real[:, ::1] refcoords, + real[:, ::1] neighborcoords, + ns_grid *grid, + PBCBox box, + real cutoff, + int nthreads=-1) nogil: + cdef ns_int coordid, i, j + cdef ns_int ncoords = refcoords.shape[0] + cdef ns_int ncoords_neighbors = neighborcoords.shape[0] + cdef real cutoff2 = cutoff * cutoff + cdef ns_neighborhood_holder *holder + + cdef ns_int *neighbor_buf + cdef ns_int buf_size, ibuf + + if nthreads < 0: + nthreads = openmp.omp_get_num_threads() + + holder = create_neighborhood_holder() + if holder == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS holder\n", + sizeof(ns_int) * ncoords) + abort() + + holder.size = ncoords + holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) + if holder.neighborhoods == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS holder.neighborhoods (requested: %i bytes)\n", + sizeof(ns_neighborhood) * ncoords) + abort() + + # Here starts the real core and the iteration over coordinates + for coordid in prange(ncoords, schedule='dynamic', num_threads=nthreads): + holder.neighborhoods[coordid] = retrieve_neighborhood(&refcoords[coordid, XX], + neighborcoords, + grid, + box, + cutoff2) + holder.neighborhoods[coordid].cutoff = cutoff + + return holder + +cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, + real[:, ::1] neighborcoords, + ns_grid *grid, + PBCBox box, + real cutoff) nogil: + cdef ns_int coordid, i, j + cdef ns_int ncoords = refcoords.shape[0] + cdef ns_int ncoords_neighbors = neighborcoords.shape[0] + cdef real cutoff2 = cutoff * cutoff + cdef ns_neighborhood_holder *holder + + cdef ns_int *neighbor_buf + cdef ns_int buf_size, ibuf + + holder = create_neighborhood_holder() + if holder == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS holder\n", + sizeof(ns_int) * ncoords) + abort() + + holder.size = ncoords + holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) + if holder.neighborhoods == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS holder.neighborhoods (requested: %i bytes)\n", + sizeof(ns_neighborhood) * ncoords) + abort() + + # Here starts the real core and the iteration over coordinates + for coordid in range(ncoords): + holder.neighborhoods[coordid] = retrieve_neighborhood(&refcoords[coordid, XX], + neighborcoords, + grid, + box, + cutoff2) + holder.neighborhoods[coordid].cutoff = cutoff + + return holder + + +# Python interface +cdef class FastNS(object): + cdef PBCBox box + cdef readonly int nthreads + cdef readonly real[:, ::1] coords + cdef real[:, ::1] coords_bbox + cdef readonly real cutoff + cdef bint prepared + cdef ns_grid *grid + + + def __init__(self, box): + if box.shape != (3, 3): + raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") + + self.box = PBCBox(box) + + self.nthreads = 1 + + self.coords = None + self.coords_bbox = None + + self.cutoff = -1 + + self.prepared = False + + self.grid = malloc(sizeof(ns_grid)) + + + def __dealloc__(self): + #destroy_nsgrid(self.grid) + self.grid.size = 0 + + #free(self.grid) + + def set_nthreads(self, nthreads, silent=False): + import multiprocessing + + if nthreads > multiprocessing.cpu_count(): + print("Warning: the number of threads requested if greater than the number of cores available. Performances may not be optimal!") + + if not silent: + print("Number of threads for NS adjusted to {}.".format(nthreads)) + + self.nthreads = nthreads + + + def set_coords(self, real[:, ::1] coords): + self.coords = coords + + # Make sure atoms are inside the brick-shaped box + self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) + + self.prepared = False + + + def set_cutoff(self, real cutoff): + self.cutoff = cutoff + + self.prepared = False + + + def prepare(self, force=False): + cdef ns_int i + cdef bint initialization_ok + + if self.prepared and not force: + print("NS already prepared, nothing to do!") + + if self.coords is None: + raise ValueError("Coordinates must be set before NS preparation!") + + if self.cutoff < 0: + raise ValueError("Cutoff must be set before NS preparation!") + + with nogil: + initialization_ok = False + + # Initializing grid + for i in range(DIM): + self.grid.ncells[i] = (self.box.c_pbcbox.box[i][i] / self.cutoff) + if self.grid.ncells[i] == 0: + self.grid.ncells[i] = 1 + self.grid.cellsize[i] = self.box.c_pbcbox.box[i][i] / self.grid.ncells[i] + + self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] + + # Populating grid + if populate_grid(self.grid, self.coords_bbox) == RET_OK: + initialization_ok = True + + + if initialization_ok: + self.prepared = True + else: + raise RuntimeError("Could not initialize NS grid") + + + def search(self, real[:, ::1]search_coords, return_ids=False): + cdef real[:, ::1] search_coords_bbox + cdef ns_int nid, i, j + cdef ns_neighborhood_holder *holder + cdef ns_neighborhood *neighborhood + + if not self.prepared: + self.prepare() + + + # Make sure atoms are inside the brick-shaped box + search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords) + + + with nogil: + # Retrieve neighbors from grid + if self.nthreads == 1: + holder = ns_core(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff) + else: + holder = ns_core_parallel(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff, self.nthreads) + + + + neighbors = [] + ###Modify for distance + sqdist = [] + indx = [] + ### + for nid in range(holder.size): + neighborhood = holder.neighborhoods[nid] + + if return_ids: + neighborhood_py = np.empty(neighborhood.size, dtype=np.int64) + ###Modify for distance + neighborhood_dis = np.empty(neighborhood.size, dtype=np.float32) + neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) + ### + for i in range(neighborhood.size): + neighborhood_py[i] = neighborhood.beadids[i] + ###Modify for distance + neighborhood_dis[i] = neighborhood.beaddist[i] + ### + else: + neighborhood_py = np.empty((neighborhood.size, DIM), dtype=np.float32) + ###Modify for distance + neighborhood_dis = np.empty((neighborhood.size), dtype=np.float32) + neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) + ### + for i in range(neighborhood.size): + ###Modify for distance + neighborhood_dis[i] = neighborhood.beaddist[i] + neighborhood_indx[i] = neighborhood.beadids[i] + ### + + for j in range(DIM): + neighborhood_py[i,j] = self.coords[neighborhood.beadids[i], j] + + neighbors.append(neighborhood_py) + sqdist.append(neighborhood_dis) + indx.append(neighborhood_indx) + + # Free Memory + free_neighborhood_holder(holder) + + return neighbors, sqdist, indx + + + +__version__ = "26" \ No newline at end of file diff --git a/package/setup.py b/package/setup.py index 6e9a7b381c0..bd3aceec8df 100755 --- a/package/setup.py +++ b/package/setup.py @@ -380,9 +380,16 @@ def extensions(config): libraries=mathlib, define_macros=define_macros, extra_compile_args=extra_compile_args) + grid = MDAExtension('MDAnalysis.lib.grid', + ['MDAnalysis/lib/c_gridsearch' + source_suffix], + include_dirs=include_dirs, + libraries=mathlib + parallel_libraries, + define_macros=define_macros + parallel_macros, + extra_compile_args=extra_compile_args + parallel_args, + extra_link_args=parallel_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, - ap_clustering, spe_dimred, cutil, augment] + ap_clustering, spe_dimred, grid] cython_generated = [] if use_cython: From c3e227a863d5a505b453b0ce0167e5c8e406e0d9 Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 25 Jun 2018 22:06:44 -0700 Subject: [PATCH 326/455] removed the parallel handler to remove hard dependency on omp.h, can be added again for conditional compilation --- package/MDAnalysis/lib/c_gridsearch.pyx | 104 +----------------------- 1 file changed, 2 insertions(+), 102 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 82d7192544a..0a8089b9ef1 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -1,22 +1,3 @@ -# -*- coding: utf-8; Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 -# -# Copyright (C) 2013-2016 Sébastien Buchoux -# -# This file is part of FATSLiM. -# -# FATSLiM is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# FATSLiM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with FATSLiM. If not, see . #cython: cdivision=True #cython: boundscheck=False @@ -34,22 +15,14 @@ DEF GRID_ALLOCATION_INCREMENT = 50 DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 - -# Cython C imports (no Python here!) -from cython.parallel cimport prange from libc.stdlib cimport malloc, realloc, free, abort from libc.stdio cimport fprintf, stderr from libc.math cimport sqrt from libc.math cimport abs as real_abs -cimport openmp - - -# Python imports import numpy as np cimport numpy as np -# Ctypes ctypedef np.int_t ns_int ctypedef np.float32_t real ctypedef real rvec[DIM] @@ -93,7 +66,6 @@ cdef struct cPBCBox_t: ns_int[DIM] tric_shift[MAX_NTRICVEC] real[DIM] tric_vec[MAX_NTRICVEC] -# noinspection PyNoneFunctionAssignment cdef class PBCBox(object): cdef cPBCBox_t c_pbcbox cdef rvec center @@ -271,8 +243,6 @@ cdef class PBCBox(object): def put_atoms_in_bbox(self, real[:,::1] coords): return np.asarray(self.fast_put_atoms_in_bbox(coords)) - - ######################################################################################################################## # # Neighbor Search Stuff @@ -495,50 +465,6 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei nchecked += 1 return neighborhood - - -cdef ns_neighborhood_holder *ns_core_parallel(real[:, ::1] refcoords, - real[:, ::1] neighborcoords, - ns_grid *grid, - PBCBox box, - real cutoff, - int nthreads=-1) nogil: - cdef ns_int coordid, i, j - cdef ns_int ncoords = refcoords.shape[0] - cdef ns_int ncoords_neighbors = neighborcoords.shape[0] - cdef real cutoff2 = cutoff * cutoff - cdef ns_neighborhood_holder *holder - - cdef ns_int *neighbor_buf - cdef ns_int buf_size, ibuf - - if nthreads < 0: - nthreads = openmp.omp_get_num_threads() - - holder = create_neighborhood_holder() - if holder == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS holder\n", - sizeof(ns_int) * ncoords) - abort() - - holder.size = ncoords - holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) - if holder.neighborhoods == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS holder.neighborhoods (requested: %i bytes)\n", - sizeof(ns_neighborhood) * ncoords) - abort() - - # Here starts the real core and the iteration over coordinates - for coordid in prange(ncoords, schedule='dynamic', num_threads=nthreads): - holder.neighborhoods[coordid] = retrieve_neighborhood(&refcoords[coordid, XX], - neighborcoords, - grid, - box, - cutoff2) - holder.neighborhoods[coordid].cutoff = cutoff - - return holder - cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, real[:, ::1] neighborcoords, ns_grid *grid, @@ -577,7 +503,6 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, return holder - # Python interface cdef class FastNS(object): cdef PBCBox box @@ -610,21 +535,7 @@ cdef class FastNS(object): def __dealloc__(self): #destroy_nsgrid(self.grid) self.grid.size = 0 - - #free(self.grid) - - def set_nthreads(self, nthreads, silent=False): - import multiprocessing - - if nthreads > multiprocessing.cpu_count(): - print("Warning: the number of threads requested if greater than the number of cores available. Performances may not be optimal!") - - if not silent: - print("Number of threads for NS adjusted to {}.".format(nthreads)) - - self.nthreads = nthreads - - + def set_coords(self, real[:, ::1] coords): self.coords = coords @@ -689,15 +600,8 @@ cdef class FastNS(object): # Make sure atoms are inside the brick-shaped box search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords) - with nogil: - # Retrieve neighbors from grid - if self.nthreads == 1: - holder = ns_core(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff) - else: - holder = ns_core_parallel(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff, self.nthreads) - - + holder = ns_core(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff) neighbors = [] ###Modify for distance @@ -741,7 +645,3 @@ cdef class FastNS(object): free_neighborhood_holder(holder) return neighbors, sqdist, indx - - - -__version__ = "26" \ No newline at end of file From 007d47da7c410289fa65d71f5420e6a95cc4bb17 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 30 Jun 2018 01:23:12 -0700 Subject: [PATCH 327/455] added the license header --- package/MDAnalysis/lib/c_gridsearch.pyx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 0a8089b9ef1..a4e8745aec4 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -1,3 +1,22 @@ +# -*- coding: utf-8; Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# Copyright (C) 2013-2016 Sébastien Buchoux +# +# This file is part of FATSLiM. +# +# FATSLiM is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# FATSLiM is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with FATSLiM. If not, see . #cython: cdivision=True #cython: boundscheck=False From fc61e5e1ef60360bada560addbe4f5782e955c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 1 Jul 2018 14:06:40 +0200 Subject: [PATCH 328/455] Added MDAnalysis header file to c_gridsearch.pyx --- package/MDAnalysis/lib/c_gridsearch.pyx | 32 +++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index a4e8745aec4..ac73c97a5a2 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -1,22 +1,28 @@ -# -*- coding: utf-8; Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # -# Copyright (C) 2013-2016 Sébastien Buchoux +# MDAnalysis --- https://www.mdanalysis.org # -# This file is part of FATSLiM. +# Copyright (C) 2013-2018 Sébastien Buchoux +# Copyright (c) 2018 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) # -# FATSLiM is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Released under the GNU Public Licence, v3 or any higher version # -# FATSLiM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Please cite your use of MDAnalysis in published work: # -# You should have received a copy of the GNU General Public License -# along with FATSLiM. If not, see . +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +# + #cython: cdivision=True #cython: boundscheck=False From 4b273a9c50b6235713b52920537c9107a799884a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 1 Jul 2018 16:53:22 +0200 Subject: [PATCH 329/455] Corrected C (de)allocation in c_gridsearch.pyx. Should fix memory leak --- package/MDAnalysis/lib/c_gridsearch.pyx | 32 +++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index ac73c97a5a2..2a7af4b33b7 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -145,16 +145,15 @@ cdef class PBCBox(object): # Update shift vectors self.c_pbcbox.ntric_vec = 0 - # We will only use single shifts, but we will check a few - # more shifts to see if there is a limiting distance - # above which we can not be sure of the correct distance. - for kk in range(5): + + # We will only use single shifts + for kk in range(3): k = order[kk] - for jj in range(5): + for jj in range(3): j = order[jj] - for ii in range(5): + for ii in range(3): i = order[ii] # A shift is only useful when it is trilinic @@ -177,8 +176,8 @@ cdef class PBCBox(object): else: pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) - d2old += sqrt(pos[d]) - d2new += sqrt(pos[d] + trial[d]) + d2old += pos[d]**2 + d2new += (pos[d] + trial[d])**2 if BOX_MARGIN*d2new < d2old: if not (j < -1 or j > 1 or k < -1 or k > 1): @@ -196,7 +195,7 @@ cdef class PBCBox(object): d2new_c = 0 for d in range(DIM): - d2new_c += sqrt(pos[d] + trial[d] - shift*box[dd, d]) + d2new_c += (pos[d] + trial[d] - shift*box[dd, d])**2 if d2new_c <= BOX_MARGIN*d2new: use = False @@ -209,7 +208,13 @@ cdef class PBCBox(object): % MAX_NTRICVEC) print(" There is probably something wrong with " "your box.") - print(box) + print(np.array(box)) + + for i in range(self.c_pbcbox.ntric_vec): + print(" -> shift #{}: [{}, {}, {}]".format(i+1, + self.c_pbcbox.tric_shift[i][XX], + self.c_pbcbox.tric_shift[i][YY], + self.c_pbcbox.tric_shift[i][ZZ])) else: for d in range(DIM): self.c_pbcbox.tric_vec[self.c_pbcbox.ntric_vec][d] = \ @@ -539,6 +544,9 @@ cdef class FastNS(object): cdef ns_grid *grid + def __cinit__(self): + self.grid = malloc(sizeof(ns_grid)) + def __init__(self, box): if box.shape != (3, 3): raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") @@ -554,11 +562,9 @@ cdef class FastNS(object): self.prepared = False - self.grid = malloc(sizeof(ns_grid)) - def __dealloc__(self): - #destroy_nsgrid(self.grid) + destroy_nsgrid(self.grid) self.grid.size = 0 def set_coords(self, real[:, ::1] coords): From 02b5819a8480a69fdb09bd708155f7d38f29eeb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 1 Jul 2018 16:54:21 +0200 Subject: [PATCH 330/455] Added Tests for grid search. Added grid in MDAnalysis.lib.__init__ --- package/MDAnalysis/lib/__init__.py | 3 +- .../MDAnalysisTests/lib/test_gridsearch.py | 81 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 testsuite/MDAnalysisTests/lib/test_gridsearch.py diff --git a/package/MDAnalysis/lib/__init__.py b/package/MDAnalysis/lib/__init__.py index 51c148dde65..a740bd8d5bf 100644 --- a/package/MDAnalysis/lib/__init__.py +++ b/package/MDAnalysis/lib/__init__.py @@ -29,7 +29,7 @@ from __future__ import absolute_import __all__ = ['log', 'transformations', 'util', 'mdamath', 'distances', - 'NeighborSearch', 'formats', 'pkdtree'] + 'NeighborSearch', 'formats', 'pkdtree', 'grid'] from . import log from . import transformations @@ -39,3 +39,4 @@ from . import NeighborSearch from . import formats from . import pkdtree +from . import grid \ No newline at end of file diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_gridsearch.py new file mode 100644 index 00000000000..cab23f3f372 --- /dev/null +++ b/testsuite/MDAnalysisTests/lib/test_gridsearch.py @@ -0,0 +1,81 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2018 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +from __future__ import print_function, absolute_import + +import pytest +from numpy.testing import assert_equal +import numpy as np + +import MDAnalysis as mda +from MDAnalysis.lib import grid +from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.mdamath import triclinic_vectors + +from MDAnalysisTests.datafiles import GRO + +@pytest.fixture +def universe(): + u = mda.Universe(GRO) + return u + +def run_search(universe, ref_id): + cutoff = 3 + + coords = universe.atoms.positions + ref_pos = coords[ref_id] + triclinic_box = triclinic_vectors(universe.dimensions) + + # Run pkdtree search + pkdt = PeriodicKDTree(universe.atoms.dimensions, bucket_size=10) + pkdt.set_coords(coords) + pkdt.search(ref_pos, cutoff) + + results_pkdtree = pkdt.get_indices() + results_pkdtree.remove(ref_id) + results_pkdtree = np.array(results_pkdtree) + results_pkdtree.sort() + + # Run grid search + searcher = grid.FastNS(triclinic_box) + searcher.set_cutoff(cutoff) + searcher.set_coords(coords) + searcher.prepare() + + results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0][0] + results_grid.sort() + + return results_pkdtree, results_grid + +def test_gridsearch(universe): + """Check that pkdtree and grid search return the same results (No PBC needed)""" + + ref_id = 0 + results_pkdtree, results_grid = run_search(universe, ref_id) + assert_equal(results_pkdtree, results_grid) + +def test_gridsearch_PBC(universe): + """Check that pkdtree and grid search return the same results (PBC needed)""" + + ref_id = 13937 + results_pkdtree, results_grid = run_search(universe, ref_id) + assert_equal(results_pkdtree, results_grid) From 0f35031499d97ed8e0bbbd429080a9e5c68af8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Wed, 4 Jul 2018 16:17:11 +0200 Subject: [PATCH 331/455] Removed pointer to nsgrid structure to avoid need to free it --- package/MDAnalysis/lib/c_gridsearch.pyx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 2a7af4b33b7..7a6de80389d 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -42,8 +42,7 @@ DEF MAX_NTRICVEC=12 from libc.stdlib cimport malloc, realloc, free, abort from libc.stdio cimport fprintf, stderr -from libc.math cimport sqrt -from libc.math cimport abs as real_abs + import numpy as np cimport numpy as np @@ -541,11 +540,7 @@ cdef class FastNS(object): cdef real[:, ::1] coords_bbox cdef readonly real cutoff cdef bint prepared - cdef ns_grid *grid - - - def __cinit__(self): - self.grid = malloc(sizeof(ns_grid)) + cdef ns_grid grid def __init__(self, box): if box.shape != (3, 3): @@ -562,9 +557,11 @@ cdef class FastNS(object): self.prepared = False + self.grid.size = 0 + def __dealloc__(self): - destroy_nsgrid(self.grid) + destroy_nsgrid(&self.grid) self.grid.size = 0 def set_coords(self, real[:, ::1] coords): @@ -608,7 +605,7 @@ cdef class FastNS(object): self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] # Populating grid - if populate_grid(self.grid, self.coords_bbox) == RET_OK: + if populate_grid(&self.grid, self.coords_bbox) == RET_OK: initialization_ok = True @@ -632,7 +629,7 @@ cdef class FastNS(object): search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords) with nogil: - holder = ns_core(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff) + holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) neighbors = [] ###Modify for distance From bdad5e3b3b38bb4ac96ec2b1dce58af4b067bc56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Wed, 4 Jul 2018 18:13:41 +0200 Subject: [PATCH 332/455] Removed abort() from c_gridsearch.pyx --- package/MDAnalysis/lib/c_gridsearch.pyx | 131 +++++++----------- .../MDAnalysisTests/lib/test_gridsearch.py | 2 +- 2 files changed, 48 insertions(+), 85 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 7a6de80389d..6008f0387dd 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -31,18 +31,19 @@ DEF DIM = 3 DEF XX = 0 DEF YY = 1 DEF ZZ = 2 + +DEF RET_ALLOCATIONERROR = 2 DEF RET_OK = 1 DEF RET_ERROR = 0 DEF EPSILON = 1e-5 + DEF NEIGHBORHOOD_ALLOCATION_INCREMENT = 50 DEF GRID_ALLOCATION_INCREMENT = 50 DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 -from libc.stdlib cimport malloc, realloc, free, abort -from libc.stdio cimport fprintf, stderr - +from libc.stdlib cimport malloc, realloc, free import numpy as np cimport numpy as np @@ -64,8 +65,7 @@ cdef struct ns_neighborhood: ns_int allocated_size ns_int size ns_int *beadids - real *beaddist - ### + cdef struct ns_neighborhood_holder: ns_int size ns_neighborhood **neighborhoods @@ -80,6 +80,7 @@ cdef void rvec_clear(rvec a) nogil: a[YY]=0.0 a[ZZ]=0.0 + cdef struct cPBCBox_t: matrix box rvec fbox_diag @@ -90,6 +91,8 @@ cdef struct cPBCBox_t: ns_int[DIM] tric_shift[MAX_NTRICVEC] real[DIM] tric_vec[MAX_NTRICVEC] + +# Class to handle PBC calculations cdef class PBCBox(object): cdef cPBCBox_t c_pbcbox cdef rvec center @@ -232,6 +235,7 @@ cdef class PBCBox(object): raise ValueError("Box does not correspond to PBC=xyz") self.fast_update(box) + cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: cdef ns_int i, j cdef rvec dx_start, trial @@ -284,20 +288,6 @@ cdef struct ns_grid: ns_int *nbeads ns_int **beadids -cdef ns_grid initialize_nsgrid(matrix box, - float cutoff) nogil: - cdef ns_grid grid - cdef ns_int i - - for i in range(DIM): - grid.ncells[i] = (box[i][i] / cutoff) - if grid.ncells[i] == 0: - grid.ncells[i] = 1 - grid.cellsize[i] = box[i][i] / grid.ncells[i] - - grid.size = grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ] - return grid - cdef ns_int populate_grid(ns_grid *grid, real[:,::1] coords) nogil: cdef ns_int ncoords = coords.shape[0] @@ -323,15 +313,12 @@ cdef ns_int populate_grid_array(ns_grid *grid, # Allocate memory grid.nbeads = malloc(sizeof(ns_int) * grid_size) if grid.nbeads == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS grid.nbeads (requested: %i bytes)\n", - sizeof(ns_int) * grid_size) - abort() + return RET_ALLOCATIONERROR allocated_size = malloc(sizeof(ns_int) * grid_size) if allocated_size == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS allocated_size (requested: %i bytes)\n", - sizeof(ns_int) * grid_size) - abort() + # No need to free grid.nbeads as it will be freed by destroy_nsgrid + return RET_ALLOCATIONERROR for i in range(grid_size): grid.nbeads[i] = 0 @@ -339,16 +326,12 @@ cdef ns_int populate_grid_array(ns_grid *grid, grid.beadids = malloc(sizeof(ns_int *) * grid_size) if grid.beadids == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids (requested: %i bytes)\n", - sizeof(ns_int *) * grid_size) - abort() + return RET_ALLOCATIONERROR for i in range(grid_size): grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) if grid.beadids[i] == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids[i] (requested: %i bytes)\n", - sizeof(ns_int) * allocated_size[i]) - abort() + return RET_ALLOCATIONERROR # Get cell indices for coords for i in range(ncoords): @@ -380,6 +363,8 @@ cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: cdef ns_neighborhood_holder *holder holder = malloc(sizeof(ns_neighborhood_holder)) + holder.size = 0 + holder.neighborhoods = NULL return holder @@ -393,7 +378,9 @@ cdef void free_neighborhood_holder(ns_neighborhood_holder *holder) nogil: if holder.neighborhoods[i].beadids != NULL: free(holder.neighborhoods[i].beadids) free(holder.neighborhoods[i]) - free(holder.neighborhoods) + + if holder.neighborhoods != NULL: + free(holder.neighborhoods) free(holder) cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]neighborcoords, ns_grid *grid, PBCBox box, real cutoff2) nogil: @@ -409,16 +396,15 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei cdef ns_neighborhood *neighborhood = malloc(sizeof(ns_neighborhood)) if neighborhood == NULL: - abort() + return NULL neighborhood.size = 0 neighborhood.allocated_size = NEIGHBORHOOD_ALLOCATION_INCREMENT neighborhood.beadids = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(ns_int)) - ###Modified here - neighborhood.beaddist = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(real)) - ### + if neighborhood.beadids == NULL: - abort() + free(neighborhood) + return NULL for zi in range(3): for yi in range(3): @@ -472,28 +458,23 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei # Update neighbor lists neighborhood.beadids[neighborhood.size] = bid - ### Modified here - neighborhood.beaddist[neighborhood.size] = d2 - ### neighborhood.size += 1 if neighborhood.size >= neighborhood.allocated_size: neighborhood.allocated_size += NEIGHBORHOOD_ALLOCATION_INCREMENT neighborhood.beadids = realloc( neighborhood.beadids, neighborhood.allocated_size * sizeof(ns_int)) - ###Modified here - neighborhood.beaddist = realloc( neighborhood.beaddist, neighborhood.allocated_size * sizeof(real)) - ### + if neighborhood.beadids == NULL: - abort() - ###Modified - if neighborhood.beaddist == NULL: - abort() - ### + free(neighborhood) + return NULL + # Register the cell as checked already_checked[nchecked] = cell_index nchecked += 1 return neighborhood + + cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, real[:, ::1] neighborcoords, ns_grid *grid, @@ -510,16 +491,12 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, holder = create_neighborhood_holder() if holder == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS holder\n", - sizeof(ns_int) * ncoords) - abort() + return NULL - holder.size = ncoords holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) if holder.neighborhoods == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS holder.neighborhoods (requested: %i bytes)\n", - sizeof(ns_neighborhood) * ncoords) - abort() + free_neighborhood_holder(holder) + return NULL # Here starts the real core and the iteration over coordinates for coordid in range(ncoords): @@ -528,7 +505,12 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, grid, box, cutoff2) + if holder.neighborhoods[coordid] == NULL: + free_neighborhood_holder(holder) + return NULL + holder.neighborhoods[coordid].cutoff = cutoff + holder.size += 1 return holder @@ -580,7 +562,7 @@ cdef class FastNS(object): def prepare(self, force=False): - cdef ns_int i + cdef ns_int i, retcode cdef bint initialization_ok if self.prepared and not force: @@ -605,12 +587,11 @@ cdef class FastNS(object): self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] # Populating grid - if populate_grid(&self.grid, self.coords_bbox) == RET_OK: - initialization_ok = True - - - if initialization_ok: + retcode = populate_grid(&self.grid, self.coords_bbox) + if retcode == RET_OK: self.prepared = True + elif retcode == RET_ALLOCATIONERROR: + raise MemoryError("Could not allocate memory to initialize NS grid") else: raise RuntimeError("Could not initialize NS grid") @@ -631,45 +612,27 @@ cdef class FastNS(object): with nogil: holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) + if holder == NULL: + raise MemoryError("Could not allocate memory to run NS core") + neighbors = [] - ###Modify for distance - sqdist = [] - indx = [] - ### for nid in range(holder.size): neighborhood = holder.neighborhoods[nid] if return_ids: neighborhood_py = np.empty(neighborhood.size, dtype=np.int64) - ###Modify for distance - neighborhood_dis = np.empty(neighborhood.size, dtype=np.float32) - neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) - ### + for i in range(neighborhood.size): neighborhood_py[i] = neighborhood.beadids[i] - ###Modify for distance - neighborhood_dis[i] = neighborhood.beaddist[i] - ### else: neighborhood_py = np.empty((neighborhood.size, DIM), dtype=np.float32) - ###Modify for distance - neighborhood_dis = np.empty((neighborhood.size), dtype=np.float32) - neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) - ### for i in range(neighborhood.size): - ###Modify for distance - neighborhood_dis[i] = neighborhood.beaddist[i] - neighborhood_indx[i] = neighborhood.beadids[i] - ### - for j in range(DIM): neighborhood_py[i,j] = self.coords[neighborhood.beadids[i], j] neighbors.append(neighborhood_py) - sqdist.append(neighborhood_dis) - indx.append(neighborhood_indx) # Free Memory free_neighborhood_holder(holder) - return neighbors, sqdist, indx + return neighbors diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_gridsearch.py index cab23f3f372..c8d526e9074 100644 --- a/testsuite/MDAnalysisTests/lib/test_gridsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_gridsearch.py @@ -61,7 +61,7 @@ def run_search(universe, ref_id): searcher.set_coords(coords) searcher.prepare() - results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0][0] + results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0] results_grid.sort() return results_pkdtree, results_grid From f65e32bc89b930f638f81a0d87313ece89bdc471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sat, 7 Jul 2018 10:30:10 +0200 Subject: [PATCH 333/455] grid allocation moved to FastNS method --- package/MDAnalysis/lib/c_gridsearch.pyx | 158 ++++++++++-------------- 1 file changed, 67 insertions(+), 91 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 6008f0387dd..98d97eded65 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -32,13 +32,9 @@ DEF XX = 0 DEF YY = 1 DEF ZZ = 2 -DEF RET_ALLOCATIONERROR = 2 -DEF RET_OK = 1 -DEF RET_ERROR = 0 DEF EPSILON = 1e-5 DEF NEIGHBORHOOD_ALLOCATION_INCREMENT = 50 -DEF GRID_ALLOCATION_INCREMENT = 50 DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 @@ -288,77 +284,6 @@ cdef struct ns_grid: ns_int *nbeads ns_int **beadids -cdef ns_int populate_grid(ns_grid *grid, - real[:,::1] coords) nogil: - cdef ns_int ncoords = coords.shape[0] - cdef bint ret_val - - ret_val = populate_grid_array(grid, - &coords[0, 0], - ncoords) - - return ret_val - -cdef ns_int populate_grid_array(ns_grid *grid, - rvec *coords, - ns_int ncoords) nogil: - cdef ns_int i, cellindex = -1 - cdef ns_int grid_size = grid.size - cdef ns_int *allocated_size = NULL - - if grid_size != grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ]: # Grid not initialized - return RET_ERROR - - - # Allocate memory - grid.nbeads = malloc(sizeof(ns_int) * grid_size) - if grid.nbeads == NULL: - return RET_ALLOCATIONERROR - - allocated_size = malloc(sizeof(ns_int) * grid_size) - if allocated_size == NULL: - # No need to free grid.nbeads as it will be freed by destroy_nsgrid - return RET_ALLOCATIONERROR - - for i in range(grid_size): - grid.nbeads[i] = 0 - allocated_size[i] = GRID_ALLOCATION_INCREMENT - - grid.beadids = malloc(sizeof(ns_int *) * grid_size) - if grid.beadids == NULL: - return RET_ALLOCATIONERROR - - for i in range(grid_size): - grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) - if grid.beadids[i] == NULL: - return RET_ALLOCATIONERROR - - # Get cell indices for coords - for i in range(ncoords): - cellindex = (coords[i][ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ - (coords[i][YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ - (coords[i][XX] / grid.cellsize[XX]) - - grid.beadids[cellindex][grid.nbeads[cellindex]] = i - grid.nbeads[cellindex] += 1 - - if grid.nbeads[cellindex] >= allocated_size[cellindex]: - allocated_size[cellindex] += GRID_ALLOCATION_INCREMENT - grid.beadids[cellindex] = realloc( grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) - free(allocated_size) - return RET_OK - -cdef void destroy_nsgrid(ns_grid *grid) nogil: - cdef ns_int i - if grid.nbeads != NULL: - free(grid.nbeads) - - for i in range(grid.size): - if grid.beadids[i] != NULL: - free(grid.beadids[i]) - free(grid.beadids) - - cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: cdef ns_neighborhood_holder *holder @@ -517,7 +442,6 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, # Python interface cdef class FastNS(object): cdef PBCBox box - cdef readonly int nthreads cdef readonly real[:, ::1] coords cdef real[:, ::1] coords_bbox cdef readonly real cutoff @@ -530,8 +454,6 @@ cdef class FastNS(object): self.box = PBCBox(box) - self.nthreads = 1 - self.coords = None self.coords_bbox = None @@ -543,7 +465,15 @@ cdef class FastNS(object): def __dealloc__(self): - destroy_nsgrid(&self.grid) + cdef ns_int i + if self.grid.nbeads != NULL: + free(self.grid.nbeads) + + for i in range(self.grid.size): + if self.grid.beadids[i] != NULL: + free(self.grid.beadids[i]) + free(self.grid.beadids) + self.grid.size = 0 def set_coords(self, real[:, ::1] coords): @@ -562,8 +492,11 @@ cdef class FastNS(object): def prepare(self, force=False): - cdef ns_int i, retcode - cdef bint initialization_ok + cdef ns_int i, cellindex = -1 + cdef ns_int *allocated_size = NULL + cdef ns_int ncoords = self.coords.shape[0] + cdef ns_int allocation_guess + cdef rvec *coords = &self.coords_bbox[0, 0] if self.prepared and not force: print("NS already prepared, nothing to do!") @@ -575,7 +508,6 @@ cdef class FastNS(object): raise ValueError("Cutoff must be set before NS preparation!") with nogil: - initialization_ok = False # Initializing grid for i in range(DIM): @@ -583,17 +515,61 @@ cdef class FastNS(object): if self.grid.ncells[i] == 0: self.grid.ncells[i] = 1 self.grid.cellsize[i] = self.box.c_pbcbox.box[i][i] / self.grid.ncells[i] - self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] - # Populating grid - retcode = populate_grid(&self.grid, self.coords_bbox) - if retcode == RET_OK: - self.prepared = True - elif retcode == RET_ALLOCATIONERROR: - raise MemoryError("Could not allocate memory to initialize NS grid") - else: - raise RuntimeError("Could not initialize NS grid") + # This is just a guess on how much memory we might for each grid cell: + # we just assume an average bead density and we take four times this density just to be safe + allocation_guess = (4 * (ncoords / self.grid.size + 1)) + + # Allocate memory for the grid + self.grid.nbeads = malloc(sizeof(ns_int) * self.grid.size) + if self.grid.nbeads == NULL: + with gil: + raise MemoryError("Could not allocate memory for NS grid") + + # Allocate memory from temporary allocation counter + allocated_size = malloc(sizeof(ns_int) * self.grid.size) + if allocated_size == NULL: + # No need to free grid.nbeads as it will be freed by destroy_nsgrid called by __dealloc___ + with gil: + raise MemoryError("Could not allocate memory for allocation buffer") + + # Pre-allocate some memory for grid cells + for i in range(self.grid.size): + self.grid.nbeads[i] = 0 + allocated_size[i] = allocation_guess + + self.grid.beadids = malloc(sizeof(ns_int *) * self.grid.size) + if self.grid.beadids == NULL: + with gil: + raise MemoryError("Could not allocate memory for grid cells") + + for i in range(self.grid.size): + self.grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) + if self.grid.beadids[i] == NULL: + with gil: + raise MemoryError("Could not allocate memory for grid cell") + + # Populate grid cells using the coordinates (ie do the heavy work) + for i in range(ncoords): + cellindex = (coords[i][ZZ] / self.grid.cellsize[ZZ]) * (self.grid.ncells[XX] * self.grid.ncells[YY]) +\ + (coords[i][YY] / self.grid.cellsize[YY]) * self.grid.ncells[XX] + \ + (coords[i][XX] / self.grid.cellsize[XX]) + + self.grid.beadids[cellindex][self.grid.nbeads[cellindex]] = i + self.grid.nbeads[cellindex] += 1 + + # We need to allocate more memory (simply double the amount of memory as + # 1. it should barely be needed + # 2. the size should stay fairly reasonable + if self.grid.nbeads[cellindex] >= allocated_size[cellindex]: + allocated_size[cellindex] *= 2 + self.grid.beadids[cellindex] = realloc( self.grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) + + # Now we can free the allocation buffer + free(allocated_size) + + self.prepared = True def search(self, real[:, ::1]search_coords, return_ids=False): From ff33b2f62769b32241f0860af7b66ecfdbcfda42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 8 Jul 2018 10:35:17 +0200 Subject: [PATCH 334/455] NSResults object added to store results from NS. Started documentation --- package/MDAnalysis/lib/c_gridsearch.pyx | 235 ++++++++++++++++-- .../source/documentation_pages/lib/grid.rst | 2 + .../documentation_pages/lib_modules.rst | 2 + .../MDAnalysisTests/lib/test_gridsearch.py | 79 +++++- 4 files changed, 282 insertions(+), 36 deletions(-) create mode 100644 package/doc/sphinx/source/documentation_pages/lib/grid.rst diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 98d97eded65..9c50a5b1777 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -25,6 +25,15 @@ #cython: cdivision=True #cython: boundscheck=False +#cython: initializedcheck=False + +""" +Neighbor search library --- :mod:`MDAnalysis.lib.grid` +====================================================== + +This Neighbor search library is a serialized Cython port of the NS grid search implemented in GROMACS. +""" + # Preprocessor DEFs DEF DIM = 3 @@ -40,6 +49,7 @@ DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 from libc.stdlib cimport malloc, realloc, free +from libc.math cimport sqrt import numpy as np cimport numpy as np @@ -248,16 +258,21 @@ cdef class PBCBox(object): for j in range (i, -1, -1): dx[j] += self.c_pbcbox.box[i][j] + cdef real fast_distance2(self, rvec a, rvec b) nogil: + cdef rvec dx + self.fast_pbc_dx(a, b, dx) + return rvec_norm2(dx) + + cdef real fast_distance(self, rvec a, rvec b) nogil: + return sqrt(self.fast_distance2(a,b)) + cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: cdef ns_int i, m, d, natoms, wd = 0 cdef real[:,::1] bbox_coords natoms = coords.shape[0] with gil: - if natoms == 0: - bbox_coords = np.empty((0, DIM)) - else: - bbox_coords = coords.copy() + bbox_coords = coords.copy() for i in range(natoms): for m in range(DIM - 1, -1, -1): @@ -270,6 +285,8 @@ cdef class PBCBox(object): return bbox_coords def put_atoms_in_bbox(self, real[:,::1] coords): + if coords.shape[0] == 0: + return np.zeros((0, DIM), dtype=np.float32) return np.asarray(self.fast_put_atoms_in_bbox(coords)) ######################################################################################################################## @@ -439,6 +456,167 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, return holder +cdef class NSResults(object): + """ + Class used to store results returned by `MDAnalysis.lib.grid.FastNS.search` + """ + cdef PBCBox box + cdef readonly real cutoff + cdef real[:, ::1] grid_coords + cdef real[:, ::1] ref_coords + cdef ns_int **nids + cdef ns_int *nsizes + cdef ns_int size + cdef list indices + cdef list coordinates + cdef list distances + + def __init__(self, PBCBox box, real cutoff): + self.box = box + self.cutoff = cutoff + + self.size = 0 + self.nids = NULL + self.nsizes = NULL + + self.grid_coords = None + self.ref_coords = None + + self.indices = None + self.coordinates = None + self.distances = None + + + cdef populate(self, ns_neighborhood_holder *holder, grid_coords, ref_coords): + cdef ns_int nid, i + cdef ns_neighborhood *neighborhood + + self.grid_coords = grid_coords.copy() + self.ref_coords = ref_coords.copy() + + # Allocate memory + self.nsizes = malloc(sizeof(ns_int) * holder.size) + if self.nsizes == NULL: + raise MemoryError("Could not allocate memory for NSResults") + + self.nids = malloc(sizeof(ns_int *) * holder.size) + if self.nids == NULL: + raise MemoryError("Could not allocate memory for NSResults") + + for nid in range(holder.size): + neighborhood = holder.neighborhoods[nid] + + self.nsizes[nid] = neighborhood.size + + self.nids[nid] = malloc(sizeof(ns_int *) * neighborhood.size) + if self.nids[nid] == NULL: + raise MemoryError("Could not allocate memory for NSResults") + + with nogil: + for nid in range(holder.size): + neighborhood = holder.neighborhoods[nid] + + for i in range(neighborhood.size): + self.nids[nid][i] = neighborhood.beadids[i] + + self.size = holder.size + + def __dealloc__(self): + if self.nids != NULL: + for i in range(self.size): + if self.nids[i] != NULL: + free(self.nids[i]) + free(self.nids) + + if self.nsizes != NULL: + free(self.nsizes) + + + def get_indices(self): + """ + Return Neighbors indices. + + :return: list of indices + """ + cdef ns_int i, nid, size + + if self.indices is None: + indices = [] + + for nid in range(self.size): + size = self.nsizes[nid] + + tmp_incides = np.empty((size), dtype=np.int) + + for i in range(size): + tmp_incides[i] = self.nids[nid][i] + + indices.append(tmp_incides) + + self.indices = indices + + return self.indices + + + def get_coordinates(self): + """ + Return coordinates of neighbors. + + :return: list of coordinates + """ + cdef ns_int i, nid, size, beadid + + if self.coordinates is None: + coordinates = [] + + for nid in range(self.size): + size = self.nsizes[nid] + + tmp_values = np.empty((size, DIM), dtype=np.float32) + + for i in range(size): + beadid = self.nids[nid][i] + tmp_values[i] = self.grid_coords[beadid] + + coordinates.append(tmp_values) + + self.coordinates = coordinates + + return self.coordinates + + + def get_distances(self): + """ + Return coordinates of neighbors. + + :return: list of distances + """ + cdef ns_int i, nid, size, j, beadid + cdef rvec ref, other, dx + cdef real dist + + if self.distances is None: + distances = [] + + for nid in range(self.size): + size = self.nsizes[nid] + + tmp_values = np.empty((size), dtype=np.float32) + ref = &self.ref_coords[nid, 0] + + for i in range(size): + beadid = self.nids[nid][i] + other = &self.grid_coords[beadid, 0] + + tmp_values[i] = self.box.fast_distance(ref, other) + + distances.append(tmp_values) + + self.distances = distances + + return self.distances + + # Python interface cdef class FastNS(object): cdef PBCBox box @@ -448,7 +626,14 @@ cdef class FastNS(object): cdef bint prepared cdef ns_grid grid - def __init__(self, box): + def __init__(self, u): + import MDAnalysis as mda + from MDAnalysis.lib.mdamath import triclinic_vectors + + if not isinstance(u, mda.Universe): + raise TypeError("FastNS class must be initialized with a valid MDAnalysis.Universe instance") + box = triclinic_vectors(u.dimensions) + if box.shape != (3, 3): raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") @@ -466,6 +651,7 @@ cdef class FastNS(object): def __dealloc__(self): cdef ns_int i + # Deallocate NS grid if self.grid.nbeads != NULL: free(self.grid.nbeads) @@ -475,7 +661,8 @@ cdef class FastNS(object): free(self.grid.beadids) self.grid.size = 0 - + + def set_coords(self, real[:, ::1] coords): self.coords = coords @@ -568,12 +755,12 @@ cdef class FastNS(object): # Now we can free the allocation buffer free(allocated_size) - self.prepared = True - def search(self, real[:, ::1]search_coords, return_ids=False): + def search(self, search_coords): cdef real[:, ::1] search_coords_bbox + cdef real[:, ::1] search_coords_view cdef ns_int nid, i, j cdef ns_neighborhood_holder *holder cdef ns_neighborhood *neighborhood @@ -581,9 +768,18 @@ cdef class FastNS(object): if not self.prepared: self.prepare() + # Check the shape of search_coords as a array of 3D coords if needed + shape = search_coords.shape + if len(shape) == 1: + if not shape[0] == 3: + raise ValueError("Coordinates must be 3D") + else: + search_coords_view = np.array([search_coords,], dtype=np.float32) + else: + search_coords_view = search_coords # Make sure atoms are inside the brick-shaped box - search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords) + search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords_view) with nogil: holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) @@ -591,24 +787,11 @@ cdef class FastNS(object): if holder == NULL: raise MemoryError("Could not allocate memory to run NS core") - neighbors = [] - for nid in range(holder.size): - neighborhood = holder.neighborhoods[nid] - if return_ids: - neighborhood_py = np.empty(neighborhood.size, dtype=np.int64) - - for i in range(neighborhood.size): - neighborhood_py[i] = neighborhood.beadids[i] - else: - neighborhood_py = np.empty((neighborhood.size, DIM), dtype=np.float32) - for i in range(neighborhood.size): - for j in range(DIM): - neighborhood_py[i,j] = self.coords[neighborhood.beadids[i], j] - - neighbors.append(neighborhood_py) + results = NSResults(self.box, self.cutoff) + results.populate(holder, self.coords, search_coords_view) - # Free Memory + # Free memory allocated to holder free_neighborhood_holder(holder) - return neighbors + return results diff --git a/package/doc/sphinx/source/documentation_pages/lib/grid.rst b/package/doc/sphinx/source/documentation_pages/lib/grid.rst new file mode 100644 index 00000000000..a6143e9ca38 --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/lib/grid.rst @@ -0,0 +1,2 @@ +.. automodule:: MDAnalysis.lib.grid + :members: \ No newline at end of file diff --git a/package/doc/sphinx/source/documentation_pages/lib_modules.rst b/package/doc/sphinx/source/documentation_pages/lib_modules.rst index 5bbe3d041ed..83d7f81cfd9 100644 --- a/package/doc/sphinx/source/documentation_pages/lib_modules.rst +++ b/package/doc/sphinx/source/documentation_pages/lib_modules.rst @@ -36,6 +36,7 @@ functions whereas mathematical functions are to be found in :mod:`MDAnalysis.lib.NeighborSearch` contains classes to do neighbor searches with MDAnalysis objects. +:mod:`MDAnalysis.lib.grid` contains a fast implementation of grid neighbor search. List of modules --------------- @@ -50,6 +51,7 @@ List of modules ./lib/transformations ./lib/qcprot ./lib/util + ./lib/grid Low level file formats ---------------------- diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_gridsearch.py index c8d526e9074..359d32544b7 100644 --- a/testsuite/MDAnalysisTests/lib/test_gridsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_gridsearch.py @@ -23,27 +23,46 @@ from __future__ import print_function, absolute_import import pytest -from numpy.testing import assert_equal +from numpy.testing import assert_equal, assert_allclose import numpy as np import MDAnalysis as mda from MDAnalysis.lib import grid from MDAnalysis.lib.pkdtree import PeriodicKDTree -from MDAnalysis.lib.mdamath import triclinic_vectors from MDAnalysisTests.datafiles import GRO + @pytest.fixture def universe(): u = mda.Universe(GRO) return u + +@pytest.fixture +def grid_results(): + u = mda.Universe(GRO) + cutoff = 2 + ref_pos = u.atoms.positions[13937] + return run_grid_search(u, ref_pos, cutoff) + + +def run_grid_search(u, ref_pos, cutoff): + coords = u.atoms.positions + + # Run grid search + searcher = grid.FastNS(u) + searcher.set_cutoff(cutoff) + searcher.set_coords(coords) + searcher.prepare() + + return searcher.search(ref_pos) + + def run_search(universe, ref_id): cutoff = 3 - coords = universe.atoms.positions ref_pos = coords[ref_id] - triclinic_box = triclinic_vectors(universe.dimensions) # Run pkdtree search pkdt = PeriodicKDTree(universe.atoms.dimensions, bucket_size=10) @@ -56,16 +75,13 @@ def run_search(universe, ref_id): results_pkdtree.sort() # Run grid search - searcher = grid.FastNS(triclinic_box) - searcher.set_cutoff(cutoff) - searcher.set_coords(coords) - searcher.prepare() - - results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0] + results_grid = run_grid_search(universe, ref_pos, cutoff) + results_grid = results_grid.get_indices()[0] results_grid.sort() return results_pkdtree, results_grid + def test_gridsearch(universe): """Check that pkdtree and grid search return the same results (No PBC needed)""" @@ -73,9 +89,52 @@ def test_gridsearch(universe): results_pkdtree, results_grid = run_search(universe, ref_id) assert_equal(results_pkdtree, results_grid) + def test_gridsearch_PBC(universe): """Check that pkdtree and grid search return the same results (PBC needed)""" ref_id = 13937 results_pkdtree, results_grid = run_search(universe, ref_id) assert_equal(results_pkdtree, results_grid) + + +def test_gridsearch_arraycoord(universe): + """Check the NS routine accepts a single bead coordinate as well as array of coordinates""" + cutoff = 2 + ref_pos = universe.atoms.positions[:5] + + results = [ + np.array([2, 1, 4, 3]), + np.array([2, 0, 3]), + np.array([0, 1, 3]), + np.array([ 2, 0, 1, 38341]), + np.array([ 6, 0, 5, 17]) + ] + + results_grid = run_grid_search(universe, ref_pos, cutoff).get_indices() + + assert_equal(results_grid, results) + + +def test_gridsearch_search_coordinates(grid_results): + """Check the NS routine can return coordinates instead of ids""" + + results = np.array( + [ + [40.32, 34.25, 55.9], + [0.61, 76.33, -0.56], + [0.48999998, 75.9, 0.19999999], + [-0.11, 76.19, 0.77] + ]) + + assert_allclose(grid_results.get_coordinates()[0], results) + + +def test_gridsearch_search_distances(grid_results): + """Check the NS routine can return PBC distances from neighbors""" + results = np.array([0.096, 0.096, 0.015, 0.179]) * 10 # These distances were obtained using gmx distance + results.sort() + + rounded_results = np.round(grid_results.get_distances()[0], 2) + + assert_allclose(sorted(rounded_results), results) \ No newline at end of file From 579fa0088984fb4720e9b169eecf56184c6faefd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 8 Jul 2018 20:10:33 +0200 Subject: [PATCH 335/455] Corrected Memory Leak --- package/MDAnalysis/lib/c_gridsearch.pyx | 36 ++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 9c50a5b1777..1ece4c5a1d6 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -462,8 +462,8 @@ cdef class NSResults(object): """ cdef PBCBox box cdef readonly real cutoff - cdef real[:, ::1] grid_coords - cdef real[:, ::1] ref_coords + cdef np.ndarray grid_coords + cdef np.ndarray ref_coords cdef ns_int **nids cdef ns_int *nsizes cdef ns_int size @@ -471,6 +471,16 @@ cdef class NSResults(object): cdef list coordinates cdef list distances + def __dealloc__(self): + if self.nids != NULL: + for i in range(self.size): + if self.nids[i] != NULL: + free(self.nids[i]) + free(self.nids) + + if self.nsizes != NULL: + free(self.nsizes) + def __init__(self, PBCBox box, real cutoff): self.box = box self.cutoff = cutoff @@ -491,8 +501,8 @@ cdef class NSResults(object): cdef ns_int nid, i cdef ns_neighborhood *neighborhood - self.grid_coords = grid_coords.copy() - self.ref_coords = ref_coords.copy() + self.grid_coords = np.asarray(grid_coords) + self.ref_coords = np.asarray(ref_coords) # Allocate memory self.nsizes = malloc(sizeof(ns_int) * holder.size) @@ -521,17 +531,6 @@ cdef class NSResults(object): self.size = holder.size - def __dealloc__(self): - if self.nids != NULL: - for i in range(self.size): - if self.nids[i] != NULL: - free(self.nids[i]) - free(self.nids) - - if self.nsizes != NULL: - free(self.nsizes) - - def get_indices(self): """ Return Neighbors indices. @@ -594,6 +593,8 @@ cdef class NSResults(object): cdef ns_int i, nid, size, j, beadid cdef rvec ref, other, dx cdef real dist + cdef real[:, ::1] ref_coords = self.ref_coords + cdef real[:, ::1] grid_coords = self.grid_coords if self.distances is None: distances = [] @@ -602,11 +603,11 @@ cdef class NSResults(object): size = self.nsizes[nid] tmp_values = np.empty((size), dtype=np.float32) - ref = &self.ref_coords[nid, 0] + ref = &ref_coords[nid, 0] for i in range(size): beadid = self.nids[nid][i] - other = &self.grid_coords[beadid, 0] + other = &grid_coords[beadid, 0] tmp_values[i] = self.box.fast_distance(ref, other) @@ -787,7 +788,6 @@ cdef class FastNS(object): if holder == NULL: raise MemoryError("Could not allocate memory to run NS core") - results = NSResults(self.box, self.cutoff) results.populate(holder, self.coords, search_coords_view) From 0239d14bfdbe1cbb0f9b678b9dbb261a222c8c7e Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 25 Jun 2018 20:10:22 -0700 Subject: [PATCH 336/455] Added MDAnalysis/lib/c_search.pyx for Grid NS search --- package/MDAnalysis/lib/c_gridsearch.pyx | 797 ------------------------ 1 file changed, 797 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 1ece4c5a1d6..e69de29bb2d 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -1,797 +0,0 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 -# -# MDAnalysis --- https://www.mdanalysis.org -# -# Copyright (C) 2013-2018 Sébastien Buchoux -# Copyright (c) 2018 The MDAnalysis Development Team and contributors -# (see the file AUTHORS for the full list of names) -# -# Released under the GNU Public Licence, v3 or any higher version -# -# Please cite your use of MDAnalysis in published work: -# -# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, -# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. -# MDAnalysis: A Python package for the rapid analysis of molecular dynamics -# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th -# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. -# -# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. -# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. -# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 -# -# - -#cython: cdivision=True -#cython: boundscheck=False -#cython: initializedcheck=False - -""" -Neighbor search library --- :mod:`MDAnalysis.lib.grid` -====================================================== - -This Neighbor search library is a serialized Cython port of the NS grid search implemented in GROMACS. -""" - - -# Preprocessor DEFs -DEF DIM = 3 -DEF XX = 0 -DEF YY = 1 -DEF ZZ = 2 - -DEF EPSILON = 1e-5 - -DEF NEIGHBORHOOD_ALLOCATION_INCREMENT = 50 - -DEF BOX_MARGIN=1.0010 -DEF MAX_NTRICVEC=12 - -from libc.stdlib cimport malloc, realloc, free -from libc.math cimport sqrt - -import numpy as np -cimport numpy as np - -ctypedef np.int_t ns_int -ctypedef np.float32_t real -ctypedef real rvec[DIM] -ctypedef real matrix[DIM][DIM] - -cdef struct ns_grid: - ns_int size - ns_int[DIM] ncells - real[DIM] cellsize - ns_int *nbeads - ns_int **beadids - -cdef struct ns_neighborhood: - real cutoff - ns_int allocated_size - ns_int size - ns_int *beadids - -cdef struct ns_neighborhood_holder: - ns_int size - ns_neighborhood **neighborhoods - -# Useful stuff - -cdef real rvec_norm2(const rvec a) nogil: - return a[XX]*a[XX]+a[YY]*a[YY]+a[ZZ]*a[ZZ] - -cdef void rvec_clear(rvec a) nogil: - a[XX]=0.0 - a[YY]=0.0 - a[ZZ]=0.0 - - -cdef struct cPBCBox_t: - matrix box - rvec fbox_diag - rvec hbox_diag - rvec mhbox_diag - real max_cutoff2 - ns_int ntric_vec - ns_int[DIM] tric_shift[MAX_NTRICVEC] - real[DIM] tric_vec[MAX_NTRICVEC] - - -# Class to handle PBC calculations -cdef class PBCBox(object): - cdef cPBCBox_t c_pbcbox - cdef rvec center - cdef rvec bbox_center - - def __init__(self, real[:,::1] box): - self.update(box) - - cdef void fast_update(self, real[:,::1] box) nogil: - cdef ns_int i, j, k, d, jc, kc, shift - cdef real d2old, d2new, d2new_c - cdef rvec trial, pos - cdef ns_int ii, jj ,kk - cdef ns_int *order = [0, -1, 1, -2, 2] - cdef bint use - cdef real min_hv2, min_ss, tmp - - rvec_clear(self.center) - # Update matrix - for i in range(DIM): - for j in range(DIM): - self.c_pbcbox.box[i][j] = box[i, j] - self.center[j] += 0.5 * box[i, j] - self.bbox_center[i] = 0.5 * box[i, i] - - # Update diagonals - for i in range(DIM): - self.c_pbcbox.fbox_diag[i] = box[i, i] - self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 - self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] - - # Update maximum cutoff - - # Physical limitation of the cut-off - # by half the length of the shortest box vector. - min_hv2 = min(0.25 * rvec_norm2(&box[XX, XX]), 0.25 * rvec_norm2(&box[YY, XX])) - min_hv2 = min(min_hv2, 0.25 * rvec_norm2(&box[ZZ, XX])) - - # Limitation to the smallest diagonal element due to optimizations: - # checking only linear combinations of single box-vectors (2 in x) - # in the grid search and pbc_dx is a lot faster - # than checking all possible combinations. - tmp = box[YY, YY] - if box[ZZ, YY] < 0: - tmp -= box[ZZ, YY] - else: - tmp += box[ZZ, YY] - - min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) - - self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) - - # Update shift vectors - self.c_pbcbox.ntric_vec = 0 - - # We will only use single shifts - for kk in range(3): - k = order[kk] - - for jj in range(3): - j = order[jj] - - for ii in range(3): - i = order[ii] - - # A shift is only useful when it is trilinic - if j != 0 or k != 0: - d2old = 0 - d2new = 0 - - for d in range(DIM): - trial[d] = i*box[XX, d] + j*box[YY, d] + k*box[ZZ, d] - - # Choose the vector within the brick around 0,0,0 that - # will become the shortest due to shift try. - - if d == DIM: - trial[d] = 0 - pos[d] = 0 - else: - if trial[d] < 0: - pos[d] = min(self.c_pbcbox.hbox_diag[d], -trial[d]) - else: - pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) - - d2old += pos[d]**2 - d2new += (pos[d] + trial[d])**2 - - if BOX_MARGIN*d2new < d2old: - if not (j < -1 or j > 1 or k < -1 or k > 1): - use = True - - for dd in range(DIM): - if dd == 0: - shift = i - elif dd == 1: - shift = j - else: - shift = k - - if shift: - d2new_c = 0 - - for d in range(DIM): - d2new_c += (pos[d] + trial[d] - shift*box[dd, d])**2 - - if d2new_c <= BOX_MARGIN*d2new: - use = False - - if use: # Accept this shift vector. - if self.c_pbcbox.ntric_vec >= MAX_NTRICVEC: - with gil: - print("\nWARNING: Found more than %d triclinic " - "correction vectors, ignoring some." - % MAX_NTRICVEC) - print(" There is probably something wrong with " - "your box.") - print(np.array(box)) - - for i in range(self.c_pbcbox.ntric_vec): - print(" -> shift #{}: [{}, {}, {}]".format(i+1, - self.c_pbcbox.tric_shift[i][XX], - self.c_pbcbox.tric_shift[i][YY], - self.c_pbcbox.tric_shift[i][ZZ])) - else: - for d in range(DIM): - self.c_pbcbox.tric_vec[self.c_pbcbox.ntric_vec][d] = \ - trial[d] - self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][XX] = i - self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][YY] = j - self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][ZZ] = k - self.c_pbcbox.ntric_vec += 1 - - - def update(self, real[:,::1] box): - if box.shape[0] != DIM or box.shape[1] != DIM: - raise ValueError("Box must be a %i x %i matrix. (shape: %i x %i)" % - (DIM, DIM, box.shape[0], box.shape[1])) - if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): - raise ValueError("Box does not correspond to PBC=xyz") - self.fast_update(box) - - - cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: - cdef ns_int i, j - cdef rvec dx_start, trial - - for i in range(DIM): - dx[i] = other[i] - ref[i] - - for i in range (DIM-1, -1, -1): - while dx[i] > self.c_pbcbox.hbox_diag[i]: - for j in range (i, -1, -1): - dx[j] -= self.c_pbcbox.box[i][j] - - while dx[i] <= self.c_pbcbox.mhbox_diag[i]: - for j in range (i, -1, -1): - dx[j] += self.c_pbcbox.box[i][j] - - cdef real fast_distance2(self, rvec a, rvec b) nogil: - cdef rvec dx - self.fast_pbc_dx(a, b, dx) - return rvec_norm2(dx) - - cdef real fast_distance(self, rvec a, rvec b) nogil: - return sqrt(self.fast_distance2(a,b)) - - cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: - cdef ns_int i, m, d, natoms, wd = 0 - cdef real[:,::1] bbox_coords - - natoms = coords.shape[0] - with gil: - bbox_coords = coords.copy() - - for i in range(natoms): - for m in range(DIM - 1, -1, -1): - while bbox_coords[i, m] < 0: - for d in range(m+1): - bbox_coords[i, d] += self.c_pbcbox.box[m][d] - while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: - for d in range(m+1): - bbox_coords[i, d] -= self.c_pbcbox.box[m][d] - return bbox_coords - - def put_atoms_in_bbox(self, real[:,::1] coords): - if coords.shape[0] == 0: - return np.zeros((0, DIM), dtype=np.float32) - return np.asarray(self.fast_put_atoms_in_bbox(coords)) - -######################################################################################################################## -# -# Neighbor Search Stuff -# -######################################################################################################################## -cdef struct ns_grid: - ns_int size - ns_int[DIM] ncells - real[DIM] cellsize - ns_int *nbeads - ns_int **beadids - -cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: - cdef ns_neighborhood_holder *holder - - holder = malloc(sizeof(ns_neighborhood_holder)) - holder.size = 0 - holder.neighborhoods = NULL - - return holder - -cdef void free_neighborhood_holder(ns_neighborhood_holder *holder) nogil: - cdef ns_int i - - if holder == NULL: - return - - for i in range(holder.size): - if holder.neighborhoods[i].beadids != NULL: - free(holder.neighborhoods[i].beadids) - free(holder.neighborhoods[i]) - - if holder.neighborhoods != NULL: - free(holder.neighborhoods) - free(holder) - -cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]neighborcoords, ns_grid *grid, PBCBox box, real cutoff2) nogil: - cdef ns_int d, m - cdef ns_int xi, yi, zi, bid - cdef real d2 - cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords - - cdef bint already_checked[27] - cdef bint skip - cdef ns_int nchecked = 0, icheck - cdef ns_int cell_index - - cdef ns_neighborhood *neighborhood = malloc(sizeof(ns_neighborhood)) - if neighborhood == NULL: - return NULL - - neighborhood.size = 0 - neighborhood.allocated_size = NEIGHBORHOOD_ALLOCATION_INCREMENT - neighborhood.beadids = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(ns_int)) - - if neighborhood.beadids == NULL: - free(neighborhood) - return NULL - - for zi in range(3): - for yi in range(3): - for xi in range(3): - # Calculate and/or reinitialize shifted coordinates - shifted_coord[XX] = current_coords[XX] + (xi - 1) * grid.cellsize[XX] - shifted_coord[YY] = current_coords[YY] + (yi - 1) * grid.cellsize[YY] - shifted_coord[ZZ] = current_coords[ZZ] + (zi - 1) * grid.cellsize[ZZ] - - # Make sure the shifted coordinates is inside the brick-shaped box - for m in range(DIM - 1, -1, -1): - - while shifted_coord[m] < 0: - for d in range(m+1): - shifted_coord[d] += box.c_pbcbox.box[m][d] - - - while shifted_coord[m] >= box.c_pbcbox.box[m][m]: - for d in range(m+1): - shifted_coord[d] -= box.c_pbcbox.box[m][d] - - # Get the cell index corresponding to the coord - cell_index = (shifted_coord[ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ - (shifted_coord[YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ - (shifted_coord[XX] / grid.cellsize[XX]) - - # Just a safeguard - if cell_index >= grid.size: - continue - - # Check the cell index was not already selected - skip = False - for icheck in range(nchecked): - if already_checked[icheck] == cell_index: - skip = True - break - if skip: - continue - - # Search for neighbors inside this cell - for i_bead in range(grid.nbeads[cell_index]): - bid = grid.beadids[cell_index][i_bead] - - box.fast_pbc_dx(current_coords, &neighborcoords[bid, XX], dx) - - d2 = rvec_norm2(dx) - - if d2 < cutoff2: - if d2 < EPSILON: # Don't add the current bead as its own neighbor! - continue - - # Update neighbor lists - neighborhood.beadids[neighborhood.size] = bid - neighborhood.size += 1 - - if neighborhood.size >= neighborhood.allocated_size: - neighborhood.allocated_size += NEIGHBORHOOD_ALLOCATION_INCREMENT - neighborhood.beadids = realloc( neighborhood.beadids, neighborhood.allocated_size * sizeof(ns_int)) - - if neighborhood.beadids == NULL: - free(neighborhood) - return NULL - - # Register the cell as checked - already_checked[nchecked] = cell_index - nchecked += 1 - - return neighborhood - - -cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, - real[:, ::1] neighborcoords, - ns_grid *grid, - PBCBox box, - real cutoff) nogil: - cdef ns_int coordid, i, j - cdef ns_int ncoords = refcoords.shape[0] - cdef ns_int ncoords_neighbors = neighborcoords.shape[0] - cdef real cutoff2 = cutoff * cutoff - cdef ns_neighborhood_holder *holder - - cdef ns_int *neighbor_buf - cdef ns_int buf_size, ibuf - - holder = create_neighborhood_holder() - if holder == NULL: - return NULL - - holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) - if holder.neighborhoods == NULL: - free_neighborhood_holder(holder) - return NULL - - # Here starts the real core and the iteration over coordinates - for coordid in range(ncoords): - holder.neighborhoods[coordid] = retrieve_neighborhood(&refcoords[coordid, XX], - neighborcoords, - grid, - box, - cutoff2) - if holder.neighborhoods[coordid] == NULL: - free_neighborhood_holder(holder) - return NULL - - holder.neighborhoods[coordid].cutoff = cutoff - holder.size += 1 - - return holder - -cdef class NSResults(object): - """ - Class used to store results returned by `MDAnalysis.lib.grid.FastNS.search` - """ - cdef PBCBox box - cdef readonly real cutoff - cdef np.ndarray grid_coords - cdef np.ndarray ref_coords - cdef ns_int **nids - cdef ns_int *nsizes - cdef ns_int size - cdef list indices - cdef list coordinates - cdef list distances - - def __dealloc__(self): - if self.nids != NULL: - for i in range(self.size): - if self.nids[i] != NULL: - free(self.nids[i]) - free(self.nids) - - if self.nsizes != NULL: - free(self.nsizes) - - def __init__(self, PBCBox box, real cutoff): - self.box = box - self.cutoff = cutoff - - self.size = 0 - self.nids = NULL - self.nsizes = NULL - - self.grid_coords = None - self.ref_coords = None - - self.indices = None - self.coordinates = None - self.distances = None - - - cdef populate(self, ns_neighborhood_holder *holder, grid_coords, ref_coords): - cdef ns_int nid, i - cdef ns_neighborhood *neighborhood - - self.grid_coords = np.asarray(grid_coords) - self.ref_coords = np.asarray(ref_coords) - - # Allocate memory - self.nsizes = malloc(sizeof(ns_int) * holder.size) - if self.nsizes == NULL: - raise MemoryError("Could not allocate memory for NSResults") - - self.nids = malloc(sizeof(ns_int *) * holder.size) - if self.nids == NULL: - raise MemoryError("Could not allocate memory for NSResults") - - for nid in range(holder.size): - neighborhood = holder.neighborhoods[nid] - - self.nsizes[nid] = neighborhood.size - - self.nids[nid] = malloc(sizeof(ns_int *) * neighborhood.size) - if self.nids[nid] == NULL: - raise MemoryError("Could not allocate memory for NSResults") - - with nogil: - for nid in range(holder.size): - neighborhood = holder.neighborhoods[nid] - - for i in range(neighborhood.size): - self.nids[nid][i] = neighborhood.beadids[i] - - self.size = holder.size - - def get_indices(self): - """ - Return Neighbors indices. - - :return: list of indices - """ - cdef ns_int i, nid, size - - if self.indices is None: - indices = [] - - for nid in range(self.size): - size = self.nsizes[nid] - - tmp_incides = np.empty((size), dtype=np.int) - - for i in range(size): - tmp_incides[i] = self.nids[nid][i] - - indices.append(tmp_incides) - - self.indices = indices - - return self.indices - - - def get_coordinates(self): - """ - Return coordinates of neighbors. - - :return: list of coordinates - """ - cdef ns_int i, nid, size, beadid - - if self.coordinates is None: - coordinates = [] - - for nid in range(self.size): - size = self.nsizes[nid] - - tmp_values = np.empty((size, DIM), dtype=np.float32) - - for i in range(size): - beadid = self.nids[nid][i] - tmp_values[i] = self.grid_coords[beadid] - - coordinates.append(tmp_values) - - self.coordinates = coordinates - - return self.coordinates - - - def get_distances(self): - """ - Return coordinates of neighbors. - - :return: list of distances - """ - cdef ns_int i, nid, size, j, beadid - cdef rvec ref, other, dx - cdef real dist - cdef real[:, ::1] ref_coords = self.ref_coords - cdef real[:, ::1] grid_coords = self.grid_coords - - if self.distances is None: - distances = [] - - for nid in range(self.size): - size = self.nsizes[nid] - - tmp_values = np.empty((size), dtype=np.float32) - ref = &ref_coords[nid, 0] - - for i in range(size): - beadid = self.nids[nid][i] - other = &grid_coords[beadid, 0] - - tmp_values[i] = self.box.fast_distance(ref, other) - - distances.append(tmp_values) - - self.distances = distances - - return self.distances - - -# Python interface -cdef class FastNS(object): - cdef PBCBox box - cdef readonly real[:, ::1] coords - cdef real[:, ::1] coords_bbox - cdef readonly real cutoff - cdef bint prepared - cdef ns_grid grid - - def __init__(self, u): - import MDAnalysis as mda - from MDAnalysis.lib.mdamath import triclinic_vectors - - if not isinstance(u, mda.Universe): - raise TypeError("FastNS class must be initialized with a valid MDAnalysis.Universe instance") - box = triclinic_vectors(u.dimensions) - - if box.shape != (3, 3): - raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") - - self.box = PBCBox(box) - - self.coords = None - self.coords_bbox = None - - self.cutoff = -1 - - self.prepared = False - - self.grid.size = 0 - - - def __dealloc__(self): - cdef ns_int i - # Deallocate NS grid - if self.grid.nbeads != NULL: - free(self.grid.nbeads) - - for i in range(self.grid.size): - if self.grid.beadids[i] != NULL: - free(self.grid.beadids[i]) - free(self.grid.beadids) - - self.grid.size = 0 - - - def set_coords(self, real[:, ::1] coords): - self.coords = coords - - # Make sure atoms are inside the brick-shaped box - self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) - - self.prepared = False - - - def set_cutoff(self, real cutoff): - self.cutoff = cutoff - - self.prepared = False - - - def prepare(self, force=False): - cdef ns_int i, cellindex = -1 - cdef ns_int *allocated_size = NULL - cdef ns_int ncoords = self.coords.shape[0] - cdef ns_int allocation_guess - cdef rvec *coords = &self.coords_bbox[0, 0] - - if self.prepared and not force: - print("NS already prepared, nothing to do!") - - if self.coords is None: - raise ValueError("Coordinates must be set before NS preparation!") - - if self.cutoff < 0: - raise ValueError("Cutoff must be set before NS preparation!") - - with nogil: - - # Initializing grid - for i in range(DIM): - self.grid.ncells[i] = (self.box.c_pbcbox.box[i][i] / self.cutoff) - if self.grid.ncells[i] == 0: - self.grid.ncells[i] = 1 - self.grid.cellsize[i] = self.box.c_pbcbox.box[i][i] / self.grid.ncells[i] - self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] - - # This is just a guess on how much memory we might for each grid cell: - # we just assume an average bead density and we take four times this density just to be safe - allocation_guess = (4 * (ncoords / self.grid.size + 1)) - - # Allocate memory for the grid - self.grid.nbeads = malloc(sizeof(ns_int) * self.grid.size) - if self.grid.nbeads == NULL: - with gil: - raise MemoryError("Could not allocate memory for NS grid") - - # Allocate memory from temporary allocation counter - allocated_size = malloc(sizeof(ns_int) * self.grid.size) - if allocated_size == NULL: - # No need to free grid.nbeads as it will be freed by destroy_nsgrid called by __dealloc___ - with gil: - raise MemoryError("Could not allocate memory for allocation buffer") - - # Pre-allocate some memory for grid cells - for i in range(self.grid.size): - self.grid.nbeads[i] = 0 - allocated_size[i] = allocation_guess - - self.grid.beadids = malloc(sizeof(ns_int *) * self.grid.size) - if self.grid.beadids == NULL: - with gil: - raise MemoryError("Could not allocate memory for grid cells") - - for i in range(self.grid.size): - self.grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) - if self.grid.beadids[i] == NULL: - with gil: - raise MemoryError("Could not allocate memory for grid cell") - - # Populate grid cells using the coordinates (ie do the heavy work) - for i in range(ncoords): - cellindex = (coords[i][ZZ] / self.grid.cellsize[ZZ]) * (self.grid.ncells[XX] * self.grid.ncells[YY]) +\ - (coords[i][YY] / self.grid.cellsize[YY]) * self.grid.ncells[XX] + \ - (coords[i][XX] / self.grid.cellsize[XX]) - - self.grid.beadids[cellindex][self.grid.nbeads[cellindex]] = i - self.grid.nbeads[cellindex] += 1 - - # We need to allocate more memory (simply double the amount of memory as - # 1. it should barely be needed - # 2. the size should stay fairly reasonable - if self.grid.nbeads[cellindex] >= allocated_size[cellindex]: - allocated_size[cellindex] *= 2 - self.grid.beadids[cellindex] = realloc( self.grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) - - # Now we can free the allocation buffer - free(allocated_size) - self.prepared = True - - - def search(self, search_coords): - cdef real[:, ::1] search_coords_bbox - cdef real[:, ::1] search_coords_view - cdef ns_int nid, i, j - cdef ns_neighborhood_holder *holder - cdef ns_neighborhood *neighborhood - - if not self.prepared: - self.prepare() - - # Check the shape of search_coords as a array of 3D coords if needed - shape = search_coords.shape - if len(shape) == 1: - if not shape[0] == 3: - raise ValueError("Coordinates must be 3D") - else: - search_coords_view = np.array([search_coords,], dtype=np.float32) - else: - search_coords_view = search_coords - - # Make sure atoms are inside the brick-shaped box - search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords_view) - - with nogil: - holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) - - if holder == NULL: - raise MemoryError("Could not allocate memory to run NS core") - - results = NSResults(self.box, self.cutoff) - results.populate(holder, self.coords, search_coords_view) - - # Free memory allocated to holder - free_neighborhood_holder(holder) - - return results From 5e9fe318f42893c2b3ab5592d44a062bf24880e3 Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 25 Jun 2018 22:06:44 -0700 Subject: [PATCH 337/455] removed the parallel handler to remove hard dependency on omp.h, can be added again for conditional compilation --- package/MDAnalysis/lib/c_gridsearch.pyx | 666 ++++++++++++++++++++++++ 1 file changed, 666 insertions(+) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index e69de29bb2d..a4e8745aec4 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -0,0 +1,666 @@ +# -*- coding: utf-8; Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# Copyright (C) 2013-2016 Sébastien Buchoux +# +# This file is part of FATSLiM. +# +# FATSLiM is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# FATSLiM is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with FATSLiM. If not, see . +#cython: cdivision=True +#cython: boundscheck=False + +# Preprocessor DEFs +DEF DIM = 3 +DEF XX = 0 +DEF YY = 1 +DEF ZZ = 2 +DEF RET_OK = 1 +DEF RET_ERROR = 0 +DEF EPSILON = 1e-5 +DEF NEIGHBORHOOD_ALLOCATION_INCREMENT = 50 +DEF GRID_ALLOCATION_INCREMENT = 50 + +DEF BOX_MARGIN=1.0010 +DEF MAX_NTRICVEC=12 + +from libc.stdlib cimport malloc, realloc, free, abort +from libc.stdio cimport fprintf, stderr +from libc.math cimport sqrt +from libc.math cimport abs as real_abs + +import numpy as np +cimport numpy as np + +ctypedef np.int_t ns_int +ctypedef np.float32_t real +ctypedef real rvec[DIM] +ctypedef real matrix[DIM][DIM] + +cdef struct ns_grid: + ns_int size + ns_int[DIM] ncells + real[DIM] cellsize + ns_int *nbeads + ns_int **beadids + +cdef struct ns_neighborhood: + real cutoff + ns_int allocated_size + ns_int size + ns_int *beadids + real *beaddist + ### +cdef struct ns_neighborhood_holder: + ns_int size + ns_neighborhood **neighborhoods + +# Useful stuff + +cdef real rvec_norm2(const rvec a) nogil: + return a[XX]*a[XX]+a[YY]*a[YY]+a[ZZ]*a[ZZ] + +cdef void rvec_clear(rvec a) nogil: + a[XX]=0.0 + a[YY]=0.0 + a[ZZ]=0.0 + +cdef struct cPBCBox_t: + matrix box + rvec fbox_diag + rvec hbox_diag + rvec mhbox_diag + real max_cutoff2 + ns_int ntric_vec + ns_int[DIM] tric_shift[MAX_NTRICVEC] + real[DIM] tric_vec[MAX_NTRICVEC] + +cdef class PBCBox(object): + cdef cPBCBox_t c_pbcbox + cdef rvec center + cdef rvec bbox_center + + def __init__(self, real[:,::1] box): + self.update(box) + + cdef void fast_update(self, real[:,::1] box) nogil: + cdef ns_int i, j, k, d, jc, kc, shift + cdef real d2old, d2new, d2new_c + cdef rvec trial, pos + cdef ns_int ii, jj ,kk + cdef ns_int *order = [0, -1, 1, -2, 2] + cdef bint use + cdef real min_hv2, min_ss, tmp + + rvec_clear(self.center) + # Update matrix + for i in range(DIM): + for j in range(DIM): + self.c_pbcbox.box[i][j] = box[i, j] + self.center[j] += 0.5 * box[i, j] + self.bbox_center[i] = 0.5 * box[i, i] + + # Update diagonals + for i in range(DIM): + self.c_pbcbox.fbox_diag[i] = box[i, i] + self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 + self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] + + # Update maximum cutoff + + # Physical limitation of the cut-off + # by half the length of the shortest box vector. + min_hv2 = min(0.25 * rvec_norm2(&box[XX, XX]), 0.25 * rvec_norm2(&box[YY, XX])) + min_hv2 = min(min_hv2, 0.25 * rvec_norm2(&box[ZZ, XX])) + + # Limitation to the smallest diagonal element due to optimizations: + # checking only linear combinations of single box-vectors (2 in x) + # in the grid search and pbc_dx is a lot faster + # than checking all possible combinations. + tmp = box[YY, YY] + if box[ZZ, YY] < 0: + tmp -= box[ZZ, YY] + else: + tmp += box[ZZ, YY] + + min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) + + self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) + + # Update shift vectors + self.c_pbcbox.ntric_vec = 0 + # We will only use single shifts, but we will check a few + # more shifts to see if there is a limiting distance + # above which we can not be sure of the correct distance. + for kk in range(5): + k = order[kk] + + for jj in range(5): + j = order[jj] + + for ii in range(5): + i = order[ii] + + # A shift is only useful when it is trilinic + if j != 0 or k != 0: + d2old = 0 + d2new = 0 + + for d in range(DIM): + trial[d] = i*box[XX, d] + j*box[YY, d] + k*box[ZZ, d] + + # Choose the vector within the brick around 0,0,0 that + # will become the shortest due to shift try. + + if d == DIM: + trial[d] = 0 + pos[d] = 0 + else: + if trial[d] < 0: + pos[d] = min(self.c_pbcbox.hbox_diag[d], -trial[d]) + else: + pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) + + d2old += sqrt(pos[d]) + d2new += sqrt(pos[d] + trial[d]) + + if BOX_MARGIN*d2new < d2old: + if not (j < -1 or j > 1 or k < -1 or k > 1): + use = True + + for dd in range(DIM): + if dd == 0: + shift = i + elif dd == 1: + shift = j + else: + shift = k + + if shift: + d2new_c = 0 + + for d in range(DIM): + d2new_c += sqrt(pos[d] + trial[d] - shift*box[dd, d]) + + if d2new_c <= BOX_MARGIN*d2new: + use = False + + if use: # Accept this shift vector. + if self.c_pbcbox.ntric_vec >= MAX_NTRICVEC: + with gil: + print("\nWARNING: Found more than %d triclinic " + "correction vectors, ignoring some." + % MAX_NTRICVEC) + print(" There is probably something wrong with " + "your box.") + print(box) + else: + for d in range(DIM): + self.c_pbcbox.tric_vec[self.c_pbcbox.ntric_vec][d] = \ + trial[d] + self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][XX] = i + self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][YY] = j + self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][ZZ] = k + self.c_pbcbox.ntric_vec += 1 + + + def update(self, real[:,::1] box): + if box.shape[0] != DIM or box.shape[1] != DIM: + raise ValueError("Box must be a %i x %i matrix. (shape: %i x %i)" % + (DIM, DIM, box.shape[0], box.shape[1])) + if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + raise ValueError("Box does not correspond to PBC=xyz") + self.fast_update(box) + + cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: + cdef ns_int i, j + cdef rvec dx_start, trial + + for i in range(DIM): + dx[i] = other[i] - ref[i] + + for i in range (DIM-1, -1, -1): + while dx[i] > self.c_pbcbox.hbox_diag[i]: + for j in range (i, -1, -1): + dx[j] -= self.c_pbcbox.box[i][j] + + while dx[i] <= self.c_pbcbox.mhbox_diag[i]: + for j in range (i, -1, -1): + dx[j] += self.c_pbcbox.box[i][j] + + cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: + cdef ns_int i, m, d, natoms, wd = 0 + cdef real[:,::1] bbox_coords + + natoms = coords.shape[0] + with gil: + if natoms == 0: + bbox_coords = np.empty((0, DIM)) + else: + bbox_coords = coords.copy() + + for i in range(natoms): + for m in range(DIM - 1, -1, -1): + while bbox_coords[i, m] < 0: + for d in range(m+1): + bbox_coords[i, d] += self.c_pbcbox.box[m][d] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + for d in range(m+1): + bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + return bbox_coords + + def put_atoms_in_bbox(self, real[:,::1] coords): + return np.asarray(self.fast_put_atoms_in_bbox(coords)) + +######################################################################################################################## +# +# Neighbor Search Stuff +# +######################################################################################################################## +cdef struct ns_grid: + ns_int size + ns_int[DIM] ncells + real[DIM] cellsize + ns_int *nbeads + ns_int **beadids + +cdef ns_grid initialize_nsgrid(matrix box, + float cutoff) nogil: + cdef ns_grid grid + cdef ns_int i + + for i in range(DIM): + grid.ncells[i] = (box[i][i] / cutoff) + if grid.ncells[i] == 0: + grid.ncells[i] = 1 + grid.cellsize[i] = box[i][i] / grid.ncells[i] + + grid.size = grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ] + return grid + +cdef ns_int populate_grid(ns_grid *grid, + real[:,::1] coords) nogil: + cdef ns_int ncoords = coords.shape[0] + cdef bint ret_val + + ret_val = populate_grid_array(grid, + &coords[0, 0], + ncoords) + + return ret_val + +cdef ns_int populate_grid_array(ns_grid *grid, + rvec *coords, + ns_int ncoords) nogil: + cdef ns_int i, cellindex = -1 + cdef ns_int grid_size = grid.size + cdef ns_int *allocated_size = NULL + + if grid_size != grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ]: # Grid not initialized + return RET_ERROR + + + # Allocate memory + grid.nbeads = malloc(sizeof(ns_int) * grid_size) + if grid.nbeads == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS grid.nbeads (requested: %i bytes)\n", + sizeof(ns_int) * grid_size) + abort() + + allocated_size = malloc(sizeof(ns_int) * grid_size) + if allocated_size == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS allocated_size (requested: %i bytes)\n", + sizeof(ns_int) * grid_size) + abort() + + for i in range(grid_size): + grid.nbeads[i] = 0 + allocated_size[i] = GRID_ALLOCATION_INCREMENT + + grid.beadids = malloc(sizeof(ns_int *) * grid_size) + if grid.beadids == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids (requested: %i bytes)\n", + sizeof(ns_int *) * grid_size) + abort() + + for i in range(grid_size): + grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) + if grid.beadids[i] == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids[i] (requested: %i bytes)\n", + sizeof(ns_int) * allocated_size[i]) + abort() + + # Get cell indices for coords + for i in range(ncoords): + cellindex = (coords[i][ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ + (coords[i][YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ + (coords[i][XX] / grid.cellsize[XX]) + + grid.beadids[cellindex][grid.nbeads[cellindex]] = i + grid.nbeads[cellindex] += 1 + + if grid.nbeads[cellindex] >= allocated_size[cellindex]: + allocated_size[cellindex] += GRID_ALLOCATION_INCREMENT + grid.beadids[cellindex] = realloc( grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) + free(allocated_size) + return RET_OK + +cdef void destroy_nsgrid(ns_grid *grid) nogil: + cdef ns_int i + if grid.nbeads != NULL: + free(grid.nbeads) + + for i in range(grid.size): + if grid.beadids[i] != NULL: + free(grid.beadids[i]) + free(grid.beadids) + + +cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: + cdef ns_neighborhood_holder *holder + + holder = malloc(sizeof(ns_neighborhood_holder)) + + return holder + +cdef void free_neighborhood_holder(ns_neighborhood_holder *holder) nogil: + cdef ns_int i + + if holder == NULL: + return + + for i in range(holder.size): + if holder.neighborhoods[i].beadids != NULL: + free(holder.neighborhoods[i].beadids) + free(holder.neighborhoods[i]) + free(holder.neighborhoods) + free(holder) + +cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]neighborcoords, ns_grid *grid, PBCBox box, real cutoff2) nogil: + cdef ns_int d, m + cdef ns_int xi, yi, zi, bid + cdef real d2 + cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords + + cdef bint already_checked[27] + cdef bint skip + cdef ns_int nchecked = 0, icheck + cdef ns_int cell_index + + cdef ns_neighborhood *neighborhood = malloc(sizeof(ns_neighborhood)) + if neighborhood == NULL: + abort() + + neighborhood.size = 0 + neighborhood.allocated_size = NEIGHBORHOOD_ALLOCATION_INCREMENT + neighborhood.beadids = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(ns_int)) + ###Modified here + neighborhood.beaddist = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(real)) + ### + if neighborhood.beadids == NULL: + abort() + + for zi in range(3): + for yi in range(3): + for xi in range(3): + # Calculate and/or reinitialize shifted coordinates + shifted_coord[XX] = current_coords[XX] + (xi - 1) * grid.cellsize[XX] + shifted_coord[YY] = current_coords[YY] + (yi - 1) * grid.cellsize[YY] + shifted_coord[ZZ] = current_coords[ZZ] + (zi - 1) * grid.cellsize[ZZ] + + # Make sure the shifted coordinates is inside the brick-shaped box + for m in range(DIM - 1, -1, -1): + + while shifted_coord[m] < 0: + for d in range(m+1): + shifted_coord[d] += box.c_pbcbox.box[m][d] + + + while shifted_coord[m] >= box.c_pbcbox.box[m][m]: + for d in range(m+1): + shifted_coord[d] -= box.c_pbcbox.box[m][d] + + # Get the cell index corresponding to the coord + cell_index = (shifted_coord[ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ + (shifted_coord[YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ + (shifted_coord[XX] / grid.cellsize[XX]) + + # Just a safeguard + if cell_index >= grid.size: + continue + + # Check the cell index was not already selected + skip = False + for icheck in range(nchecked): + if already_checked[icheck] == cell_index: + skip = True + break + if skip: + continue + + # Search for neighbors inside this cell + for i_bead in range(grid.nbeads[cell_index]): + bid = grid.beadids[cell_index][i_bead] + + box.fast_pbc_dx(current_coords, &neighborcoords[bid, XX], dx) + + d2 = rvec_norm2(dx) + + if d2 < cutoff2: + if d2 < EPSILON: # Don't add the current bead as its own neighbor! + continue + + # Update neighbor lists + neighborhood.beadids[neighborhood.size] = bid + ### Modified here + neighborhood.beaddist[neighborhood.size] = d2 + ### + neighborhood.size += 1 + + if neighborhood.size >= neighborhood.allocated_size: + neighborhood.allocated_size += NEIGHBORHOOD_ALLOCATION_INCREMENT + neighborhood.beadids = realloc( neighborhood.beadids, neighborhood.allocated_size * sizeof(ns_int)) + ###Modified here + neighborhood.beaddist = realloc( neighborhood.beaddist, neighborhood.allocated_size * sizeof(real)) + ### + if neighborhood.beadids == NULL: + abort() + ###Modified + if neighborhood.beaddist == NULL: + abort() + ### + # Register the cell as checked + already_checked[nchecked] = cell_index + nchecked += 1 + + return neighborhood +cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, + real[:, ::1] neighborcoords, + ns_grid *grid, + PBCBox box, + real cutoff) nogil: + cdef ns_int coordid, i, j + cdef ns_int ncoords = refcoords.shape[0] + cdef ns_int ncoords_neighbors = neighborcoords.shape[0] + cdef real cutoff2 = cutoff * cutoff + cdef ns_neighborhood_holder *holder + + cdef ns_int *neighbor_buf + cdef ns_int buf_size, ibuf + + holder = create_neighborhood_holder() + if holder == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS holder\n", + sizeof(ns_int) * ncoords) + abort() + + holder.size = ncoords + holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) + if holder.neighborhoods == NULL: + fprintf(stderr,"FATAL: Could not allocate memory for NS holder.neighborhoods (requested: %i bytes)\n", + sizeof(ns_neighborhood) * ncoords) + abort() + + # Here starts the real core and the iteration over coordinates + for coordid in range(ncoords): + holder.neighborhoods[coordid] = retrieve_neighborhood(&refcoords[coordid, XX], + neighborcoords, + grid, + box, + cutoff2) + holder.neighborhoods[coordid].cutoff = cutoff + + return holder + +# Python interface +cdef class FastNS(object): + cdef PBCBox box + cdef readonly int nthreads + cdef readonly real[:, ::1] coords + cdef real[:, ::1] coords_bbox + cdef readonly real cutoff + cdef bint prepared + cdef ns_grid *grid + + + def __init__(self, box): + if box.shape != (3, 3): + raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") + + self.box = PBCBox(box) + + self.nthreads = 1 + + self.coords = None + self.coords_bbox = None + + self.cutoff = -1 + + self.prepared = False + + self.grid = malloc(sizeof(ns_grid)) + + + def __dealloc__(self): + #destroy_nsgrid(self.grid) + self.grid.size = 0 + + def set_coords(self, real[:, ::1] coords): + self.coords = coords + + # Make sure atoms are inside the brick-shaped box + self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) + + self.prepared = False + + + def set_cutoff(self, real cutoff): + self.cutoff = cutoff + + self.prepared = False + + + def prepare(self, force=False): + cdef ns_int i + cdef bint initialization_ok + + if self.prepared and not force: + print("NS already prepared, nothing to do!") + + if self.coords is None: + raise ValueError("Coordinates must be set before NS preparation!") + + if self.cutoff < 0: + raise ValueError("Cutoff must be set before NS preparation!") + + with nogil: + initialization_ok = False + + # Initializing grid + for i in range(DIM): + self.grid.ncells[i] = (self.box.c_pbcbox.box[i][i] / self.cutoff) + if self.grid.ncells[i] == 0: + self.grid.ncells[i] = 1 + self.grid.cellsize[i] = self.box.c_pbcbox.box[i][i] / self.grid.ncells[i] + + self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] + + # Populating grid + if populate_grid(self.grid, self.coords_bbox) == RET_OK: + initialization_ok = True + + + if initialization_ok: + self.prepared = True + else: + raise RuntimeError("Could not initialize NS grid") + + + def search(self, real[:, ::1]search_coords, return_ids=False): + cdef real[:, ::1] search_coords_bbox + cdef ns_int nid, i, j + cdef ns_neighborhood_holder *holder + cdef ns_neighborhood *neighborhood + + if not self.prepared: + self.prepare() + + + # Make sure atoms are inside the brick-shaped box + search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords) + + with nogil: + holder = ns_core(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff) + + neighbors = [] + ###Modify for distance + sqdist = [] + indx = [] + ### + for nid in range(holder.size): + neighborhood = holder.neighborhoods[nid] + + if return_ids: + neighborhood_py = np.empty(neighborhood.size, dtype=np.int64) + ###Modify for distance + neighborhood_dis = np.empty(neighborhood.size, dtype=np.float32) + neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) + ### + for i in range(neighborhood.size): + neighborhood_py[i] = neighborhood.beadids[i] + ###Modify for distance + neighborhood_dis[i] = neighborhood.beaddist[i] + ### + else: + neighborhood_py = np.empty((neighborhood.size, DIM), dtype=np.float32) + ###Modify for distance + neighborhood_dis = np.empty((neighborhood.size), dtype=np.float32) + neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) + ### + for i in range(neighborhood.size): + ###Modify for distance + neighborhood_dis[i] = neighborhood.beaddist[i] + neighborhood_indx[i] = neighborhood.beadids[i] + ### + + for j in range(DIM): + neighborhood_py[i,j] = self.coords[neighborhood.beadids[i], j] + + neighbors.append(neighborhood_py) + sqdist.append(neighborhood_dis) + indx.append(neighborhood_indx) + + # Free Memory + free_neighborhood_holder(holder) + + return neighbors, sqdist, indx From 97d07fe763e87bb0c94d060f7685c0bf8086c03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 1 Jul 2018 14:06:40 +0200 Subject: [PATCH 338/455] Added MDAnalysis header file to c_gridsearch.pyx --- package/MDAnalysis/lib/c_gridsearch.pyx | 32 +++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index a4e8745aec4..ac73c97a5a2 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -1,22 +1,28 @@ -# -*- coding: utf-8; Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # -# Copyright (C) 2013-2016 Sébastien Buchoux +# MDAnalysis --- https://www.mdanalysis.org # -# This file is part of FATSLiM. +# Copyright (C) 2013-2018 Sébastien Buchoux +# Copyright (c) 2018 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) # -# FATSLiM is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Released under the GNU Public Licence, v3 or any higher version # -# FATSLiM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# Please cite your use of MDAnalysis in published work: # -# You should have received a copy of the GNU General Public License -# along with FATSLiM. If not, see . +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +# + #cython: cdivision=True #cython: boundscheck=False From a26f437a7a73c0eec4f3f1ec3f97b56c0b5522e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 1 Jul 2018 16:53:22 +0200 Subject: [PATCH 339/455] Corrected C (de)allocation in c_gridsearch.pyx. Should fix memory leak --- package/MDAnalysis/lib/c_gridsearch.pyx | 32 +++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index ac73c97a5a2..2a7af4b33b7 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -145,16 +145,15 @@ cdef class PBCBox(object): # Update shift vectors self.c_pbcbox.ntric_vec = 0 - # We will only use single shifts, but we will check a few - # more shifts to see if there is a limiting distance - # above which we can not be sure of the correct distance. - for kk in range(5): + + # We will only use single shifts + for kk in range(3): k = order[kk] - for jj in range(5): + for jj in range(3): j = order[jj] - for ii in range(5): + for ii in range(3): i = order[ii] # A shift is only useful when it is trilinic @@ -177,8 +176,8 @@ cdef class PBCBox(object): else: pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) - d2old += sqrt(pos[d]) - d2new += sqrt(pos[d] + trial[d]) + d2old += pos[d]**2 + d2new += (pos[d] + trial[d])**2 if BOX_MARGIN*d2new < d2old: if not (j < -1 or j > 1 or k < -1 or k > 1): @@ -196,7 +195,7 @@ cdef class PBCBox(object): d2new_c = 0 for d in range(DIM): - d2new_c += sqrt(pos[d] + trial[d] - shift*box[dd, d]) + d2new_c += (pos[d] + trial[d] - shift*box[dd, d])**2 if d2new_c <= BOX_MARGIN*d2new: use = False @@ -209,7 +208,13 @@ cdef class PBCBox(object): % MAX_NTRICVEC) print(" There is probably something wrong with " "your box.") - print(box) + print(np.array(box)) + + for i in range(self.c_pbcbox.ntric_vec): + print(" -> shift #{}: [{}, {}, {}]".format(i+1, + self.c_pbcbox.tric_shift[i][XX], + self.c_pbcbox.tric_shift[i][YY], + self.c_pbcbox.tric_shift[i][ZZ])) else: for d in range(DIM): self.c_pbcbox.tric_vec[self.c_pbcbox.ntric_vec][d] = \ @@ -539,6 +544,9 @@ cdef class FastNS(object): cdef ns_grid *grid + def __cinit__(self): + self.grid = malloc(sizeof(ns_grid)) + def __init__(self, box): if box.shape != (3, 3): raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") @@ -554,11 +562,9 @@ cdef class FastNS(object): self.prepared = False - self.grid = malloc(sizeof(ns_grid)) - def __dealloc__(self): - #destroy_nsgrid(self.grid) + destroy_nsgrid(self.grid) self.grid.size = 0 def set_coords(self, real[:, ::1] coords): From 28554002b8ea389bf82dfe1a3650a24ced8aab67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 1 Jul 2018 16:54:21 +0200 Subject: [PATCH 340/455] Removed pointer to nsgrid structure to avoid need to free it --- package/MDAnalysis/lib/c_gridsearch.pyx | 17 ++-- .../MDAnalysisTests/lib/test_gridsearch.py | 81 ++++--------------- 2 files changed, 22 insertions(+), 76 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 2a7af4b33b7..7a6de80389d 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -42,8 +42,7 @@ DEF MAX_NTRICVEC=12 from libc.stdlib cimport malloc, realloc, free, abort from libc.stdio cimport fprintf, stderr -from libc.math cimport sqrt -from libc.math cimport abs as real_abs + import numpy as np cimport numpy as np @@ -541,11 +540,7 @@ cdef class FastNS(object): cdef real[:, ::1] coords_bbox cdef readonly real cutoff cdef bint prepared - cdef ns_grid *grid - - - def __cinit__(self): - self.grid = malloc(sizeof(ns_grid)) + cdef ns_grid grid def __init__(self, box): if box.shape != (3, 3): @@ -562,9 +557,11 @@ cdef class FastNS(object): self.prepared = False + self.grid.size = 0 + def __dealloc__(self): - destroy_nsgrid(self.grid) + destroy_nsgrid(&self.grid) self.grid.size = 0 def set_coords(self, real[:, ::1] coords): @@ -608,7 +605,7 @@ cdef class FastNS(object): self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] # Populating grid - if populate_grid(self.grid, self.coords_bbox) == RET_OK: + if populate_grid(&self.grid, self.coords_bbox) == RET_OK: initialization_ok = True @@ -632,7 +629,7 @@ cdef class FastNS(object): search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords) with nogil: - holder = ns_core(search_coords_bbox, self.coords_bbox, self.grid, self.box, self.cutoff) + holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) neighbors = [] ###Modify for distance diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_gridsearch.py index 359d32544b7..4991a2da71d 100644 --- a/testsuite/MDAnalysisTests/lib/test_gridsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_gridsearch.py @@ -23,13 +23,16 @@ from __future__ import print_function, absolute_import import pytest -from numpy.testing import assert_equal, assert_allclose + +from numpy.testing import assert_equal import numpy as np import MDAnalysis as mda from MDAnalysis.lib import grid from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.mdamath import triclinic_vectors + from MDAnalysisTests.datafiles import GRO @@ -39,30 +42,13 @@ def universe(): return u -@pytest.fixture -def grid_results(): - u = mda.Universe(GRO) - cutoff = 2 - ref_pos = u.atoms.positions[13937] - return run_grid_search(u, ref_pos, cutoff) - - -def run_grid_search(u, ref_pos, cutoff): - coords = u.atoms.positions - - # Run grid search - searcher = grid.FastNS(u) - searcher.set_cutoff(cutoff) - searcher.set_coords(coords) - searcher.prepare() - - return searcher.search(ref_pos) - - def run_search(universe, ref_id): cutoff = 3 + coords = universe.atoms.positions ref_pos = coords[ref_id] + triclinic_box = triclinic_vectors(universe.dimensions) + # Run pkdtree search pkdt = PeriodicKDTree(universe.atoms.dimensions, bucket_size=10) @@ -75,8 +61,13 @@ def run_search(universe, ref_id): results_pkdtree.sort() # Run grid search - results_grid = run_grid_search(universe, ref_pos, cutoff) - results_grid = results_grid.get_indices()[0] + + searcher = grid.FastNS(triclinic_box) + searcher.set_cutoff(cutoff) + searcher.set_coords(coords) + searcher.prepare() + + results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0][0] results_grid.sort() return results_pkdtree, results_grid @@ -95,46 +86,4 @@ def test_gridsearch_PBC(universe): ref_id = 13937 results_pkdtree, results_grid = run_search(universe, ref_id) - assert_equal(results_pkdtree, results_grid) - - -def test_gridsearch_arraycoord(universe): - """Check the NS routine accepts a single bead coordinate as well as array of coordinates""" - cutoff = 2 - ref_pos = universe.atoms.positions[:5] - - results = [ - np.array([2, 1, 4, 3]), - np.array([2, 0, 3]), - np.array([0, 1, 3]), - np.array([ 2, 0, 1, 38341]), - np.array([ 6, 0, 5, 17]) - ] - - results_grid = run_grid_search(universe, ref_pos, cutoff).get_indices() - - assert_equal(results_grid, results) - - -def test_gridsearch_search_coordinates(grid_results): - """Check the NS routine can return coordinates instead of ids""" - - results = np.array( - [ - [40.32, 34.25, 55.9], - [0.61, 76.33, -0.56], - [0.48999998, 75.9, 0.19999999], - [-0.11, 76.19, 0.77] - ]) - - assert_allclose(grid_results.get_coordinates()[0], results) - - -def test_gridsearch_search_distances(grid_results): - """Check the NS routine can return PBC distances from neighbors""" - results = np.array([0.096, 0.096, 0.015, 0.179]) * 10 # These distances were obtained using gmx distance - results.sort() - - rounded_results = np.round(grid_results.get_distances()[0], 2) - - assert_allclose(sorted(rounded_results), results) \ No newline at end of file + assert_equal(results_pkdtree, results_grid) \ No newline at end of file From 4d4a41511220599d333851f772a25b9c88acd1e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Wed, 4 Jul 2018 18:13:41 +0200 Subject: [PATCH 341/455] Removed abort() from c_gridsearch.pyx and grid allocation moved to FastNS method. --- package/MDAnalysis/lib/c_gridsearch.pyx | 267 +++++++----------- .../MDAnalysisTests/lib/test_gridsearch.py | 2 +- 2 files changed, 104 insertions(+), 165 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 7a6de80389d..98d97eded65 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -31,18 +31,15 @@ DEF DIM = 3 DEF XX = 0 DEF YY = 1 DEF ZZ = 2 -DEF RET_OK = 1 -DEF RET_ERROR = 0 + DEF EPSILON = 1e-5 + DEF NEIGHBORHOOD_ALLOCATION_INCREMENT = 50 -DEF GRID_ALLOCATION_INCREMENT = 50 DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 -from libc.stdlib cimport malloc, realloc, free, abort -from libc.stdio cimport fprintf, stderr - +from libc.stdlib cimport malloc, realloc, free import numpy as np cimport numpy as np @@ -64,8 +61,7 @@ cdef struct ns_neighborhood: ns_int allocated_size ns_int size ns_int *beadids - real *beaddist - ### + cdef struct ns_neighborhood_holder: ns_int size ns_neighborhood **neighborhoods @@ -80,6 +76,7 @@ cdef void rvec_clear(rvec a) nogil: a[YY]=0.0 a[ZZ]=0.0 + cdef struct cPBCBox_t: matrix box rvec fbox_diag @@ -90,6 +87,8 @@ cdef struct cPBCBox_t: ns_int[DIM] tric_shift[MAX_NTRICVEC] real[DIM] tric_vec[MAX_NTRICVEC] + +# Class to handle PBC calculations cdef class PBCBox(object): cdef cPBCBox_t c_pbcbox cdef rvec center @@ -232,6 +231,7 @@ cdef class PBCBox(object): raise ValueError("Box does not correspond to PBC=xyz") self.fast_update(box) + cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: cdef ns_int i, j cdef rvec dx_start, trial @@ -284,102 +284,12 @@ cdef struct ns_grid: ns_int *nbeads ns_int **beadids -cdef ns_grid initialize_nsgrid(matrix box, - float cutoff) nogil: - cdef ns_grid grid - cdef ns_int i - - for i in range(DIM): - grid.ncells[i] = (box[i][i] / cutoff) - if grid.ncells[i] == 0: - grid.ncells[i] = 1 - grid.cellsize[i] = box[i][i] / grid.ncells[i] - - grid.size = grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ] - return grid - -cdef ns_int populate_grid(ns_grid *grid, - real[:,::1] coords) nogil: - cdef ns_int ncoords = coords.shape[0] - cdef bint ret_val - - ret_val = populate_grid_array(grid, - &coords[0, 0], - ncoords) - - return ret_val - -cdef ns_int populate_grid_array(ns_grid *grid, - rvec *coords, - ns_int ncoords) nogil: - cdef ns_int i, cellindex = -1 - cdef ns_int grid_size = grid.size - cdef ns_int *allocated_size = NULL - - if grid_size != grid.ncells[XX] * grid.ncells[YY] * grid.ncells[ZZ]: # Grid not initialized - return RET_ERROR - - - # Allocate memory - grid.nbeads = malloc(sizeof(ns_int) * grid_size) - if grid.nbeads == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS grid.nbeads (requested: %i bytes)\n", - sizeof(ns_int) * grid_size) - abort() - - allocated_size = malloc(sizeof(ns_int) * grid_size) - if allocated_size == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS allocated_size (requested: %i bytes)\n", - sizeof(ns_int) * grid_size) - abort() - - for i in range(grid_size): - grid.nbeads[i] = 0 - allocated_size[i] = GRID_ALLOCATION_INCREMENT - - grid.beadids = malloc(sizeof(ns_int *) * grid_size) - if grid.beadids == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids (requested: %i bytes)\n", - sizeof(ns_int *) * grid_size) - abort() - - for i in range(grid_size): - grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) - if grid.beadids[i] == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS grid.beadids[i] (requested: %i bytes)\n", - sizeof(ns_int) * allocated_size[i]) - abort() - - # Get cell indices for coords - for i in range(ncoords): - cellindex = (coords[i][ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ - (coords[i][YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ - (coords[i][XX] / grid.cellsize[XX]) - - grid.beadids[cellindex][grid.nbeads[cellindex]] = i - grid.nbeads[cellindex] += 1 - - if grid.nbeads[cellindex] >= allocated_size[cellindex]: - allocated_size[cellindex] += GRID_ALLOCATION_INCREMENT - grid.beadids[cellindex] = realloc( grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) - free(allocated_size) - return RET_OK - -cdef void destroy_nsgrid(ns_grid *grid) nogil: - cdef ns_int i - if grid.nbeads != NULL: - free(grid.nbeads) - - for i in range(grid.size): - if grid.beadids[i] != NULL: - free(grid.beadids[i]) - free(grid.beadids) - - cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: cdef ns_neighborhood_holder *holder holder = malloc(sizeof(ns_neighborhood_holder)) + holder.size = 0 + holder.neighborhoods = NULL return holder @@ -393,7 +303,9 @@ cdef void free_neighborhood_holder(ns_neighborhood_holder *holder) nogil: if holder.neighborhoods[i].beadids != NULL: free(holder.neighborhoods[i].beadids) free(holder.neighborhoods[i]) - free(holder.neighborhoods) + + if holder.neighborhoods != NULL: + free(holder.neighborhoods) free(holder) cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]neighborcoords, ns_grid *grid, PBCBox box, real cutoff2) nogil: @@ -409,16 +321,15 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei cdef ns_neighborhood *neighborhood = malloc(sizeof(ns_neighborhood)) if neighborhood == NULL: - abort() + return NULL neighborhood.size = 0 neighborhood.allocated_size = NEIGHBORHOOD_ALLOCATION_INCREMENT neighborhood.beadids = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(ns_int)) - ###Modified here - neighborhood.beaddist = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(real)) - ### + if neighborhood.beadids == NULL: - abort() + free(neighborhood) + return NULL for zi in range(3): for yi in range(3): @@ -472,28 +383,23 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei # Update neighbor lists neighborhood.beadids[neighborhood.size] = bid - ### Modified here - neighborhood.beaddist[neighborhood.size] = d2 - ### neighborhood.size += 1 if neighborhood.size >= neighborhood.allocated_size: neighborhood.allocated_size += NEIGHBORHOOD_ALLOCATION_INCREMENT neighborhood.beadids = realloc( neighborhood.beadids, neighborhood.allocated_size * sizeof(ns_int)) - ###Modified here - neighborhood.beaddist = realloc( neighborhood.beaddist, neighborhood.allocated_size * sizeof(real)) - ### + if neighborhood.beadids == NULL: - abort() - ###Modified - if neighborhood.beaddist == NULL: - abort() - ### + free(neighborhood) + return NULL + # Register the cell as checked already_checked[nchecked] = cell_index nchecked += 1 return neighborhood + + cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, real[:, ::1] neighborcoords, ns_grid *grid, @@ -510,16 +416,12 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, holder = create_neighborhood_holder() if holder == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS holder\n", - sizeof(ns_int) * ncoords) - abort() + return NULL - holder.size = ncoords holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) if holder.neighborhoods == NULL: - fprintf(stderr,"FATAL: Could not allocate memory for NS holder.neighborhoods (requested: %i bytes)\n", - sizeof(ns_neighborhood) * ncoords) - abort() + free_neighborhood_holder(holder) + return NULL # Here starts the real core and the iteration over coordinates for coordid in range(ncoords): @@ -528,14 +430,18 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, grid, box, cutoff2) + if holder.neighborhoods[coordid] == NULL: + free_neighborhood_holder(holder) + return NULL + holder.neighborhoods[coordid].cutoff = cutoff + holder.size += 1 return holder # Python interface cdef class FastNS(object): cdef PBCBox box - cdef readonly int nthreads cdef readonly real[:, ::1] coords cdef real[:, ::1] coords_bbox cdef readonly real cutoff @@ -548,8 +454,6 @@ cdef class FastNS(object): self.box = PBCBox(box) - self.nthreads = 1 - self.coords = None self.coords_bbox = None @@ -561,7 +465,15 @@ cdef class FastNS(object): def __dealloc__(self): - destroy_nsgrid(&self.grid) + cdef ns_int i + if self.grid.nbeads != NULL: + free(self.grid.nbeads) + + for i in range(self.grid.size): + if self.grid.beadids[i] != NULL: + free(self.grid.beadids[i]) + free(self.grid.beadids) + self.grid.size = 0 def set_coords(self, real[:, ::1] coords): @@ -580,8 +492,11 @@ cdef class FastNS(object): def prepare(self, force=False): - cdef ns_int i - cdef bint initialization_ok + cdef ns_int i, cellindex = -1 + cdef ns_int *allocated_size = NULL + cdef ns_int ncoords = self.coords.shape[0] + cdef ns_int allocation_guess + cdef rvec *coords = &self.coords_bbox[0, 0] if self.prepared and not force: print("NS already prepared, nothing to do!") @@ -593,7 +508,6 @@ cdef class FastNS(object): raise ValueError("Cutoff must be set before NS preparation!") with nogil: - initialization_ok = False # Initializing grid for i in range(DIM): @@ -601,18 +515,61 @@ cdef class FastNS(object): if self.grid.ncells[i] == 0: self.grid.ncells[i] = 1 self.grid.cellsize[i] = self.box.c_pbcbox.box[i][i] / self.grid.ncells[i] - self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] - # Populating grid - if populate_grid(&self.grid, self.coords_bbox) == RET_OK: - initialization_ok = True - - - if initialization_ok: - self.prepared = True - else: - raise RuntimeError("Could not initialize NS grid") + # This is just a guess on how much memory we might for each grid cell: + # we just assume an average bead density and we take four times this density just to be safe + allocation_guess = (4 * (ncoords / self.grid.size + 1)) + + # Allocate memory for the grid + self.grid.nbeads = malloc(sizeof(ns_int) * self.grid.size) + if self.grid.nbeads == NULL: + with gil: + raise MemoryError("Could not allocate memory for NS grid") + + # Allocate memory from temporary allocation counter + allocated_size = malloc(sizeof(ns_int) * self.grid.size) + if allocated_size == NULL: + # No need to free grid.nbeads as it will be freed by destroy_nsgrid called by __dealloc___ + with gil: + raise MemoryError("Could not allocate memory for allocation buffer") + + # Pre-allocate some memory for grid cells + for i in range(self.grid.size): + self.grid.nbeads[i] = 0 + allocated_size[i] = allocation_guess + + self.grid.beadids = malloc(sizeof(ns_int *) * self.grid.size) + if self.grid.beadids == NULL: + with gil: + raise MemoryError("Could not allocate memory for grid cells") + + for i in range(self.grid.size): + self.grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) + if self.grid.beadids[i] == NULL: + with gil: + raise MemoryError("Could not allocate memory for grid cell") + + # Populate grid cells using the coordinates (ie do the heavy work) + for i in range(ncoords): + cellindex = (coords[i][ZZ] / self.grid.cellsize[ZZ]) * (self.grid.ncells[XX] * self.grid.ncells[YY]) +\ + (coords[i][YY] / self.grid.cellsize[YY]) * self.grid.ncells[XX] + \ + (coords[i][XX] / self.grid.cellsize[XX]) + + self.grid.beadids[cellindex][self.grid.nbeads[cellindex]] = i + self.grid.nbeads[cellindex] += 1 + + # We need to allocate more memory (simply double the amount of memory as + # 1. it should barely be needed + # 2. the size should stay fairly reasonable + if self.grid.nbeads[cellindex] >= allocated_size[cellindex]: + allocated_size[cellindex] *= 2 + self.grid.beadids[cellindex] = realloc( self.grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) + + # Now we can free the allocation buffer + free(allocated_size) + + self.prepared = True def search(self, real[:, ::1]search_coords, return_ids=False): @@ -631,45 +588,27 @@ cdef class FastNS(object): with nogil: holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) + if holder == NULL: + raise MemoryError("Could not allocate memory to run NS core") + neighbors = [] - ###Modify for distance - sqdist = [] - indx = [] - ### for nid in range(holder.size): neighborhood = holder.neighborhoods[nid] if return_ids: neighborhood_py = np.empty(neighborhood.size, dtype=np.int64) - ###Modify for distance - neighborhood_dis = np.empty(neighborhood.size, dtype=np.float32) - neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) - ### + for i in range(neighborhood.size): neighborhood_py[i] = neighborhood.beadids[i] - ###Modify for distance - neighborhood_dis[i] = neighborhood.beaddist[i] - ### else: neighborhood_py = np.empty((neighborhood.size, DIM), dtype=np.float32) - ###Modify for distance - neighborhood_dis = np.empty((neighborhood.size), dtype=np.float32) - neighborhood_indx = np.empty(neighborhood.size, dtype=np.int64) - ### for i in range(neighborhood.size): - ###Modify for distance - neighborhood_dis[i] = neighborhood.beaddist[i] - neighborhood_indx[i] = neighborhood.beadids[i] - ### - for j in range(DIM): neighborhood_py[i,j] = self.coords[neighborhood.beadids[i], j] neighbors.append(neighborhood_py) - sqdist.append(neighborhood_dis) - indx.append(neighborhood_indx) # Free Memory free_neighborhood_holder(holder) - return neighbors, sqdist, indx + return neighbors diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_gridsearch.py index 4991a2da71d..1c3f5e06527 100644 --- a/testsuite/MDAnalysisTests/lib/test_gridsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_gridsearch.py @@ -67,7 +67,7 @@ def run_search(universe, ref_id): searcher.set_coords(coords) searcher.prepare() - results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0][0] + results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0] results_grid.sort() return results_pkdtree, results_grid From c6339c5965f90008aeb25fbd1e4aa713bc7cdb8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 8 Jul 2018 10:35:17 +0200 Subject: [PATCH 342/455] NSResults object added to store results from NS. Started documentation --- package/MDAnalysis/lib/c_gridsearch.pyx | 235 ++++++++++++++++-- .../MDAnalysisTests/lib/test_gridsearch.py | 81 +++++- 2 files changed, 278 insertions(+), 38 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 98d97eded65..9c50a5b1777 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -25,6 +25,15 @@ #cython: cdivision=True #cython: boundscheck=False +#cython: initializedcheck=False + +""" +Neighbor search library --- :mod:`MDAnalysis.lib.grid` +====================================================== + +This Neighbor search library is a serialized Cython port of the NS grid search implemented in GROMACS. +""" + # Preprocessor DEFs DEF DIM = 3 @@ -40,6 +49,7 @@ DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 from libc.stdlib cimport malloc, realloc, free +from libc.math cimport sqrt import numpy as np cimport numpy as np @@ -248,16 +258,21 @@ cdef class PBCBox(object): for j in range (i, -1, -1): dx[j] += self.c_pbcbox.box[i][j] + cdef real fast_distance2(self, rvec a, rvec b) nogil: + cdef rvec dx + self.fast_pbc_dx(a, b, dx) + return rvec_norm2(dx) + + cdef real fast_distance(self, rvec a, rvec b) nogil: + return sqrt(self.fast_distance2(a,b)) + cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: cdef ns_int i, m, d, natoms, wd = 0 cdef real[:,::1] bbox_coords natoms = coords.shape[0] with gil: - if natoms == 0: - bbox_coords = np.empty((0, DIM)) - else: - bbox_coords = coords.copy() + bbox_coords = coords.copy() for i in range(natoms): for m in range(DIM - 1, -1, -1): @@ -270,6 +285,8 @@ cdef class PBCBox(object): return bbox_coords def put_atoms_in_bbox(self, real[:,::1] coords): + if coords.shape[0] == 0: + return np.zeros((0, DIM), dtype=np.float32) return np.asarray(self.fast_put_atoms_in_bbox(coords)) ######################################################################################################################## @@ -439,6 +456,167 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, return holder +cdef class NSResults(object): + """ + Class used to store results returned by `MDAnalysis.lib.grid.FastNS.search` + """ + cdef PBCBox box + cdef readonly real cutoff + cdef real[:, ::1] grid_coords + cdef real[:, ::1] ref_coords + cdef ns_int **nids + cdef ns_int *nsizes + cdef ns_int size + cdef list indices + cdef list coordinates + cdef list distances + + def __init__(self, PBCBox box, real cutoff): + self.box = box + self.cutoff = cutoff + + self.size = 0 + self.nids = NULL + self.nsizes = NULL + + self.grid_coords = None + self.ref_coords = None + + self.indices = None + self.coordinates = None + self.distances = None + + + cdef populate(self, ns_neighborhood_holder *holder, grid_coords, ref_coords): + cdef ns_int nid, i + cdef ns_neighborhood *neighborhood + + self.grid_coords = grid_coords.copy() + self.ref_coords = ref_coords.copy() + + # Allocate memory + self.nsizes = malloc(sizeof(ns_int) * holder.size) + if self.nsizes == NULL: + raise MemoryError("Could not allocate memory for NSResults") + + self.nids = malloc(sizeof(ns_int *) * holder.size) + if self.nids == NULL: + raise MemoryError("Could not allocate memory for NSResults") + + for nid in range(holder.size): + neighborhood = holder.neighborhoods[nid] + + self.nsizes[nid] = neighborhood.size + + self.nids[nid] = malloc(sizeof(ns_int *) * neighborhood.size) + if self.nids[nid] == NULL: + raise MemoryError("Could not allocate memory for NSResults") + + with nogil: + for nid in range(holder.size): + neighborhood = holder.neighborhoods[nid] + + for i in range(neighborhood.size): + self.nids[nid][i] = neighborhood.beadids[i] + + self.size = holder.size + + def __dealloc__(self): + if self.nids != NULL: + for i in range(self.size): + if self.nids[i] != NULL: + free(self.nids[i]) + free(self.nids) + + if self.nsizes != NULL: + free(self.nsizes) + + + def get_indices(self): + """ + Return Neighbors indices. + + :return: list of indices + """ + cdef ns_int i, nid, size + + if self.indices is None: + indices = [] + + for nid in range(self.size): + size = self.nsizes[nid] + + tmp_incides = np.empty((size), dtype=np.int) + + for i in range(size): + tmp_incides[i] = self.nids[nid][i] + + indices.append(tmp_incides) + + self.indices = indices + + return self.indices + + + def get_coordinates(self): + """ + Return coordinates of neighbors. + + :return: list of coordinates + """ + cdef ns_int i, nid, size, beadid + + if self.coordinates is None: + coordinates = [] + + for nid in range(self.size): + size = self.nsizes[nid] + + tmp_values = np.empty((size, DIM), dtype=np.float32) + + for i in range(size): + beadid = self.nids[nid][i] + tmp_values[i] = self.grid_coords[beadid] + + coordinates.append(tmp_values) + + self.coordinates = coordinates + + return self.coordinates + + + def get_distances(self): + """ + Return coordinates of neighbors. + + :return: list of distances + """ + cdef ns_int i, nid, size, j, beadid + cdef rvec ref, other, dx + cdef real dist + + if self.distances is None: + distances = [] + + for nid in range(self.size): + size = self.nsizes[nid] + + tmp_values = np.empty((size), dtype=np.float32) + ref = &self.ref_coords[nid, 0] + + for i in range(size): + beadid = self.nids[nid][i] + other = &self.grid_coords[beadid, 0] + + tmp_values[i] = self.box.fast_distance(ref, other) + + distances.append(tmp_values) + + self.distances = distances + + return self.distances + + # Python interface cdef class FastNS(object): cdef PBCBox box @@ -448,7 +626,14 @@ cdef class FastNS(object): cdef bint prepared cdef ns_grid grid - def __init__(self, box): + def __init__(self, u): + import MDAnalysis as mda + from MDAnalysis.lib.mdamath import triclinic_vectors + + if not isinstance(u, mda.Universe): + raise TypeError("FastNS class must be initialized with a valid MDAnalysis.Universe instance") + box = triclinic_vectors(u.dimensions) + if box.shape != (3, 3): raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") @@ -466,6 +651,7 @@ cdef class FastNS(object): def __dealloc__(self): cdef ns_int i + # Deallocate NS grid if self.grid.nbeads != NULL: free(self.grid.nbeads) @@ -475,7 +661,8 @@ cdef class FastNS(object): free(self.grid.beadids) self.grid.size = 0 - + + def set_coords(self, real[:, ::1] coords): self.coords = coords @@ -568,12 +755,12 @@ cdef class FastNS(object): # Now we can free the allocation buffer free(allocated_size) - self.prepared = True - def search(self, real[:, ::1]search_coords, return_ids=False): + def search(self, search_coords): cdef real[:, ::1] search_coords_bbox + cdef real[:, ::1] search_coords_view cdef ns_int nid, i, j cdef ns_neighborhood_holder *holder cdef ns_neighborhood *neighborhood @@ -581,9 +768,18 @@ cdef class FastNS(object): if not self.prepared: self.prepare() + # Check the shape of search_coords as a array of 3D coords if needed + shape = search_coords.shape + if len(shape) == 1: + if not shape[0] == 3: + raise ValueError("Coordinates must be 3D") + else: + search_coords_view = np.array([search_coords,], dtype=np.float32) + else: + search_coords_view = search_coords # Make sure atoms are inside the brick-shaped box - search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords) + search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords_view) with nogil: holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) @@ -591,24 +787,11 @@ cdef class FastNS(object): if holder == NULL: raise MemoryError("Could not allocate memory to run NS core") - neighbors = [] - for nid in range(holder.size): - neighborhood = holder.neighborhoods[nid] - if return_ids: - neighborhood_py = np.empty(neighborhood.size, dtype=np.int64) - - for i in range(neighborhood.size): - neighborhood_py[i] = neighborhood.beadids[i] - else: - neighborhood_py = np.empty((neighborhood.size, DIM), dtype=np.float32) - for i in range(neighborhood.size): - for j in range(DIM): - neighborhood_py[i,j] = self.coords[neighborhood.beadids[i], j] - - neighbors.append(neighborhood_py) + results = NSResults(self.box, self.cutoff) + results.populate(holder, self.coords, search_coords_view) - # Free Memory + # Free memory allocated to holder free_neighborhood_holder(holder) - return neighbors + return results diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_gridsearch.py index 1c3f5e06527..30ab8813036 100644 --- a/testsuite/MDAnalysisTests/lib/test_gridsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_gridsearch.py @@ -24,14 +24,13 @@ import pytest -from numpy.testing import assert_equal +from numpy.testing import assert_equal, assert_allclose import numpy as np import MDAnalysis as mda from MDAnalysis.lib import grid from MDAnalysis.lib.pkdtree import PeriodicKDTree -from MDAnalysis.lib.mdamath import triclinic_vectors from MDAnalysisTests.datafiles import GRO @@ -42,12 +41,32 @@ def universe(): return u + +@pytest.fixture +def grid_results(): + u = mda.Universe(GRO) + cutoff = 2 + ref_pos = u.atoms.positions[13937] + return run_grid_search(u, ref_pos, cutoff) + + +def run_grid_search(u, ref_pos, cutoff): + coords = u.atoms.positions + + # Run grid search + searcher = grid.FastNS(u) + searcher.set_cutoff(cutoff) + searcher.set_coords(coords) + searcher.prepare() + + return searcher.search(ref_pos) + + + def run_search(universe, ref_id): cutoff = 3 - coords = universe.atoms.positions ref_pos = coords[ref_id] - triclinic_box = triclinic_vectors(universe.dimensions) # Run pkdtree search @@ -61,13 +80,8 @@ def run_search(universe, ref_id): results_pkdtree.sort() # Run grid search - - searcher = grid.FastNS(triclinic_box) - searcher.set_cutoff(cutoff) - searcher.set_coords(coords) - searcher.prepare() - - results_grid = searcher.search(np.array([ref_pos, ]), return_ids=True)[0] + results_grid = run_grid_search(universe, ref_pos, cutoff) + results_grid = results_grid.get_indices()[0] results_grid.sort() return results_pkdtree, results_grid @@ -86,4 +100,47 @@ def test_gridsearch_PBC(universe): ref_id = 13937 results_pkdtree, results_grid = run_search(universe, ref_id) - assert_equal(results_pkdtree, results_grid) \ No newline at end of file + + assert_equal(results_pkdtree, results_grid) + + +def test_gridsearch_arraycoord(universe): + """Check the NS routine accepts a single bead coordinate as well as array of coordinates""" + cutoff = 2 + ref_pos = universe.atoms.positions[:5] + + results = [ + np.array([2, 1, 4, 3]), + np.array([2, 0, 3]), + np.array([0, 1, 3]), + np.array([ 2, 0, 1, 38341]), + np.array([ 6, 0, 5, 17]) + ] + + results_grid = run_grid_search(universe, ref_pos, cutoff).get_indices() + + assert_equal(results_grid, results) + + +def test_gridsearch_search_coordinates(grid_results): + """Check the NS routine can return coordinates instead of ids""" + + results = np.array( + [ + [40.32, 34.25, 55.9], + [0.61, 76.33, -0.56], + [0.48999998, 75.9, 0.19999999], + [-0.11, 76.19, 0.77] + ]) + + assert_allclose(grid_results.get_coordinates()[0], results) + + +def test_gridsearch_search_distances(grid_results): + """Check the NS routine can return PBC distances from neighbors""" + results = np.array([0.096, 0.096, 0.015, 0.179]) * 10 # These distances were obtained using gmx distance + results.sort() + + rounded_results = np.round(grid_results.get_distances()[0], 2) + + assert_allclose(sorted(rounded_results), results) From 7f4a176cefa1ea1f33fd6d87ded4061944cfafce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Sun, 8 Jul 2018 20:10:33 +0200 Subject: [PATCH 343/455] Memory allocation changed to PyMem to enhance speed in c_gridsearch.pyx Pre-converting np.resize to PyMem stuff --- package/MDAnalysis/lib/c_gridsearch.pyx | 856 +++++++++++++++++++++--- 1 file changed, 771 insertions(+), 85 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index 9c50a5b1777..ffdb91fed7d 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -49,6 +49,8 @@ DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 from libc.stdlib cimport malloc, realloc, free +from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free + from libc.math cimport sqrt import numpy as np @@ -57,14 +59,18 @@ cimport numpy as np ctypedef np.int_t ns_int ctypedef np.float32_t real ctypedef real rvec[DIM] +ctypedef ns_int ivec[DIM] +ctypedef ns_int ipair[2] ctypedef real matrix[DIM][DIM] cdef struct ns_grid: + ns_int beadpercell ns_int size ns_int[DIM] ncells real[DIM] cellsize - ns_int *nbeads - ns_int **beadids + ns_int *nbeads # size + ns_int *beadids # size * beadpercell + ns_int *cellids # size cdef struct ns_neighborhood: real cutoff @@ -103,6 +109,7 @@ cdef class PBCBox(object): cdef cPBCBox_t c_pbcbox cdef rvec center cdef rvec bbox_center + cdef bint is_triclinic def __init__(self, real[:,::1] box): self.update(box) @@ -118,10 +125,15 @@ cdef class PBCBox(object): rvec_clear(self.center) # Update matrix + self.is_triclinic = False for i in range(DIM): for j in range(DIM): self.c_pbcbox.box[i][j] = box[i, j] self.center[j] += 0.5 * box[i, j] + + if i != j: + if box[i, j] > EPSILON: + self.is_triclinic = True self.bbox_center[i] = 0.5 * box[i, i] # Update diagonals @@ -274,14 +286,22 @@ cdef class PBCBox(object): with gil: bbox_coords = coords.copy() - for i in range(natoms): - for m in range(DIM - 1, -1, -1): - while bbox_coords[i, m] < 0: - for d in range(m+1): - bbox_coords[i, d] += self.c_pbcbox.box[m][d] - while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: - for d in range(m+1): - bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + if self.is_triclinic: + for i in range(natoms): + for m in range(DIM - 1, -1, -1): + while bbox_coords[i, m] < 0: + for d in range(m+1): + bbox_coords[i, d] += self.c_pbcbox.box[m][d] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + for d in range(m+1): + bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + else: + for i in range(natoms): + for m in range(DIM): + while bbox_coords[i, m] < 0: + bbox_coords[i, m] += self.c_pbcbox.box[m][m] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + bbox_coords[i, m] -= self.c_pbcbox.box[m][m] return bbox_coords def put_atoms_in_bbox(self, real[:,::1] coords): @@ -294,12 +314,6 @@ cdef class PBCBox(object): # Neighbor Search Stuff # ######################################################################################################################## -cdef struct ns_grid: - ns_int size - ns_int[DIM] ncells - real[DIM] cellsize - ns_int *nbeads - ns_int **beadids cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: cdef ns_neighborhood_holder *holder @@ -327,7 +341,7 @@ cdef void free_neighborhood_holder(ns_neighborhood_holder *holder) nogil: cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]neighborcoords, ns_grid *grid, PBCBox box, real cutoff2) nogil: cdef ns_int d, m - cdef ns_int xi, yi, zi, bid + cdef ns_int xi, yi, zi, bid, i_bead cdef real d2 cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords @@ -335,6 +349,7 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei cdef bint skip cdef ns_int nchecked = 0, icheck cdef ns_int cell_index + cdef ns_int cell_offset cdef ns_neighborhood *neighborhood = malloc(sizeof(ns_neighborhood)) if neighborhood == NULL: @@ -374,21 +389,23 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei (shifted_coord[XX] / grid.cellsize[XX]) # Just a safeguard - if cell_index >= grid.size: - continue + #if cell_index >= grid.size: + # continue # Check the cell index was not already selected - skip = False - for icheck in range(nchecked): - if already_checked[icheck] == cell_index: - skip = True - break - if skip: - continue + #skip = False + #for icheck in range(nchecked): + # if already_checked[icheck] == cell_index: + # skip = True + # break + #if skip: + # continue # Search for neighbors inside this cell for i_bead in range(grid.nbeads[cell_index]): - bid = grid.beadids[cell_index][i_bead] + cell_offset = cell_index * grid.beadpercell + i_bead + + bid = grid.beadids[cell_offset] box.fast_pbc_dx(current_coords, &neighborcoords[bid, XX], dx) @@ -411,8 +428,8 @@ cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]nei return NULL # Register the cell as checked - already_checked[nchecked] = cell_index - nchecked += 1 + #already_checked[nchecked] = cell_index + #nchecked += 1 return neighborhood @@ -462,8 +479,8 @@ cdef class NSResults(object): """ cdef PBCBox box cdef readonly real cutoff - cdef real[:, ::1] grid_coords - cdef real[:, ::1] ref_coords + cdef np.ndarray grid_coords + cdef np.ndarray ref_coords cdef ns_int **nids cdef ns_int *nsizes cdef ns_int size @@ -471,6 +488,16 @@ cdef class NSResults(object): cdef list coordinates cdef list distances + def __dealloc__(self): + if self.nids != NULL: + for i in range(self.size): + if self.nids[i] != NULL: + free(self.nids[i]) + free(self.nids) + + if self.nsizes != NULL: + free(self.nsizes) + def __init__(self, PBCBox box, real cutoff): self.box = box self.cutoff = cutoff @@ -491,8 +518,8 @@ cdef class NSResults(object): cdef ns_int nid, i cdef ns_neighborhood *neighborhood - self.grid_coords = grid_coords.copy() - self.ref_coords = ref_coords.copy() + self.grid_coords = np.asarray(grid_coords) + self.ref_coords = np.asarray(ref_coords) # Allocate memory self.nsizes = malloc(sizeof(ns_int) * holder.size) @@ -521,17 +548,6 @@ cdef class NSResults(object): self.size = holder.size - def __dealloc__(self): - if self.nids != NULL: - for i in range(self.size): - if self.nids[i] != NULL: - free(self.nids[i]) - free(self.nids) - - if self.nsizes != NULL: - free(self.nsizes) - - def get_indices(self): """ Return Neighbors indices. @@ -594,6 +610,8 @@ cdef class NSResults(object): cdef ns_int i, nid, size, j, beadid cdef rvec ref, other, dx cdef real dist + cdef real[:, ::1] ref_coords = self.ref_coords + cdef real[:, ::1] grid_coords = self.grid_coords if self.distances is None: distances = [] @@ -602,11 +620,11 @@ cdef class NSResults(object): size = self.nsizes[nid] tmp_values = np.empty((size), dtype=np.float32) - ref = &self.ref_coords[nid, 0] + ref = &ref_coords[nid, 0] for i in range(size): beadid = self.nids[nid][i] - other = &self.grid_coords[beadid, 0] + other = &grid_coords[beadid, 0] tmp_values[i] = self.box.fast_distance(ref, other) @@ -616,6 +634,577 @@ cdef class NSResults(object): return self.distances +cdef class NSResults2(object): + cdef readonly real cutoff + cdef ns_int npairs + cdef bint debug + + cdef real[:, ::1] grid_coords # shape: size, DIM + cdef ns_int[:] search_ids + + cdef ns_int allocation_size + cdef ns_int[:, ::1] pairs# shape: pair_allocation, 2 + cdef real[:] pair_distances2 # shape: pair_allocation, 2 + + cdef list indices_buffer + cdef list coordinates_buffer + cdef list distances_buffer + cdef np.ndarray pairs_buffer + cdef np.ndarray pair_distances_buffer + + def __init__(self, real cutoff, real[:, ::1]grid_coords,ns_int[:] search_ids, debug=False): + + self.debug = debug + self.cutoff = cutoff + self.grid_coords = grid_coords + self.search_ids = search_ids + + # Preallocate memory + self.allocation_size = grid_coords.shape[0] + self.pairs = np.empty((self.allocation_size, 2), dtype=np.int) + self.pair_distances2 = np.empty(self.allocation_size, dtype=np.float32) + self.npairs = 0 + + # Buffer + self.indices_buffer = None + self.coordinates_buffer = None + self.distances_buffer = None + self.pair_distances_buffer = None + + cdef int add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil except 0: + # Reallocate memory if needed + if self.npairs >= self.allocation_size: + # We need to reallocate memory + with gil: + self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) + + # Actually store pair and distance squared + if beadid_i < beadid_j: + self.pairs[self.npairs, 0] = beadid_i + self.pairs[self.npairs, 1] = beadid_j + else: + self.pairs[self.npairs, 1] = beadid_i + self.pairs[self.npairs, 0] = beadid_j + self.pair_distances2[self.npairs] = distance2 + self.npairs += 1 + + return self.npairs + + cdef resize(self, ns_int new_size): + cdef ns_int[:, ::1] pair_buffer + cdef real[:] dists_buffer + cdef ns_int i, j + + if new_size < self.npairs: + # Silently ignored the request + return + + if self.allocation_size >= new_size: + if self.debug: + print("NSresults reallocation requested but not needed ({} requested but {} already allocated)".format(new_size, self.allocation_size)) + return + + self.allocation_size = new_size + + if self.debug: + print("NSresults reallocated to {} pairs".format(self.allocation_size)) + + # Note: np.empty + update is faster than resize + # Allocating memory + pair_buffer = self.pairs + self.pairs = np.empty((self.allocation_size, 2), dtype=np.int) + + + dists_buffer = self.pair_distances2 + self.pair_distances2 = np.empty(self.allocation_size, dtype=np.float32) + + + # Update values + with nogil: + for i in range(self.npairs): + for j in range(2): + self.pairs[i, j] = pair_buffer[i, j] + + self.pair_distances2[i] = dists_buffer[i] + + def get_pairs(self): + if self.pairs_buffer is None: + self.pairs_buffer = np.array(self.pairs[:self.npairs]) + return self.pairs_buffer + + def get_pair_distances(self): + if self.pair_distances_buffer is None: + self.pair_distances_buffer = np.sqrt(self.pair_distances2[:self.npairs]) + return self.pair_distances_buffer + + cdef create_buffers(self): + cdef ns_int i, beadid_i, beadid_j + cdef real dist2 + cdef real[:] coord_i, coord_j + from collections import defaultdict + + indices_buffer = defaultdict(list) + coords_buffer = defaultdict(list) + dists_buffer = defaultdict(list) + + for i in range(self.npairs): + beadid_i = self.pairs[i, 0] + beadid_j = self.pairs[i, 1] + + dist2 = self.pair_distances2[i] + coord_i = self.grid_coords[beadid_i] + coord_j = self.grid_coords[beadid_j] + + indices_buffer[beadid_i].append(beadid_j) + indices_buffer[beadid_j].append(beadid_i) + + coords_buffer[beadid_i].append(coord_j) + coords_buffer[beadid_j].append((coord_i)) + + dists_buffer[beadid_i].append(dist2) + dists_buffer[beadid_j].append(dist2) + + self.indices_buffer = [] + self.coordinates_buffer = [] + self.distances_buffer = [] + + for elm in self.search_ids: + sorted_indices = np.argsort(indices_buffer[elm]) + self.indices_buffer.append(np.array(indices_buffer[elm])[sorted_indices]) + self.coordinates_buffer.append(np.array(coords_buffer[elm])[sorted_indices]) + self.distances_buffer.append(np.sqrt(dists_buffer[elm])[sorted_indices]) + + def get_indices(self): + if self.indices_buffer is None: + self.create_buffers() + return self.indices_buffer + + def get_distances(self): + if self.distances_buffer is None: + self.create_buffers() + return self.distances_buffer + + def get_coordinates(self): + if self.coordinates_buffer is None: + self.create_buffers() + return self.coordinates_buffer + + + +cdef class NSGrid(object): + cdef bint debug + cdef readonly real cutoff + cdef ns_int size + cdef ns_int ncoords + cdef ns_int[DIM] ncells + cdef ns_int[DIM] cell_offsets + cdef real[DIM] cellsize + cdef ns_int[:] nbeads # size + cdef ns_int[:, ::1] beadids # size * beadpercell + cdef ns_int[:] cellids # ncoords + cdef ns_int[:, ::1] cellxyz + + def __init__(self, ncoords, cutoff, PBCBox box, max_size, debug=False): + cdef ns_int i, x, y, z + cdef ns_int ncellx, ncelly, ncellz, size, nbeadspercell + cdef real bbox_vol + self.debug = debug + + self.ncoords = ncoords + + # Calculate best cutoff + self.cutoff = cutoff + bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + size = bbox_vol/cutoff**3 + nbeadspercell = ncoords/size + while bbox_vol/self.cutoff**3 > max_size: + self.cutoff *= 1.2 + + + for i in range(DIM): + self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) + if self.ncells[i] == 0: + self.ncells[i] = 1 + self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] + self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] + + if self.debug: + print("NSGrid: Requested cutoff: {:.3f} (Ncells={}, Avg # of beads per cell={}), Optimized cutoff= {:.3f} (Ncells={}, Avg # of beads per cell={})".format( + cutoff, size, nbeadspercell, + self.cutoff, self.size, (ncoords / self.size) + )) + print("NSGrid: Size={}x{}x{}={}".format(self.ncells[XX], self.ncells[YY], self.ncells[ZZ], self.size)) + + self.cell_offsets[XX] = 0 + self.cell_offsets[YY] = self.ncells[XX] + self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] + + # Allocate memory + self.nbeads = np.zeros(self.size, dtype=np.int) + self.cellids = np.empty(self.ncoords, dtype=np.int) + #self.cellxyz = np.empty((self.size, DIM), dtype=np.int) + + #i = 0 + #for z in range(self.ncells[ZZ]): + # for y in range(self.ncells[YY]): + # for x in range(self.ncells[XX]): + # self.cellxyz[i, XX] = x + # self.cellxyz[i, YY] = y + # self.cellxyz[i, ZZ] = z + # i += 1 + + # Number of maximum bead per cell is not known, so wa can not allocate memory + self.beadids = None + + cdef ns_int coord2cellid(self, rvec coord) nogil: + return (coord[ZZ] / self.cellsize[ZZ]) * (self.ncells[XX] * self.ncells[YY]) +\ + (coord[YY] / self.cellsize[YY]) * self.ncells[XX] + \ + (coord[XX] / self.cellsize[XX]) + + cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: + if cellid < 0: + return False + if cellid >= self.size: + return False + + cellxyz[ZZ] = (cellid / self.cell_offsets[ZZ]) + cellid -= cellxyz[ZZ] * self.cell_offsets[ZZ] + + cellxyz[YY] = (cellid / self.cell_offsets[YY]) + cellxyz[XX] = cellid - cellxyz[YY] * self.cell_offsets[YY] + + return True + + cdef fill_grid(self, real[:, ::1] coords): + cdef ns_int i, cellindex = -1, nbeads_max = 0 + cdef ns_int ncoords = coords.shape[0] + + cdef ns_int *beadcounts = NULL + + # Allocate memory + beadcounts = PyMem_Malloc(sizeof(ns_int) * self.size) + if not beadcounts: + raise MemoryError("Could not allocate memory for bead count buffer") + + + with nogil: + # Initialize buffers + for i in range(self.size): + beadcounts[i] = 0 + + # First loop: find cellindex for each bead + for i in range(ncoords): + cellindex = self.coord2cellid(&coords[i, 0]) + + self.nbeads[cellindex] += 1 + self.cellids[i] = cellindex + + if self.nbeads[cellindex] > nbeads_max: + nbeads_max = self.nbeads[cellindex] + + # Allocate memory + with gil: + self.beadids = np.empty((self.size, nbeads_max), dtype=np.int) + + # Second loop: fill grid + for i in range(ncoords): + + # Add bead to grid cell + cellindex = self.cellids[i] + self.beadids[cellindex, beadcounts[cellindex]] = i + beadcounts[cellindex] += 1 + + + # Now we can free the allocation buffer + PyMem_Free(beadcounts) + + + +# Python interface +cdef class FastNS2(object): + cdef bint debug + cdef PBCBox box + cdef readonly real[:, ::1] coords + cdef real[:, ::1] coords_bbox + cdef readonly real cutoff + cdef bint prepared + cdef NSGrid grid + + def __init__(self, u, cutoff, coords=None, prepare=True, debug=False, max_gridsize=5000): + import MDAnalysis as mda + from MDAnalysis.lib.mdamath import triclinic_vectors + + self.debug = debug + + if not isinstance(u, mda.Universe): + raise TypeError("FastNS class must be initialized with a valid MDAnalysis.Universe instance") + box = triclinic_vectors(u.dimensions) + + if box.shape != (3, 3): + raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") + + self.box = PBCBox(box) + + + if coords is None: + coords = u.atoms.positions + + self.coords = coords.copy() + + self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) + + if not prepare: + return + + if self.cutoff < 0: + raise ValueError("Cutoff must be positive!") + if self.cutoff * self.cutoff > self.box.c_pbcbox.max_cutoff2: + raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") + self.cutoff = cutoff + + self.grid = NSGrid(self.coords_bbox.shape[0], cutoff, self.box, max_gridsize, debug=debug) + self.prepared = False + + if prepare: + self.prepare() + + + def prepare(self, force=False): + if self.prepared and not force: + return + + self.grid.fill_grid(self.coords_bbox) + + self.prepared = True + + def search(self, search_ids, min_size_increment=10): + cdef ns_int[:] search_ids_view, neighbors_view + cdef ns_int nid, i, j, size_search + cdef NSResults2 results + + cdef ns_int current_beadid + cdef rvec current_coords + + cdef ns_int cellx, celly, cellz, cellindex_adjacent + cdef ivec cellxyz, debug_cellxyz + + cdef real[:, ::1] search_coords + + #Temp stuff + cdef ns_int size = self.coords_bbox.shape[0] + cdef ns_int d, m + cdef ns_int xi, yi, zi, bid, i_bead + cdef real d2 + cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords + + cdef bint already_checked[27] + cdef bint skip + cdef ns_int nchecked = 0, icheck + cdef ns_int cellindex + cdef ns_int cell_offset + + cdef ns_int[:] neighbor_ids + cdef ns_int[:] nneighbors + cdef ns_int nid_offset + + cdef real cutoff2 = self.cutoff * self.cutoff + + cdef ns_int[:] checked + + cdef ns_int npairs = 0 + cdef ns_int guessed_size = 0 + cdef bint first_ns = True + + import sys + flush = sys.stdout.flush + + if not self.prepared: + self.prepare() + + + search_ids_view = search_ids + size_search = search_ids.shape[0] + + checked = np.zeros(size, dtype=np.int) + + results = NSResults2(self.cutoff, self.coords_bbox, search_ids, self.debug) + + with nogil: + for i in range(size_search): + current_beadid = search_ids_view[i] + + cellindex = self.grid.cellids[current_beadid] + self.grid.cellid2cellxyz(cellindex, cellxyz) + + if self.debug: + + with gil: + print("Checking neighbors for bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]:" .format( + current_beadid, + self.coords[current_beadid, XX], self.coords[current_beadid, YY], self.coords[current_beadid, ZZ], + self.coords_bbox[current_beadid, XX], self.coords_bbox[current_beadid, YY], self.coords_bbox[current_beadid, ZZ], + cellxyz[XX], cellxyz[YY], cellxyz[ZZ])) + + + for xi in range(DIM): + if xi == 0: + if self.coords_bbox[current_beadid, XX] - self.cutoff > self.grid.cellsize[XX] * cellxyz[XX]: + if self.debug: + with gil: + print("\n#-> Bead X={:.3f}, Cell X={:.3f}, cutoff={:.3f} -> -X shift is ignored".format(self.coords_bbox[current_beadid, XX], self.grid.cellsize[XX] * cellxyz[XX], self.cutoff)) + continue + + if xi == 2: + if self.coords_bbox[current_beadid, XX] + self.cutoff < self.grid.cellsize[XX] * (cellxyz[XX] + 1): + if self.debug: + with gil: + print("\n#-> Bead X={:.3f}, Next cell X={:.3f}, cutoff={:.3f} -> +X shift is ignored".format(self.coords_bbox[current_beadid, XX], self.grid.cellsize[XX] * (cellxyz[XX] + 1), self.cutoff)) + continue + + for yi in range(DIM): + if xi == 0: + if self.coords_bbox[current_beadid, YY] - self.cutoff > self.grid.cellsize[YY] * cellxyz[YY]: + if self.debug: + with gil: + print("\n#-> Bead Y={:.3f}, Cell Y={:.3f}, cutoff={:.3f} -> -Y shift is ignored".format(self.coords_bbox[current_beadid, YY], self.grid.cellsize[YY] * cellxyz[YY], self.cutoff)) + continue + + if xi == 2: + if self.coords_bbox[current_beadid, YY] + self.cutoff < self.grid.cellsize[YY] * (cellxyz[YY] + 1): + if self.debug: + with gil: + print("\n#-> Bead Y={:.3f}, Next cell Y={:.3f}, cutoff={:.3f} -> +Y shift is ignored".format(self.coords_bbox[current_beadid, YY], self.grid.cellsize[YY] * (cellxyz[YY] + 1), self.cutoff)) + continue + + + for zi in range(DIM): + if xi == 0: + if self.coords_bbox[current_beadid, ZZ] - self.cutoff > self.grid.cellsize[ZZ] * cellxyz[ZZ]: + if self.debug: + with gil: + print("\n#-> Bead Z={:.3f}, Cell Z={:.3f}, cutoff={:.3f} -> -Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[ZZ] * cellxyz[ZZ], self.cutoff)) + continue + + if xi == 2: + if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.grid.cellsize[ZZ] * (cellxyz[ZZ] + 1): + if self.debug: + with gil: + print("\n#-> Bead Z={:.3f}, Next cell Z={:.3f}, cutoff={:.3f} -> +Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[XX] * (cellxyz[ZZ] + 1), self.cutoff)) + continue + + # Calculate and/or reinitialize shifted coordinates + shifted_coord[XX] = self.coords[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] + shifted_coord[YY] = self.coords[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] + shifted_coord[ZZ] = self.coords[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] + + # Make sure the shifted coordinates is inside the brick-shaped box + for m in range(DIM - 1, -1, -1): + + while shifted_coord[m] < 0: + for d in range(m+1): + shifted_coord[d] += self.box.c_pbcbox.box[m][d] + + + while shifted_coord[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + shifted_coord[d] -= self.box.c_pbcbox.box[m][d] + + # Get the cell index corresponding to the coord + cellindex = self.grid.coord2cellid(shifted_coord) + + if self.debug: + self.grid.cellid2cellxyz(cellindex, debug_cellxyz) + with gil: + dist_shift = self.box.fast_distance(&self.coords[current_beadid, XX], shifted_coord) + grid_shift = np.array([(xi - 1) * self.grid.cellsize[XX], + (yi - 1) * self.grid.cellsize[YY], + (zi - 1) * self.grid.cellsize[ZZ]]) + print("-> Checking cell#{} ({},{},{}) for neighbors (dshift={:.3f}, grid_shift=({:.3f},{:.3f},{:.3f}->{:.3f})".format( + cellindex, + debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], + dist_shift, + grid_shift[XX], grid_shift[YY], grid_shift[ZZ], + np.sqrt(np.sum(grid_shift**2)) + )) + if dist_shift > 2* self.cutoff: + print(" \_ This cell should be ignored!") + else: + print(" \_ This cell is needed") + + for j in range(self.grid.nbeads[cellindex]): + bid = self.grid.beadids[cellindex, j] + + if checked[bid] != 0: + continue + + d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + + if self.debug and False: + self.grid.cellid2cellxyz(cellindex, debug_cellxyz) + with gil: + print( + "Beads #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) and #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) are tested (d2={:.3f})".format( + current_beadid, + cellxyz[XX], cellxyz[YY], cellxyz[ZZ], + self.coords_bbox[current_beadid, XX], + self.coords_bbox[current_beadid, YY], + self.coords_bbox[current_beadid, ZZ], + bid, + debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], + self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], + self.coords_bbox[bid, ZZ], + d2)) + + if d2 < cutoff2: + + if d2 < EPSILON: + continue + + if self.debug: + self.grid.cellid2cellxyz(cellindex, debug_cellxyz) + with gil: + self.box.fast_pbc_dx(&self.coords[current_beadid, XX], &self.coords[bid, XX], dx) + dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) + + print(" \_ Neighbor found: bead#{} (cell[{},{},{}]) -> dx={} -> d={:.3f}".format(bid, debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], dx_py, np.sqrt(d2))) + results.add_neighbors(current_beadid, bid, d2) + npairs += 1 + + if first_ns: + guessed_size = ((npairs + 1) * 0.75 * size_search) + with gil: + if self.debug: + print("Neighbors of first beads= {} -> Approximated total of pairs={}".format(npairs, guessed_size)) + results.resize(guessed_size) + + first_ns = False + checked[current_beadid] = 1 + + if self.debug: + print("Total number of pairs={}".format(npairs)) + + ref_bead = 13937 + beads = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 + for bid in beads: + self.box.fast_pbc_dx(&self.coords[ref_bead, XX], &self.coords[bid, XX], dx) + dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) + self.box.fast_pbc_dx(&self.coords_bbox[ref_bead, XX], &self.coords_bbox[bid, XX], dx) + rect_dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) + self.grid.cellid2cellxyz(self.grid.coord2cellid(&self.coords_bbox[bid, XX]), cellxyz) + print("Bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]: dx=[{:.3f},{:.3f},{:.3f}] -> dist: {:.3f} ({}) - rect_dist: {:.3f} ({})".format( + bid, + self.coords[bid, XX], self.coords[bid, YY], self.coords[bid,ZZ], + self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], self.coords_bbox[bid,ZZ], + cellxyz[XX], cellxyz[YY], cellxyz[ZZ], + dx[XX], dx[YY], dx[ZZ], + np.sqrt(np.sum(dx_py**2)), + self.box.fast_distance(&self.coords[ref_bead, XX], &self.coords[bid, XX]) <= self.cutoff, + np.sqrt(np.sum(rect_dx_py**2)), + np.sqrt(np.sum(rect_dx_py**2)) <= self.cutoff + )) + + return results + # Python interface cdef class FastNS(object): @@ -651,14 +1240,16 @@ cdef class FastNS(object): def __dealloc__(self): cdef ns_int i + # Deallocate NS grid if self.grid.nbeads != NULL: free(self.grid.nbeads) - for i in range(self.grid.size): - if self.grid.beadids[i] != NULL: - free(self.grid.beadids[i]) - free(self.grid.beadids) + if self.grid.beadids != NULL: + free(self.grid.beadids) + + if self.grid.cellids != NULL: + free(self.grid.cellids) self.grid.size = 0 @@ -680,11 +1271,11 @@ cdef class FastNS(object): def prepare(self, force=False): cdef ns_int i, cellindex = -1 - cdef ns_int *allocated_size = NULL cdef ns_int ncoords = self.coords.shape[0] - cdef ns_int allocation_guess cdef rvec *coords = &self.coords_bbox[0, 0] + cdef ns_int *beadcounts = NULL + if self.prepared and not force: print("NS already prepared, nothing to do!") @@ -704,57 +1295,55 @@ cdef class FastNS(object): self.grid.cellsize[i] = self.box.c_pbcbox.box[i][i] / self.grid.ncells[i] self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] - # This is just a guess on how much memory we might for each grid cell: - # we just assume an average bead density and we take four times this density just to be safe - allocation_guess = (4 * (ncoords / self.grid.size + 1)) + # Allocate memory for temporary buffers + self.grid.cellids = malloc(sizeof(ns_int) * ncoords) + if self.grid.cellids == NULL: + with gil: + raise MemoryError("Could not allocate memory for cell ids") + + beadcounts = malloc(sizeof(ns_int) * self.grid.size) + if beadcounts == NULL: + with gil: + raise MemoryError("Could not allocate memory for bead count buffer") - # Allocate memory for the grid self.grid.nbeads = malloc(sizeof(ns_int) * self.grid.size) if self.grid.nbeads == NULL: with gil: raise MemoryError("Could not allocate memory for NS grid") - # Allocate memory from temporary allocation counter - allocated_size = malloc(sizeof(ns_int) * self.grid.size) - if allocated_size == NULL: - # No need to free grid.nbeads as it will be freed by destroy_nsgrid called by __dealloc___ - with gil: - raise MemoryError("Could not allocate memory for allocation buffer") - - # Pre-allocate some memory for grid cells + # Initialize buffers for i in range(self.grid.size): self.grid.nbeads[i] = 0 - allocated_size[i] = allocation_guess + beadcounts[i] = 0 - self.grid.beadids = malloc(sizeof(ns_int *) * self.grid.size) - if self.grid.beadids == NULL: - with gil: - raise MemoryError("Could not allocate memory for grid cells") - for i in range(self.grid.size): - self.grid.beadids[i] = malloc(sizeof(ns_int) * allocated_size[i]) - if self.grid.beadids[i] == NULL: - with gil: - raise MemoryError("Could not allocate memory for grid cell") - - # Populate grid cells using the coordinates (ie do the heavy work) + # First loop: find cellindex for each bead for i in range(ncoords): cellindex = (coords[i][ZZ] / self.grid.cellsize[ZZ]) * (self.grid.ncells[XX] * self.grid.ncells[YY]) +\ (coords[i][YY] / self.grid.cellsize[YY]) * self.grid.ncells[XX] + \ (coords[i][XX] / self.grid.cellsize[XX]) - self.grid.beadids[cellindex][self.grid.nbeads[cellindex]] = i self.grid.nbeads[cellindex] += 1 + self.grid.cellids[i] = cellindex + + if self.grid.nbeads[cellindex] > self.grid.beadpercell: + self.grid.beadpercell = self.grid.nbeads[cellindex] + + # Allocate memory and set offsets + self.grid.beadids = malloc(sizeof(ns_int) * self.grid.size * self.grid.beadpercell) + if self.grid.beadids == NULL: + with gil: + raise MemoryError("Could not allocate memory for NS grid bead ids") - # We need to allocate more memory (simply double the amount of memory as - # 1. it should barely be needed - # 2. the size should stay fairly reasonable - if self.grid.nbeads[cellindex] >= allocated_size[cellindex]: - allocated_size[cellindex] *= 2 - self.grid.beadids[cellindex] = realloc( self.grid.beadids[cellindex], sizeof(ns_int) * allocated_size[cellindex]) + # Second loop: fill grid + for i in range(ncoords): + cellindex = self.grid.cellids[i] + self.grid.beadids[cellindex * self.grid.beadpercell + beadcounts[cellindex]] = i + beadcounts[cellindex] += 1 # Now we can free the allocation buffer - free(allocated_size) + free(beadcounts) + self.prepared = True @@ -787,7 +1376,6 @@ cdef class FastNS(object): if holder == NULL: raise MemoryError("Could not allocate memory to run NS core") - results = NSResults(self.box, self.cutoff) results.populate(holder, self.coords, search_coords_view) @@ -795,3 +1383,101 @@ cdef class FastNS(object): free_neighborhood_holder(holder) return results + + def search2(self, search_ids): + cdef ns_int[:] search_ids_view, neighbors_view + cdef ns_int nid, i, j, size_search + cdef ns_neighborhood_holder *holder + cdef ns_neighborhood *neighborhood + + cdef ns_int current_beadid + cdef rvec current_coords + + #Temp stuff + cdef ns_int size = self.coords_bbox.shape[0] + cdef ns_int d, m + cdef ns_int xi, yi, zi, bid, i_bead + cdef real d2 + cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords + + cdef bint already_checked[27] + cdef bint skip + cdef ns_int nchecked = 0, icheck + cdef ns_int cell_index + cdef ns_int cell_offset + + cdef ns_int[:] neighbor_ids + cdef ns_int[:] nneighbors + cdef ns_int nid_offset + + cdef real cutoff2 = self.cutoff * self.cutoff + + + if not self.prepared: + self.prepare() + + nid_offset = self.grid.beadpercell * 27 + neighbor_ids = np.empty(size * nid_offset, dtype=np.int) + nneighbors = np.zeros(size, dtype=np.int) + + + search_ids_view = search_ids + size_search = search_ids_view.shape[0] + + with nogil: + + for current_beadid in range(size): + + for zi in range(3): + for yi in range(3): + for xi in range(3): + # Calculate and/or reinitialize shifted coordinates + shifted_coord[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] + shifted_coord[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] + shifted_coord[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] + + # Make sure the shifted coordinates is inside the brick-shaped box + for m in range(DIM - 1, -1, -1): + + while shifted_coord[m] < 0: + for d in range(m+1): + shifted_coord[d] += self.box.c_pbcbox.box[m][d] + + + while shifted_coord[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + shifted_coord[d] -= self.box.c_pbcbox.box[m][d] + + # Get the cell index corresponding to the coord + cell_index = (shifted_coord[ZZ] / self.grid.cellsize[ZZ]) * (self.grid.ncells[XX] * self.grid.ncells[YY]) +\ + (shifted_coord[YY] / self.grid.cellsize[YY]) * self.grid.ncells[XX] + \ + (shifted_coord[XX] / self.grid.cellsize[XX]) + + # Search for neighbors inside this cell + for i_bead in range(self.grid.nbeads[cell_index]): + cell_offset = cell_index * self.grid.beadpercell + i_bead + + bid = self.grid.beadids[cell_offset] + + if bid <= current_beadid: + continue + + self.box.fast_pbc_dx(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX], dx) + + d2 = rvec_norm2(dx) + + if d2 < cutoff2: + neighbor_ids[current_beadid * nid_offset + nneighbors[current_beadid]] = bid + nneighbors[current_beadid] += 1 + + neighbor_ids[bid * nid_offset + nneighbors[bid]] = current_beadid + nneighbors[bid] += 1 + + + + + results = [] + #for bid in search_ids: + # results.append(np.asarray(neighbor_ids[bid * nid_offset : bid * nid_offset + nneighbors[bid]])) + + return results From 86505097885e31040cea2a7f5360b39f0831a6bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Mon, 16 Jul 2018 11:45:11 +0200 Subject: [PATCH 344/455] Unneeded code removed from c_gridsearch.pyx --- package/MDAnalysis/lib/c_gridsearch.pyx | 526 ++++++++---------- .../MDAnalysisTests/lib/test_gridsearch.py | 147 +++-- 2 files changed, 307 insertions(+), 366 deletions(-) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/c_gridsearch.pyx index ffdb91fed7d..a1f519eac37 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/c_gridsearch.pyx @@ -55,6 +55,7 @@ from libc.math cimport sqrt import numpy as np cimport numpy as np +cimport cython ctypedef np.int_t ns_int ctypedef np.float32_t real @@ -473,7 +474,7 @@ cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, return holder -cdef class NSResults(object): +cdef class NSResultsOld(object): """ Class used to store results returned by `MDAnalysis.lib.grid.FastNS.search` """ @@ -634,7 +635,7 @@ cdef class NSResults(object): return self.distances -cdef class NSResults2(object): +cdef class NSResults(object): cdef readonly real cutoff cdef ns_int npairs cdef bint debug @@ -643,8 +644,8 @@ cdef class NSResults2(object): cdef ns_int[:] search_ids cdef ns_int allocation_size - cdef ns_int[:, ::1] pairs# shape: pair_allocation, 2 - cdef real[:] pair_distances2 # shape: pair_allocation, 2 + cdef ipair *pairs # shape: pair_allocation + cdef real *pair_distances2 # shape: pair_allocation cdef list indices_buffer cdef list coordinates_buffer @@ -660,81 +661,96 @@ cdef class NSResults2(object): self.search_ids = search_ids # Preallocate memory - self.allocation_size = grid_coords.shape[0] - self.pairs = np.empty((self.allocation_size, 2), dtype=np.int) - self.pair_distances2 = np.empty(self.allocation_size, dtype=np.float32) + self.allocation_size = search_ids.shape[0] + 1 + self.pairs = PyMem_Malloc(sizeof(ipair) * self.allocation_size) + if not self.pairs: + MemoryError("Could not allocate memory for NSResults.pairs ({} bits requested)".format(sizeof(ipair) * self.allocation_size)) + self.pair_distances2 = PyMem_Malloc(sizeof(real) * self.allocation_size) + if not self.pair_distances2: + raise MemoryError("Could not allocate memory for NSResults.pair_distances2 ({} bits requested)".format(sizeof(real) * self.allocation_size)) self.npairs = 0 # Buffer self.indices_buffer = None self.coordinates_buffer = None self.distances_buffer = None + self.pairs_buffer = None self.pair_distances_buffer = None - cdef int add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil except 0: + def __dealloc__(self): + PyMem_Free(self.pairs) + PyMem_Free(self.pair_distances2) + + cdef int add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: + # Important: If this function returns 0, it means that memory allocation failed + # Reallocate memory if needed if self.npairs >= self.allocation_size: # We need to reallocate memory - with gil: - self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) + if self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) == 0: + return 0 # Actually store pair and distance squared if beadid_i < beadid_j: - self.pairs[self.npairs, 0] = beadid_i - self.pairs[self.npairs, 1] = beadid_j + self.pairs[self.npairs][0] = beadid_i + self.pairs[self.npairs][1] = beadid_j else: - self.pairs[self.npairs, 1] = beadid_i - self.pairs[self.npairs, 0] = beadid_j + self.pairs[self.npairs][1] = beadid_i + self.pairs[self.npairs][0] = beadid_j self.pair_distances2[self.npairs] = distance2 self.npairs += 1 return self.npairs - cdef resize(self, ns_int new_size): - cdef ns_int[:, ::1] pair_buffer - cdef real[:] dists_buffer - cdef ns_int i, j + cdef int resize(self, ns_int new_size) nogil: + # Important: If this function returns 0, it means that memory allocation failed if new_size < self.npairs: # Silently ignored the request - return + return 1 if self.allocation_size >= new_size: if self.debug: - print("NSresults reallocation requested but not needed ({} requested but {} already allocated)".format(new_size, self.allocation_size)) - return + with gil: + print("NSresults: Reallocation requested but not needed ({} requested but {} already allocated)".format(new_size, self.allocation_size)) + return 1 self.allocation_size = new_size if self.debug: - print("NSresults reallocated to {} pairs".format(self.allocation_size)) + with gil: + print("NSresults: Reallocated to {} pairs".format(self.allocation_size)) - # Note: np.empty + update is faster than resize # Allocating memory - pair_buffer = self.pairs - self.pairs = np.empty((self.allocation_size, 2), dtype=np.int) - - - dists_buffer = self.pair_distances2 - self.pair_distances2 = np.empty(self.allocation_size, dtype=np.float32) + with gil: + self.pairs = PyMem_Realloc(self.pairs, sizeof(ipair) * self.allocation_size) + self.pair_distances2 = PyMem_Realloc(self.pair_distances2, sizeof(real) * self.allocation_size) + if not self.pairs: + return 0 - # Update values - with nogil: - for i in range(self.npairs): - for j in range(2): - self.pairs[i, j] = pair_buffer[i, j] + if not self.pair_distances2: + return 0 - self.pair_distances2[i] = dists_buffer[i] + return 1 def get_pairs(self): + cdef ns_int i + if self.pairs_buffer is None: - self.pairs_buffer = np.array(self.pairs[:self.npairs]) + self.pairs_buffer = np.empty((self.npairs, 2), dtype=np.int) + for i in range(self.npairs): + self.pairs_buffer[i, 0] = self.pairs[i][0] + self.pairs_buffer[i, 1] = self.pairs[i][1] return self.pairs_buffer def get_pair_distances(self): + cdef ns_int i if self.pair_distances_buffer is None: - self.pair_distances_buffer = np.sqrt(self.pair_distances2[:self.npairs]) + self.pair_distances_buffer = np.empty(self.npairs, dtype=np.float32) + for i in range(self.npairs): + self.pair_distances_buffer[i] = self.pair_distances2[i] + self.pair_distances_buffer = np.sqrt(self.pair_distances_buffer) return self.pair_distances_buffer cdef create_buffers(self): @@ -748,8 +764,8 @@ cdef class NSResults2(object): dists_buffer = defaultdict(list) for i in range(self.npairs): - beadid_i = self.pairs[i, 0] - beadid_j = self.pairs[i, 1] + beadid_i = self.pairs[i][0] + beadid_j = self.pairs[i][1] dist2 = self.pair_distances2[i] coord_i = self.grid_coords[beadid_i] @@ -799,10 +815,10 @@ cdef class NSGrid(object): cdef ns_int[DIM] ncells cdef ns_int[DIM] cell_offsets cdef real[DIM] cellsize - cdef ns_int[:] nbeads # size - cdef ns_int[:, ::1] beadids # size * beadpercell - cdef ns_int[:] cellids # ncoords - cdef ns_int[:, ::1] cellxyz + cdef ns_int nbeads_per_cell + cdef ns_int *nbeads # size + cdef ns_int *beadids # size * nbeads_per_cell + cdef ns_int *cellids # ncoords def __init__(self, ncoords, cutoff, PBCBox box, max_size, debug=False): cdef ns_int i, x, y, z @@ -820,7 +836,6 @@ cdef class NSGrid(object): while bbox_vol/self.cutoff**3 > max_size: self.cutoff *= 1.2 - for i in range(DIM): self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) if self.ncells[i] == 0: @@ -840,21 +855,22 @@ cdef class NSGrid(object): self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] # Allocate memory - self.nbeads = np.zeros(self.size, dtype=np.int) - self.cellids = np.empty(self.ncoords, dtype=np.int) - #self.cellxyz = np.empty((self.size, DIM), dtype=np.int) - - #i = 0 - #for z in range(self.ncells[ZZ]): - # for y in range(self.ncells[YY]): - # for x in range(self.ncells[XX]): - # self.cellxyz[i, XX] = x - # self.cellxyz[i, YY] = y - # self.cellxyz[i, ZZ] = z - # i += 1 - - # Number of maximum bead per cell is not known, so wa can not allocate memory - self.beadids = None + self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) + if not self.nbeads: + raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) + self.beadids = NULL + self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) + if not self.cellids: + raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) + self.nbeads_per_cell = 0 + + for i in range(self.size): + self.nbeads[i] = 0 + + def __dealloc__(self): + PyMem_Free(self.nbeads) + PyMem_Free(self.beadids) + PyMem_Free(self.cellids) cdef ns_int coord2cellid(self, rvec coord) nogil: return (coord[ZZ] / self.cellsize[ZZ]) * (self.ncells[XX] * self.ncells[YY]) +\ @@ -876,16 +892,14 @@ cdef class NSGrid(object): return True cdef fill_grid(self, real[:, ::1] coords): - cdef ns_int i, cellindex = -1, nbeads_max = 0 + cdef ns_int i, cellindex = -1 cdef ns_int ncoords = coords.shape[0] - cdef ns_int *beadcounts = NULL # Allocate memory beadcounts = PyMem_Malloc(sizeof(ns_int) * self.size) if not beadcounts: - raise MemoryError("Could not allocate memory for bead count buffer") - + raise MemoryError("Could not allocate memory for bead count buffer ({} bits requested)".format(sizeof(ns_int) * self.size)) with nogil: # Initialize buffers @@ -899,29 +913,30 @@ cdef class NSGrid(object): self.nbeads[cellindex] += 1 self.cellids[i] = cellindex - if self.nbeads[cellindex] > nbeads_max: - nbeads_max = self.nbeads[cellindex] + if self.nbeads[cellindex] > self.nbeads_per_cell: + self.nbeads_per_cell = self.nbeads[cellindex] # Allocate memory with gil: - self.beadids = np.empty((self.size, nbeads_max), dtype=np.int) + self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) #np.empty((self.size, nbeads_max), dtype=np.int) + if not self.beadids: + raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) # Second loop: fill grid for i in range(ncoords): # Add bead to grid cell cellindex = self.cellids[i] - self.beadids[cellindex, beadcounts[cellindex]] = i + self.beadids[cellindex * self.nbeads_per_cell + beadcounts[cellindex]] = i beadcounts[cellindex] += 1 - # Now we can free the allocation buffer PyMem_Free(beadcounts) # Python interface -cdef class FastNS2(object): +cdef class FastNS(object): cdef bint debug cdef PBCBox box cdef readonly real[:, ::1] coords @@ -977,69 +992,68 @@ cdef class FastNS2(object): self.prepared = True - def search(self, search_ids, min_size_increment=10): - cdef ns_int[:] search_ids_view, neighbors_view - cdef ns_int nid, i, j, size_search - cdef NSResults2 results + def search(self, search_ids=None, bint debug=False): + cdef ns_int i, j, size_search + cdef ns_int d, m + cdef NSResults results + cdef ns_int size = self.coords_bbox.shape[0] - cdef ns_int current_beadid + cdef ns_int current_beadid, bid cdef rvec current_coords - cdef ns_int cellx, celly, cellz, cellindex_adjacent + cdef ns_int cellindex, cellindex_adjacent, cellindex_probe cdef ivec cellxyz, debug_cellxyz cdef real[:, ::1] search_coords + cdef ns_int[:] search_ids_view - #Temp stuff - cdef ns_int size = self.coords_bbox.shape[0] - cdef ns_int d, m - cdef ns_int xi, yi, zi, bid, i_bead + cdef ns_int xi, yi, zi cdef real d2 - cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords + cdef rvec shifted_coord, probe, dx - cdef bint already_checked[27] - cdef bint skip - cdef ns_int nchecked = 0, icheck - cdef ns_int cellindex - cdef ns_int cell_offset + cdef ns_int nchecked = 0 - cdef ns_int[:] neighbor_ids - cdef ns_int[:] nneighbors - cdef ns_int nid_offset - cdef real cutoff2 = self.cutoff * self.cutoff + cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int[:] checked - cdef ns_int npairs = 0 - cdef ns_int guessed_size = 0 - cdef bint first_ns = True - import sys - flush = sys.stdout.flush if not self.prepared: self.prepare() + if search_ids is None: + search_ids=np.arange(size) + elif type(search_ids) == np.int: + search_ids = np.array([search_ids,], dtype=np.int) + elif type(search_ids) != np.ndarray: + search_ids = np.array(search_ids, dtype=np.int) search_ids_view = search_ids size_search = search_ids.shape[0] checked = np.zeros(size, dtype=np.int) - results = NSResults2(self.cutoff, self.coords_bbox, search_ids, self.debug) + results = NSResults(self.cutoff, self.coords_bbox, search_ids, self.debug) + + cdef bint memory_error = False + + if self.debug and debug: + print("FastNS: Debug flag is set to True for FastNS.search()") with nogil: for i in range(size_search): + if memory_error: + break current_beadid = search_ids_view[i] cellindex = self.grid.cellids[current_beadid] self.grid.cellid2cellxyz(cellindex, cellxyz) - if self.debug: - + if self.debug and debug: with gil: - print("Checking neighbors for bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]:" .format( + print("FastNS: Checking neighbors for bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]:" .format( current_beadid, self.coords[current_beadid, XX], self.coords[current_beadid, YY], self.coords[current_beadid, ZZ], self.coords_bbox[current_beadid, XX], self.coords_bbox[current_beadid, YY], self.coords_bbox[current_beadid, ZZ], @@ -1047,56 +1061,89 @@ cdef class FastNS2(object): for xi in range(DIM): - if xi == 0: - if self.coords_bbox[current_beadid, XX] - self.cutoff > self.grid.cellsize[XX] * cellxyz[XX]: - if self.debug: - with gil: - print("\n#-> Bead X={:.3f}, Cell X={:.3f}, cutoff={:.3f} -> -X shift is ignored".format(self.coords_bbox[current_beadid, XX], self.grid.cellsize[XX] * cellxyz[XX], self.cutoff)) - continue + if memory_error: + break - if xi == 2: - if self.coords_bbox[current_beadid, XX] + self.cutoff < self.grid.cellsize[XX] * (cellxyz[XX] + 1): - if self.debug: - with gil: - print("\n#-> Bead X={:.3f}, Next cell X={:.3f}, cutoff={:.3f} -> +X shift is ignored".format(self.coords_bbox[current_beadid, XX], self.grid.cellsize[XX] * (cellxyz[XX] + 1), self.cutoff)) - continue - - for yi in range(DIM): + if not self.box.is_triclinic: + # If box is not triclinic (ie rect), when can already check if the shift can be skipped (ie cutoff inside the cell) if xi == 0: - if self.coords_bbox[current_beadid, YY] - self.cutoff > self.grid.cellsize[YY] * cellxyz[YY]: - if self.debug: + if self.coords_bbox[current_beadid, XX] - self.cutoff > self.grid.cellsize[XX] * cellxyz[XX]: + if self.debug and debug: with gil: - print("\n#-> Bead Y={:.3f}, Cell Y={:.3f}, cutoff={:.3f} -> -Y shift is ignored".format(self.coords_bbox[current_beadid, YY], self.grid.cellsize[YY] * cellxyz[YY], self.cutoff)) + print("FastNS: -> Bead X={:.3f}, Cell X={:.3f}, cutoff={:.3f} -> -X shift ignored".format( + self.coords_bbox[current_beadid, XX], + self.grid.cellsize[XX] * cellxyz[XX], + self.cutoff + )) continue if xi == 2: - if self.coords_bbox[current_beadid, YY] + self.cutoff < self.grid.cellsize[YY] * (cellxyz[YY] + 1): - if self.debug: + if self.coords_bbox[current_beadid, XX] + self.cutoff < self.grid.cellsize[XX] * (cellxyz[XX] + 1): + if self.debug and debug: with gil: - print("\n#-> Bead Y={:.3f}, Next cell Y={:.3f}, cutoff={:.3f} -> +Y shift is ignored".format(self.coords_bbox[current_beadid, YY], self.grid.cellsize[YY] * (cellxyz[YY] + 1), self.cutoff)) + print( + "FastNS: -> Bead X={:.3f}, Next cell X={:.3f}, cutoff={:.3f} -> +X shift ignored".format( + self.coords_bbox[current_beadid, XX], + self.grid.cellsize[XX] * (cellxyz[XX] + 1), + self.cutoff + )) continue + for yi in range(DIM): + if memory_error: + break - for zi in range(DIM): - if xi == 0: - if self.coords_bbox[current_beadid, ZZ] - self.cutoff > self.grid.cellsize[ZZ] * cellxyz[ZZ]: - if self.debug: + if not self.box.is_triclinic: + if yi == 0: + if self.coords_bbox[current_beadid, YY] - self.cutoff > self.grid.cellsize[YY] * cellxyz[YY]: + if self.debug and debug: with gil: - print("\n#-> Bead Z={:.3f}, Cell Z={:.3f}, cutoff={:.3f} -> -Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[ZZ] * cellxyz[ZZ], self.cutoff)) + print("FastNS: -> Bead Y={:.3f}, Cell Y={:.3f}, cutoff={:.3f} -> -Y shift is ignored".format( + self.coords_bbox[current_beadid, YY], + self.grid.cellsize[YY] * cellxyz[YY], + self.cutoff, + )) continue - if xi == 2: - if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.grid.cellsize[ZZ] * (cellxyz[ZZ] + 1): - if self.debug: + if yi == 2: + if self.coords_bbox[current_beadid, YY] + self.cutoff < self.grid.cellsize[YY] * (cellxyz[YY] + 1): + if self.debug and debug: with gil: - print("\n#-> Bead Z={:.3f}, Next cell Z={:.3f}, cutoff={:.3f} -> +Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[XX] * (cellxyz[ZZ] + 1), self.cutoff)) + print("FastNS: -> Bead Y={:.3f}, Next cell Y={:.3f}, cutoff={:.3f} -> +Y shift is ignored".format( + self.coords_bbox[current_beadid, YY], + self.grid.cellsize[YY] * (cellxyz[YY] +1), + self.cutoff, + )) continue + + for zi in range(DIM): + if not self.box.is_triclinic: + if zi == 0: + if self.coords_bbox[current_beadid, ZZ] - self.cutoff > self.grid.cellsize[ZZ] * cellxyz[ZZ]: + if self.coords_bbox[current_beadid, ZZ] - self.cutoff > 0: + if self.debug and debug: + with gil: + print("FastNS: -> Bead Z={:.3f}, Cell Z={:.3f}, cutoff={:.3f} -> -Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[ZZ] * cellxyz[ZZ], self.cutoff)) + continue + + if zi == 2: + if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.grid.cellsize[ZZ] * (cellxyz[ZZ] + 1): + if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.box.c_pbcbox.box[ZZ][ZZ]: + if self.debug and debug: + with gil: + print("FastNS: -> Bead Z={:.3f}, Next cell Z={:.3f}, cutoff={:.3f} -> +Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[XX] * (cellxyz[ZZ] + 1), self.cutoff)) + continue + # Calculate and/or reinitialize shifted coordinates shifted_coord[XX] = self.coords[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] shifted_coord[YY] = self.coords[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] shifted_coord[ZZ] = self.coords[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] + probe[XX] = self.coords[current_beadid, XX] + (xi - 1) * self.cutoff + probe[YY] = self.coords[current_beadid, YY] + (yi - 1) * self.cutoff + probe[ZZ] = self.coords[current_beadid, ZZ] + (zi - 1) * self.cutoff + # Make sure the shifted coordinates is inside the brick-shaped box for m in range(DIM - 1, -1, -1): @@ -1109,105 +1156,116 @@ cdef class FastNS2(object): for d in range(m+1): shifted_coord[d] -= self.box.c_pbcbox.box[m][d] + while probe[m] < 0: + for d in range(m+1): + probe[d] += self.box.c_pbcbox.box[m][d] + + + while probe[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + probe[d] -= self.box.c_pbcbox.box[m][d] + # Get the cell index corresponding to the coord - cellindex = self.grid.coord2cellid(shifted_coord) + cellindex_adjacent = self.grid.coord2cellid(shifted_coord) + cellindex_probe = self.grid.coord2cellid(probe) + + if cellindex == cellindex_probe and xi != 1 and yi != 1 and zi != 1: + if self.debug and debug: + with gil: + print("FastNS: Grid shift [{}][{}][{}]: Cutoff is inside current cell -> This shift is ignored".format( + xi - 1, + yi -1, + zi -1 + )) + continue - if self.debug: - self.grid.cellid2cellxyz(cellindex, debug_cellxyz) + if self.debug and debug: + self.grid.cellid2cellxyz(cellindex_adjacent, debug_cellxyz) with gil: dist_shift = self.box.fast_distance(&self.coords[current_beadid, XX], shifted_coord) grid_shift = np.array([(xi - 1) * self.grid.cellsize[XX], (yi - 1) * self.grid.cellsize[YY], (zi - 1) * self.grid.cellsize[ZZ]]) - print("-> Checking cell#{} ({},{},{}) for neighbors (dshift={:.3f}, grid_shift=({:.3f},{:.3f},{:.3f}->{:.3f})".format( + print("FastNS: -> Checking cell#{} ({},{},{}) for neighbors (dshift={:.3f}, grid_shift=({:.3f},{:.3f},{:.3f}->{:.3f})".format( cellindex, debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], dist_shift, grid_shift[XX], grid_shift[YY], grid_shift[ZZ], np.sqrt(np.sum(grid_shift**2)) )) - if dist_shift > 2* self.cutoff: - print(" \_ This cell should be ignored!") - else: - print(" \_ This cell is needed") - for j in range(self.grid.nbeads[cellindex]): - bid = self.grid.beadids[cellindex, j] + + for j in range(self.grid.nbeads[cellindex_adjacent]): + bid = self.grid.beadids[cellindex_adjacent * self.grid.nbeads_per_cell + j] if checked[bid] != 0: continue d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) - if self.debug and False: - self.grid.cellid2cellxyz(cellindex, debug_cellxyz) - with gil: - print( - "Beads #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) and #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) are tested (d2={:.3f})".format( - current_beadid, - cellxyz[XX], cellxyz[YY], cellxyz[ZZ], - self.coords_bbox[current_beadid, XX], - self.coords_bbox[current_beadid, YY], - self.coords_bbox[current_beadid, ZZ], - bid, - debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], - self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], - self.coords_bbox[bid, ZZ], - d2)) + # if self.debug: + # self.grid.cellid2cellxyz(cellindex, debug_cellxyz) + # with gil: + # print( + # "Beads #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) and #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) are tested (d2={:.3f})".format( + # current_beadid, + # cellxyz[XX], cellxyz[YY], cellxyz[ZZ], + # self.coords_bbox[current_beadid, XX], + # self.coords_bbox[current_beadid, YY], + # self.coords_bbox[current_beadid, ZZ], + # bid, + # debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], + # self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], + # self.coords_bbox[bid, ZZ], + # d2)) if d2 < cutoff2: if d2 < EPSILON: continue - if self.debug: + if self.debug and debug: self.grid.cellid2cellxyz(cellindex, debug_cellxyz) with gil: self.box.fast_pbc_dx(&self.coords[current_beadid, XX], &self.coords[bid, XX], dx) dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) - - print(" \_ Neighbor found: bead#{} (cell[{},{},{}]) -> dx={} -> d={:.3f}".format(bid, debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], dx_py, np.sqrt(d2))) - results.add_neighbors(current_beadid, bid, d2) + print("FastNS: \_ Neighbor found: bead#{} (cell[{},{},{}]) -> dx={} -> d={:.3f}".format(bid, debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], dx_py, np.sqrt(d2))) + if results.add_neighbors(current_beadid, bid, d2) == 0: + memory_error = True + break npairs += 1 + checked[current_beadid] = 1 - if first_ns: - guessed_size = ((npairs + 1) * 0.75 * size_search) - with gil: - if self.debug: - print("Neighbors of first beads= {} -> Approximated total of pairs={}".format(npairs, guessed_size)) - results.resize(guessed_size) + if memory_error: + raise MemoryError("Could not allocate memory to store NS results") - first_ns = False - checked[current_beadid] = 1 if self.debug: print("Total number of pairs={}".format(npairs)) - ref_bead = 13937 - beads = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 - for bid in beads: - self.box.fast_pbc_dx(&self.coords[ref_bead, XX], &self.coords[bid, XX], dx) - dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) - self.box.fast_pbc_dx(&self.coords_bbox[ref_bead, XX], &self.coords_bbox[bid, XX], dx) - rect_dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) - self.grid.cellid2cellxyz(self.grid.coord2cellid(&self.coords_bbox[bid, XX]), cellxyz) - print("Bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]: dx=[{:.3f},{:.3f},{:.3f}] -> dist: {:.3f} ({}) - rect_dist: {:.3f} ({})".format( - bid, - self.coords[bid, XX], self.coords[bid, YY], self.coords[bid,ZZ], - self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], self.coords_bbox[bid,ZZ], - cellxyz[XX], cellxyz[YY], cellxyz[ZZ], - dx[XX], dx[YY], dx[ZZ], - np.sqrt(np.sum(dx_py**2)), - self.box.fast_distance(&self.coords[ref_bead, XX], &self.coords[bid, XX]) <= self.cutoff, - np.sqrt(np.sum(rect_dx_py**2)), - np.sqrt(np.sum(rect_dx_py**2)) <= self.cutoff - )) + # ref_bead = 13937 + # beads = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 + # for bid in beads: + # self.box.fast_pbc_dx(&self.coords[ref_bead, XX], &self.coords[bid, XX], dx) + # dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) + # self.box.fast_pbc_dx(&self.coords_bbox[ref_bead, XX], &self.coords_bbox[bid, XX], dx) + # rect_dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) + # self.grid.cellid2cellxyz(self.grid.coord2cellid(&self.coords_bbox[bid, XX]), cellxyz) + # print("Bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]: dx=[{:.3f},{:.3f},{:.3f}] -> dist: {:.3f} ({})".format( + # bid, + # self.coords[bid, XX], self.coords[bid, YY], self.coords[bid,ZZ], + # self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], self.coords_bbox[bid,ZZ], + # cellxyz[XX], cellxyz[YY], cellxyz[ZZ], + # dx[XX], dx[YY], dx[ZZ], + # np.sqrt(np.sum(dx_py**2)), + # self.box.fast_distance(&self.coords[ref_bead, XX], &self.coords[bid, XX]) <= self.cutoff, + # )) return results # Python interface -cdef class FastNS(object): +cdef class FastNSOld(object): cdef PBCBox box cdef readonly real[:, ::1] coords cdef real[:, ::1] coords_bbox @@ -1376,108 +1434,10 @@ cdef class FastNS(object): if holder == NULL: raise MemoryError("Could not allocate memory to run NS core") - results = NSResults(self.box, self.cutoff) + results = NSResultsOld(self.box, self.cutoff) results.populate(holder, self.coords, search_coords_view) # Free memory allocated to holder free_neighborhood_holder(holder) return results - - def search2(self, search_ids): - cdef ns_int[:] search_ids_view, neighbors_view - cdef ns_int nid, i, j, size_search - cdef ns_neighborhood_holder *holder - cdef ns_neighborhood *neighborhood - - cdef ns_int current_beadid - cdef rvec current_coords - - #Temp stuff - cdef ns_int size = self.coords_bbox.shape[0] - cdef ns_int d, m - cdef ns_int xi, yi, zi, bid, i_bead - cdef real d2 - cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords - - cdef bint already_checked[27] - cdef bint skip - cdef ns_int nchecked = 0, icheck - cdef ns_int cell_index - cdef ns_int cell_offset - - cdef ns_int[:] neighbor_ids - cdef ns_int[:] nneighbors - cdef ns_int nid_offset - - cdef real cutoff2 = self.cutoff * self.cutoff - - - if not self.prepared: - self.prepare() - - nid_offset = self.grid.beadpercell * 27 - neighbor_ids = np.empty(size * nid_offset, dtype=np.int) - nneighbors = np.zeros(size, dtype=np.int) - - - search_ids_view = search_ids - size_search = search_ids_view.shape[0] - - with nogil: - - for current_beadid in range(size): - - for zi in range(3): - for yi in range(3): - for xi in range(3): - # Calculate and/or reinitialize shifted coordinates - shifted_coord[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] - shifted_coord[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] - shifted_coord[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] - - # Make sure the shifted coordinates is inside the brick-shaped box - for m in range(DIM - 1, -1, -1): - - while shifted_coord[m] < 0: - for d in range(m+1): - shifted_coord[d] += self.box.c_pbcbox.box[m][d] - - - while shifted_coord[m] >= self.box.c_pbcbox.box[m][m]: - for d in range(m+1): - shifted_coord[d] -= self.box.c_pbcbox.box[m][d] - - # Get the cell index corresponding to the coord - cell_index = (shifted_coord[ZZ] / self.grid.cellsize[ZZ]) * (self.grid.ncells[XX] * self.grid.ncells[YY]) +\ - (shifted_coord[YY] / self.grid.cellsize[YY]) * self.grid.ncells[XX] + \ - (shifted_coord[XX] / self.grid.cellsize[XX]) - - # Search for neighbors inside this cell - for i_bead in range(self.grid.nbeads[cell_index]): - cell_offset = cell_index * self.grid.beadpercell + i_bead - - bid = self.grid.beadids[cell_offset] - - if bid <= current_beadid: - continue - - self.box.fast_pbc_dx(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX], dx) - - d2 = rvec_norm2(dx) - - if d2 < cutoff2: - neighbor_ids[current_beadid * nid_offset + nneighbors[current_beadid]] = bid - nneighbors[current_beadid] += 1 - - neighbor_ids[bid * nid_offset + nneighbors[bid]] = current_beadid - nneighbors[bid] += 1 - - - - - results = [] - #for bid in search_ids: - # results.append(np.asarray(neighbor_ids[bid * nid_offset : bid * nid_offset + nneighbors[bid]])) - - return results diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_gridsearch.py index 30ab8813036..a64143d446e 100644 --- a/testsuite/MDAnalysisTests/lib/test_gridsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_gridsearch.py @@ -28,7 +28,7 @@ import numpy as np import MDAnalysis as mda -from MDAnalysis.lib import grid +from MDAnalysis.lib import nsgrid from MDAnalysis.lib.pkdtree import PeriodicKDTree @@ -42,105 +42,86 @@ def universe(): -@pytest.fixture -def grid_results(): - u = mda.Universe(GRO) - cutoff = 2 - ref_pos = u.atoms.positions[13937] - return run_grid_search(u, ref_pos, cutoff) - - -def run_grid_search(u, ref_pos, cutoff): +def run_grid_search(u, ids, cutoff=3): coords = u.atoms.positions # Run grid search - searcher = grid.FastNS(u) - searcher.set_cutoff(cutoff) - searcher.set_coords(coords) - searcher.prepare() - - return searcher.search(ref_pos) - - - -def run_search(universe, ref_id): - cutoff = 3 - coords = universe.atoms.positions - ref_pos = coords[ref_id] - - - # Run pkdtree search - pkdt = PeriodicKDTree(universe.atoms.dimensions, bucket_size=10) - pkdt.set_coords(coords) - pkdt.search(ref_pos, cutoff) - - results_pkdtree = pkdt.get_indices() - results_pkdtree.remove(ref_id) - results_pkdtree = np.array(results_pkdtree) - results_pkdtree.sort() - - # Run grid search - results_grid = run_grid_search(universe, ref_pos, cutoff) - results_grid = results_grid.get_indices()[0] - results_grid.sort() - - return results_pkdtree, results_grid + searcher = grid.FastNS(u, cutoff, coords, debug=True) + return searcher.search(ids, debug=False) def test_gridsearch(universe): """Check that pkdtree and grid search return the same results (No PBC needed)""" ref_id = 0 - results_pkdtree, results_grid = run_search(universe, ref_id) - assert_equal(results_pkdtree, results_grid) - - -def test_gridsearch_PBC(universe): - """Check that pkdtree and grid search return the same results (PBC needed)""" - - ref_id = 13937 - results_pkdtree, results_grid = run_search(universe, ref_id) - - assert_equal(results_pkdtree, results_grid) + cutoff = 3 + results = np.array([2, 3, 4, 5, 6, 7, 8, 9, 18, 19, 1211, 10862, 10865, 17582, 17585, 38342, + 38345]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! -def test_gridsearch_arraycoord(universe): - """Check the NS routine accepts a single bead coordinate as well as array of coordinates""" - cutoff = 2 - ref_pos = universe.atoms.positions[:5] - - results = [ - np.array([2, 1, 4, 3]), - np.array([2, 0, 3]), - np.array([0, 1, 3]), - np.array([ 2, 0, 1, 38341]), - np.array([ 6, 0, 5, 17]) - ] - - results_grid = run_grid_search(universe, ref_pos, cutoff).get_indices() + results_grid = run_grid_search(universe, ref_id, cutoff).get_indices()[0] - assert_equal(results_grid, results) + assert_equal(results, results_grid) -def test_gridsearch_search_coordinates(grid_results): - """Check the NS routine can return coordinates instead of ids""" +def test_gridsearch_PBC(universe): + """Check that pkdtree and grid search return the same results (No PBC needed)""" - results = np.array( - [ - [40.32, 34.25, 55.9], - [0.61, 76.33, -0.56], - [0.48999998, 75.9, 0.19999999], - [-0.11, 76.19, 0.77] - ]) + ref_id = 13937 + results = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, + 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - assert_allclose(grid_results.get_coordinates()[0], results) + results_grid = run_grid_search(universe, ref_id).get_indices()[0] + assert_equal(results, results_grid) -def test_gridsearch_search_distances(grid_results): - """Check the NS routine can return PBC distances from neighbors""" - results = np.array([0.096, 0.096, 0.015, 0.179]) * 10 # These distances were obtained using gmx distance - results.sort() - rounded_results = np.round(grid_results.get_distances()[0], 2) - assert_allclose(sorted(rounded_results), results) +# def test_gridsearch_PBC(universe): +# """Check that pkdtree and grid search return the same results (PBC needed)""" +# +# ref_id = 13937 +# results_pkdtree, results_grid = run_search(universe, ref_id) +# assert_equal(results_pkdtree, results_grid) +# +# +# def test_gridsearch_arraycoord(universe): +# """Check the NS routine accepts a single bead coordinate as well as array of coordinates""" +# cutoff = 2 +# ref_pos = universe.atoms.positions[:5] +# +# results = [ +# np.array([2, 1, 4, 3]), +# np.array([2, 0, 3]), +# np.array([0, 1, 3]), +# np.array([ 2, 0, 1, 38341]), +# np.array([ 6, 0, 5, 17]) +# ] +# +# results_grid = run_grid_search(universe, ref_pos, cutoff).get_indices() +# +# assert_equal(results_grid, results) +# +# +# def test_gridsearch_search_coordinates(grid_results): +# """Check the NS routine can return coordinates instead of ids""" +# +# results = np.array( +# [ +# [40.32, 34.25, 55.9], +# [0.61, 76.33, -0.56], +# [0.48999998, 75.9, 0.19999999], +# [-0.11, 76.19, 0.77] +# ]) +# +# assert_allclose(grid_results.get_coordinates()[0], results) +# +# +# def test_gridsearch_search_distances(grid_results): +# """Check the NS routine can return PBC distances from neighbors""" +# results = np.array([0.096, 0.096, 0.015, 0.179]) * 10 # These distances were obtained using gmx distance +# results.sort() +# +# rounded_results = np.round(grid_results.get_distances()[0], 2) +# +# assert_allclose(sorted(rounded_results), results) From 1a0e1507ea32bbede89e71f6ea2e5b6cbad201b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Wed, 18 Jul 2018 10:10:29 +0200 Subject: [PATCH 345/455] Module MDAnalysis/lib/c_gridsearch.pyx renamed to nsgrid.pyx --- .../MDAnalysis/lib/{c_gridsearch.pyx => nsgrid.pyx} | 7 +++---- .../lib/{test_gridsearch.py => test_nsgrid.py} | 11 +++++------ 2 files changed, 8 insertions(+), 10 deletions(-) rename package/MDAnalysis/lib/{c_gridsearch.pyx => nsgrid.pyx} (97%) rename testsuite/MDAnalysisTests/lib/{test_gridsearch.py => test_nsgrid.py} (96%) diff --git a/package/MDAnalysis/lib/c_gridsearch.pyx b/package/MDAnalysis/lib/nsgrid.pyx similarity index 97% rename from package/MDAnalysis/lib/c_gridsearch.pyx rename to package/MDAnalysis/lib/nsgrid.pyx index a1f519eac37..134356bd572 100644 --- a/package/MDAnalysis/lib/c_gridsearch.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -23,9 +23,9 @@ # # -#cython: cdivision=True -#cython: boundscheck=False -#cython: initializedcheck=False +# cython: cdivision=True +# cython: boundscheck=False +# cython: initializedcheck=False """ Neighbor search library --- :mod:`MDAnalysis.lib.grid` @@ -93,7 +93,6 @@ cdef void rvec_clear(rvec a) nogil: a[YY]=0.0 a[ZZ]=0.0 - cdef struct cPBCBox_t: matrix box rvec fbox_diag diff --git a/testsuite/MDAnalysisTests/lib/test_gridsearch.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py similarity index 96% rename from testsuite/MDAnalysisTests/lib/test_gridsearch.py rename to testsuite/MDAnalysisTests/lib/test_nsgrid.py index a64143d446e..d7be4f79e65 100644 --- a/testsuite/MDAnalysisTests/lib/test_gridsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -24,15 +24,12 @@ import pytest -from numpy.testing import assert_equal, assert_allclose +from numpy.testing import assert_equal import numpy as np import MDAnalysis as mda -from MDAnalysis.lib import nsgrid -from MDAnalysis.lib.pkdtree import PeriodicKDTree - - from MDAnalysisTests.datafiles import GRO +from MDAnalysis.lib import nsgrid @pytest.fixture @@ -46,7 +43,9 @@ def run_grid_search(u, ids, cutoff=3): coords = u.atoms.positions # Run grid search - searcher = grid.FastNS(u, cutoff, coords, debug=True) + searcher = nsgrid.FastNS(u, cutoff, coords, debug=True) + + return searcher.search(ids, debug=False) From a1e03dd8bdc969e3d5dc21379fa6cee476f929e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Wed, 18 Jul 2018 16:44:11 +0200 Subject: [PATCH 346/455] Tests written for FastNS --- package/MDAnalysis/lib/__init__.py | 2 +- package/MDAnalysis/lib/nsgrid.pyx | 769 ++++--------------- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 245 ++++-- 3 files changed, 326 insertions(+), 690 deletions(-) diff --git a/package/MDAnalysis/lib/__init__.py b/package/MDAnalysis/lib/__init__.py index a740bd8d5bf..d5a583f9aea 100644 --- a/package/MDAnalysis/lib/__init__.py +++ b/package/MDAnalysis/lib/__init__.py @@ -39,4 +39,4 @@ from . import NeighborSearch from . import formats from . import pkdtree -from . import grid \ No newline at end of file +from . import nsgrid \ No newline at end of file diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 134356bd572..e4de849ffff 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -43,19 +43,14 @@ DEF ZZ = 2 DEF EPSILON = 1e-5 -DEF NEIGHBORHOOD_ALLOCATION_INCREMENT = 50 - DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 -from libc.stdlib cimport malloc, realloc, free +# Used to handle memory allocation from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free - from libc.math cimport sqrt - import numpy as np cimport numpy as np -cimport cython ctypedef np.int_t ns_int ctypedef np.float32_t real @@ -64,27 +59,8 @@ ctypedef ns_int ivec[DIM] ctypedef ns_int ipair[2] ctypedef real matrix[DIM][DIM] -cdef struct ns_grid: - ns_int beadpercell - ns_int size - ns_int[DIM] ncells - real[DIM] cellsize - ns_int *nbeads # size - ns_int *beadids # size * beadpercell - ns_int *cellids # size - -cdef struct ns_neighborhood: - real cutoff - ns_int allocated_size - ns_int size - ns_int *beadids - -cdef struct ns_neighborhood_holder: - ns_int size - ns_neighborhood **neighborhoods - -# Useful stuff +# Useful Functions cdef real rvec_norm2(const rvec a) nogil: return a[XX]*a[XX]+a[YY]*a[YY]+a[ZZ]*a[ZZ] @@ -93,6 +69,11 @@ cdef void rvec_clear(rvec a) nogil: a[YY]=0.0 a[ZZ]=0.0 +######################################################################################################################## +# +# Utility class to handle PBC +# +######################################################################################################################## cdef struct cPBCBox_t: matrix box rvec fbox_diag @@ -186,15 +167,10 @@ cdef class PBCBox(object): # Choose the vector within the brick around 0,0,0 that # will become the shortest due to shift try. - - if d == DIM: - trial[d] = 0 - pos[d] = 0 + if trial[d] < 0: + pos[d] = min(self.c_pbcbox.hbox_diag[d], -trial[d]) else: - if trial[d] < 0: - pos[d] = min(self.c_pbcbox.hbox_diag[d], -trial[d]) - else: - pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) + pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) d2old += pos[d]**2 d2new += (pos[d] + trial[d])**2 @@ -270,14 +246,34 @@ cdef class PBCBox(object): for j in range (i, -1, -1): dx[j] += self.c_pbcbox.box[i][j] + def dx(self, real[:] a, real[:] b): + cdef rvec dx + if a.shape[0] != DIM or b.shape[0] != DIM: + raise ValueError("Not 3 D coordinates") + + self.fast_pbc_dx(&a[XX], &b[XX], dx) + + return np.array([dx[XX], dx[YY], dx[ZZ]], dtype=np.float32) + + cdef real fast_distance2(self, rvec a, rvec b) nogil: cdef rvec dx self.fast_pbc_dx(a, b, dx) return rvec_norm2(dx) + def distance2(self, real[:] a, real[:] b): + if a.shape[0] != DIM or b.shape[0] != DIM: + raise ValueError("Not 3 D coordinates") + return self.fast_distance2(&a[XX], &b[XX]) + cdef real fast_distance(self, rvec a, rvec b) nogil: return sqrt(self.fast_distance2(a,b)) + def distance(self, real[:] a, real[:] b): + if a.shape[0] != DIM or b.shape[0] != DIM: + raise ValueError("Not 3 D coordinates") + return self.fast_distance(&a[XX], &b[XX]) + cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: cdef ns_int i, m, d, natoms, wd = 0 cdef real[:,::1] bbox_coords @@ -305,341 +301,20 @@ cdef class PBCBox(object): return bbox_coords def put_atoms_in_bbox(self, real[:,::1] coords): - if coords.shape[0] == 0: - return np.zeros((0, DIM), dtype=np.float32) return np.asarray(self.fast_put_atoms_in_bbox(coords)) + ######################################################################################################################## # # Neighbor Search Stuff # ######################################################################################################################## - -cdef ns_neighborhood_holder *create_neighborhood_holder() nogil: - cdef ns_neighborhood_holder *holder - - holder = malloc(sizeof(ns_neighborhood_holder)) - holder.size = 0 - holder.neighborhoods = NULL - - return holder - -cdef void free_neighborhood_holder(ns_neighborhood_holder *holder) nogil: - cdef ns_int i - - if holder == NULL: - return - - for i in range(holder.size): - if holder.neighborhoods[i].beadids != NULL: - free(holder.neighborhoods[i].beadids) - free(holder.neighborhoods[i]) - - if holder.neighborhoods != NULL: - free(holder.neighborhoods) - free(holder) - -cdef ns_neighborhood *retrieve_neighborhood(rvec current_coords, real[:, ::1]neighborcoords, ns_grid *grid, PBCBox box, real cutoff2) nogil: - cdef ns_int d, m - cdef ns_int xi, yi, zi, bid, i_bead - cdef real d2 - cdef rvec shifted_coord, dx, neighbor_coord, corrected_coords - - cdef bint already_checked[27] - cdef bint skip - cdef ns_int nchecked = 0, icheck - cdef ns_int cell_index - cdef ns_int cell_offset - - cdef ns_neighborhood *neighborhood = malloc(sizeof(ns_neighborhood)) - if neighborhood == NULL: - return NULL - - neighborhood.size = 0 - neighborhood.allocated_size = NEIGHBORHOOD_ALLOCATION_INCREMENT - neighborhood.beadids = malloc(NEIGHBORHOOD_ALLOCATION_INCREMENT * sizeof(ns_int)) - - if neighborhood.beadids == NULL: - free(neighborhood) - return NULL - - for zi in range(3): - for yi in range(3): - for xi in range(3): - # Calculate and/or reinitialize shifted coordinates - shifted_coord[XX] = current_coords[XX] + (xi - 1) * grid.cellsize[XX] - shifted_coord[YY] = current_coords[YY] + (yi - 1) * grid.cellsize[YY] - shifted_coord[ZZ] = current_coords[ZZ] + (zi - 1) * grid.cellsize[ZZ] - - # Make sure the shifted coordinates is inside the brick-shaped box - for m in range(DIM - 1, -1, -1): - - while shifted_coord[m] < 0: - for d in range(m+1): - shifted_coord[d] += box.c_pbcbox.box[m][d] - - - while shifted_coord[m] >= box.c_pbcbox.box[m][m]: - for d in range(m+1): - shifted_coord[d] -= box.c_pbcbox.box[m][d] - - # Get the cell index corresponding to the coord - cell_index = (shifted_coord[ZZ] / grid.cellsize[ZZ]) * (grid.ncells[XX] * grid.ncells[YY]) +\ - (shifted_coord[YY] / grid.cellsize[YY]) * grid.ncells[XX] + \ - (shifted_coord[XX] / grid.cellsize[XX]) - - # Just a safeguard - #if cell_index >= grid.size: - # continue - - # Check the cell index was not already selected - #skip = False - #for icheck in range(nchecked): - # if already_checked[icheck] == cell_index: - # skip = True - # break - #if skip: - # continue - - # Search for neighbors inside this cell - for i_bead in range(grid.nbeads[cell_index]): - cell_offset = cell_index * grid.beadpercell + i_bead - - bid = grid.beadids[cell_offset] - - box.fast_pbc_dx(current_coords, &neighborcoords[bid, XX], dx) - - d2 = rvec_norm2(dx) - - if d2 < cutoff2: - if d2 < EPSILON: # Don't add the current bead as its own neighbor! - continue - - # Update neighbor lists - neighborhood.beadids[neighborhood.size] = bid - neighborhood.size += 1 - - if neighborhood.size >= neighborhood.allocated_size: - neighborhood.allocated_size += NEIGHBORHOOD_ALLOCATION_INCREMENT - neighborhood.beadids = realloc( neighborhood.beadids, neighborhood.allocated_size * sizeof(ns_int)) - - if neighborhood.beadids == NULL: - free(neighborhood) - return NULL - - # Register the cell as checked - #already_checked[nchecked] = cell_index - #nchecked += 1 - - return neighborhood - - -cdef ns_neighborhood_holder *ns_core(real[:, ::1] refcoords, - real[:, ::1] neighborcoords, - ns_grid *grid, - PBCBox box, - real cutoff) nogil: - cdef ns_int coordid, i, j - cdef ns_int ncoords = refcoords.shape[0] - cdef ns_int ncoords_neighbors = neighborcoords.shape[0] - cdef real cutoff2 = cutoff * cutoff - cdef ns_neighborhood_holder *holder - - cdef ns_int *neighbor_buf - cdef ns_int buf_size, ibuf - - holder = create_neighborhood_holder() - if holder == NULL: - return NULL - - holder.neighborhoods = malloc(sizeof(ns_neighborhood *) * ncoords) - if holder.neighborhoods == NULL: - free_neighborhood_holder(holder) - return NULL - - # Here starts the real core and the iteration over coordinates - for coordid in range(ncoords): - holder.neighborhoods[coordid] = retrieve_neighborhood(&refcoords[coordid, XX], - neighborcoords, - grid, - box, - cutoff2) - if holder.neighborhoods[coordid] == NULL: - free_neighborhood_holder(holder) - return NULL - - holder.neighborhoods[coordid].cutoff = cutoff - holder.size += 1 - - return holder - -cdef class NSResultsOld(object): - """ - Class used to store results returned by `MDAnalysis.lib.grid.FastNS.search` - """ - cdef PBCBox box - cdef readonly real cutoff - cdef np.ndarray grid_coords - cdef np.ndarray ref_coords - cdef ns_int **nids - cdef ns_int *nsizes - cdef ns_int size - cdef list indices - cdef list coordinates - cdef list distances - - def __dealloc__(self): - if self.nids != NULL: - for i in range(self.size): - if self.nids[i] != NULL: - free(self.nids[i]) - free(self.nids) - - if self.nsizes != NULL: - free(self.nsizes) - - def __init__(self, PBCBox box, real cutoff): - self.box = box - self.cutoff = cutoff - - self.size = 0 - self.nids = NULL - self.nsizes = NULL - - self.grid_coords = None - self.ref_coords = None - - self.indices = None - self.coordinates = None - self.distances = None - - - cdef populate(self, ns_neighborhood_holder *holder, grid_coords, ref_coords): - cdef ns_int nid, i - cdef ns_neighborhood *neighborhood - - self.grid_coords = np.asarray(grid_coords) - self.ref_coords = np.asarray(ref_coords) - - # Allocate memory - self.nsizes = malloc(sizeof(ns_int) * holder.size) - if self.nsizes == NULL: - raise MemoryError("Could not allocate memory for NSResults") - - self.nids = malloc(sizeof(ns_int *) * holder.size) - if self.nids == NULL: - raise MemoryError("Could not allocate memory for NSResults") - - for nid in range(holder.size): - neighborhood = holder.neighborhoods[nid] - - self.nsizes[nid] = neighborhood.size - - self.nids[nid] = malloc(sizeof(ns_int *) * neighborhood.size) - if self.nids[nid] == NULL: - raise MemoryError("Could not allocate memory for NSResults") - - with nogil: - for nid in range(holder.size): - neighborhood = holder.neighborhoods[nid] - - for i in range(neighborhood.size): - self.nids[nid][i] = neighborhood.beadids[i] - - self.size = holder.size - - def get_indices(self): - """ - Return Neighbors indices. - - :return: list of indices - """ - cdef ns_int i, nid, size - - if self.indices is None: - indices = [] - - for nid in range(self.size): - size = self.nsizes[nid] - - tmp_incides = np.empty((size), dtype=np.int) - - for i in range(size): - tmp_incides[i] = self.nids[nid][i] - - indices.append(tmp_incides) - - self.indices = indices - - return self.indices - - - def get_coordinates(self): - """ - Return coordinates of neighbors. - - :return: list of coordinates - """ - cdef ns_int i, nid, size, beadid - - if self.coordinates is None: - coordinates = [] - - for nid in range(self.size): - size = self.nsizes[nid] - - tmp_values = np.empty((size, DIM), dtype=np.float32) - - for i in range(size): - beadid = self.nids[nid][i] - tmp_values[i] = self.grid_coords[beadid] - - coordinates.append(tmp_values) - - self.coordinates = coordinates - - return self.coordinates - - - def get_distances(self): - """ - Return coordinates of neighbors. - - :return: list of distances - """ - cdef ns_int i, nid, size, j, beadid - cdef rvec ref, other, dx - cdef real dist - cdef real[:, ::1] ref_coords = self.ref_coords - cdef real[:, ::1] grid_coords = self.grid_coords - - if self.distances is None: - distances = [] - - for nid in range(self.size): - size = self.nsizes[nid] - - tmp_values = np.empty((size), dtype=np.float32) - ref = &ref_coords[nid, 0] - - for i in range(size): - beadid = self.nids[nid][i] - other = &grid_coords[beadid, 0] - - tmp_values[i] = self.box.fast_distance(ref, other) - - distances.append(tmp_values) - - self.distances = distances - - return self.distances - cdef class NSResults(object): cdef readonly real cutoff cdef ns_int npairs cdef bint debug - cdef real[:, ::1] grid_coords # shape: size, DIM + cdef real[:, ::1] coords # shape: size, DIM cdef ns_int[:] search_ids cdef ns_int allocation_size @@ -651,12 +326,13 @@ cdef class NSResults(object): cdef list distances_buffer cdef np.ndarray pairs_buffer cdef np.ndarray pair_distances_buffer + cdef np.ndarray pair_coordinates_buffer - def __init__(self, real cutoff, real[:, ::1]grid_coords,ns_int[:] search_ids, debug=False): + def __init__(self, real cutoff, real[:, ::1]coords, ns_int[:] search_ids, debug=False): self.debug = debug self.cutoff = cutoff - self.grid_coords = grid_coords + self.coords = coords self.search_ids = search_ids # Preallocate memory @@ -674,7 +350,7 @@ cdef class NSResults(object): self.coordinates_buffer = None self.distances_buffer = None self.pairs_buffer = None - self.pair_distances_buffer = None + self.pair_coordinates_buffer = None def __dealloc__(self): PyMem_Free(self.pairs) @@ -745,12 +421,25 @@ cdef class NSResults(object): def get_pair_distances(self): cdef ns_int i - if self.pair_distances_buffer is None: - self.pair_distances_buffer = np.empty(self.npairs, dtype=np.float32) + if self.pair_coordinates_buffer is None: + self.pair_coordinates_buffer = np.empty(self.npairs, dtype=np.float32) + for i in range(self.npairs): + self.pair_coordinates_buffer[i] = self.pair_distances2[i] + self.pair_coordinates_buffer = np.sqrt(self.pair_coordinates_buffer) + return self.pair_coordinates_buffer + + def get_pair_coordinates(self): + cdef ns_int i, j, bead_i, bead_j + if self.pair_coordinates_buffer is None: + self.pair_coordinates_buffer = np.empty((self.npairs, 2, DIM), dtype=np.float32) for i in range(self.npairs): - self.pair_distances_buffer[i] = self.pair_distances2[i] - self.pair_distances_buffer = np.sqrt(self.pair_distances_buffer) - return self.pair_distances_buffer + bead_i = self.pairs[i][0] + bead_j = self.pairs[i][1] + + for j in range(DIM): + self.pair_coordinates_buffer[i, 0, j] = self.coords[bead_i, j] + self.pair_coordinates_buffer[i, 1, j] = self.coords[bead_j, j] + return self.pair_coordinates_buffer cdef create_buffers(self): cdef ns_int i, beadid_i, beadid_j @@ -767,8 +456,8 @@ cdef class NSResults(object): beadid_j = self.pairs[i][1] dist2 = self.pair_distances2[i] - coord_i = self.grid_coords[beadid_i] - coord_j = self.grid_coords[beadid_j] + coord_i = self.coords[beadid_i] + coord_j = self.coords[beadid_j] indices_buffer[beadid_i].append(beadid_j) indices_buffer[beadid_j].append(beadid_i) @@ -933,12 +622,10 @@ cdef class NSGrid(object): PyMem_Free(beadcounts) - -# Python interface cdef class FastNS(object): cdef bint debug cdef PBCBox box - cdef readonly real[:, ::1] coords + cdef real[:, ::1] coords cdef real[:, ::1] coords_bbox cdef readonly real cutoff cdef bint prepared @@ -954,9 +641,6 @@ cdef class FastNS(object): raise TypeError("FastNS class must be initialized with a valid MDAnalysis.Universe instance") box = triclinic_vectors(u.dimensions) - if box.shape != (3, 3): - raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") - self.box = PBCBox(box) @@ -967,18 +651,14 @@ cdef class FastNS(object): self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) - if not prepare: - return - - if self.cutoff < 0: + if cutoff < 0: raise ValueError("Cutoff must be positive!") - if self.cutoff * self.cutoff > self.box.c_pbcbox.max_cutoff2: + if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") self.cutoff = cutoff self.grid = NSGrid(self.coords_bbox.shape[0], cutoff, self.box, max_gridsize, debug=debug) self.prepared = False - if prepare: self.prepare() @@ -991,7 +671,7 @@ cdef class FastNS(object): self.prepared = True - def search(self, search_ids=None, bint debug=False): + def search(self, search_ids=None): cdef ns_int i, j, size_search cdef ns_int d, m cdef NSResults results @@ -1012,12 +692,12 @@ cdef class FastNS(object): cdef ns_int nchecked = 0 - - cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int[:] checked cdef ns_int npairs = 0 + #cdef bint debug=False + if not self.prepared: self.prepare() @@ -1034,12 +714,12 @@ cdef class FastNS(object): checked = np.zeros(size, dtype=np.int) - results = NSResults(self.cutoff, self.coords_bbox, search_ids, self.debug) + results = NSResults(self.cutoff, self.coords, search_ids, self.debug) cdef bint memory_error = False - if self.debug and debug: - print("FastNS: Debug flag is set to True for FastNS.search()") + # if self.debug and debug: + # print("FastNS: Debug flag is set to True for FastNS.search()") with nogil: for i in range(size_search): @@ -1050,13 +730,13 @@ cdef class FastNS(object): cellindex = self.grid.cellids[current_beadid] self.grid.cellid2cellxyz(cellindex, cellxyz) - if self.debug and debug: - with gil: - print("FastNS: Checking neighbors for bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]:" .format( - current_beadid, - self.coords[current_beadid, XX], self.coords[current_beadid, YY], self.coords[current_beadid, ZZ], - self.coords_bbox[current_beadid, XX], self.coords_bbox[current_beadid, YY], self.coords_bbox[current_beadid, ZZ], - cellxyz[XX], cellxyz[YY], cellxyz[ZZ])) + # if self.debug and debug: + # with gil: + # print("FastNS: Checking neighbors for bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]:" .format( + # current_beadid, + # self.coords[current_beadid, XX], self.coords[current_beadid, YY], self.coords[current_beadid, ZZ], + # self.coords_bbox[current_beadid, XX], self.coords_bbox[current_beadid, YY], self.coords_bbox[current_beadid, ZZ], + # cellxyz[XX], cellxyz[YY], cellxyz[ZZ])) for xi in range(DIM): @@ -1067,25 +747,25 @@ cdef class FastNS(object): # If box is not triclinic (ie rect), when can already check if the shift can be skipped (ie cutoff inside the cell) if xi == 0: if self.coords_bbox[current_beadid, XX] - self.cutoff > self.grid.cellsize[XX] * cellxyz[XX]: - if self.debug and debug: - with gil: - print("FastNS: -> Bead X={:.3f}, Cell X={:.3f}, cutoff={:.3f} -> -X shift ignored".format( - self.coords_bbox[current_beadid, XX], - self.grid.cellsize[XX] * cellxyz[XX], - self.cutoff - )) + # if self.debug and debug: + # with gil: + # print("FastNS: -> Bead X={:.3f}, Cell X={:.3f}, cutoff={:.3f} -> -X shift ignored".format( + # self.coords_bbox[current_beadid, XX], + # self.grid.cellsize[XX] * cellxyz[XX], + # self.cutoff + # )) continue if xi == 2: if self.coords_bbox[current_beadid, XX] + self.cutoff < self.grid.cellsize[XX] * (cellxyz[XX] + 1): - if self.debug and debug: - with gil: - print( - "FastNS: -> Bead X={:.3f}, Next cell X={:.3f}, cutoff={:.3f} -> +X shift ignored".format( - self.coords_bbox[current_beadid, XX], - self.grid.cellsize[XX] * (cellxyz[XX] + 1), - self.cutoff - )) + # if self.debug and debug: + # with gil: + # print( + # "FastNS: -> Bead X={:.3f}, Next cell X={:.3f}, cutoff={:.3f} -> +X shift ignored".format( + # self.coords_bbox[current_beadid, XX], + # self.grid.cellsize[XX] * (cellxyz[XX] + 1), + # self.cutoff + # )) continue for yi in range(DIM): @@ -1095,24 +775,24 @@ cdef class FastNS(object): if not self.box.is_triclinic: if yi == 0: if self.coords_bbox[current_beadid, YY] - self.cutoff > self.grid.cellsize[YY] * cellxyz[YY]: - if self.debug and debug: - with gil: - print("FastNS: -> Bead Y={:.3f}, Cell Y={:.3f}, cutoff={:.3f} -> -Y shift is ignored".format( - self.coords_bbox[current_beadid, YY], - self.grid.cellsize[YY] * cellxyz[YY], - self.cutoff, - )) + # if self.debug and debug: + # with gil: + # print("FastNS: -> Bead Y={:.3f}, Cell Y={:.3f}, cutoff={:.3f} -> -Y shift is ignored".format( + # self.coords_bbox[current_beadid, YY], + # self.grid.cellsize[YY] * cellxyz[YY], + # self.cutoff, + # )) continue if yi == 2: if self.coords_bbox[current_beadid, YY] + self.cutoff < self.grid.cellsize[YY] * (cellxyz[YY] + 1): - if self.debug and debug: - with gil: - print("FastNS: -> Bead Y={:.3f}, Next cell Y={:.3f}, cutoff={:.3f} -> +Y shift is ignored".format( - self.coords_bbox[current_beadid, YY], - self.grid.cellsize[YY] * (cellxyz[YY] +1), - self.cutoff, - )) + # if self.debug and debug: + # with gil: + # print("FastNS: -> Bead Y={:.3f}, Next cell Y={:.3f}, cutoff={:.3f} -> +Y shift is ignored".format( + # self.coords_bbox[current_beadid, YY], + # self.grid.cellsize[YY] * (cellxyz[YY] +1), + # self.cutoff, + # )) continue @@ -1121,17 +801,17 @@ cdef class FastNS(object): if zi == 0: if self.coords_bbox[current_beadid, ZZ] - self.cutoff > self.grid.cellsize[ZZ] * cellxyz[ZZ]: if self.coords_bbox[current_beadid, ZZ] - self.cutoff > 0: - if self.debug and debug: - with gil: - print("FastNS: -> Bead Z={:.3f}, Cell Z={:.3f}, cutoff={:.3f} -> -Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[ZZ] * cellxyz[ZZ], self.cutoff)) + # if self.debug and debug: + # with gil: + # print("FastNS: -> Bead Z={:.3f}, Cell Z={:.3f}, cutoff={:.3f} -> -Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[ZZ] * cellxyz[ZZ], self.cutoff)) continue if zi == 2: if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.grid.cellsize[ZZ] * (cellxyz[ZZ] + 1): if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.box.c_pbcbox.box[ZZ][ZZ]: - if self.debug and debug: - with gil: - print("FastNS: -> Bead Z={:.3f}, Next cell Z={:.3f}, cutoff={:.3f} -> +Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[XX] * (cellxyz[ZZ] + 1), self.cutoff)) + # if self.debug and debug: + # with gil: + # print("FastNS: -> Bead Z={:.3f}, Next cell Z={:.3f}, cutoff={:.3f} -> +Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[XX] * (cellxyz[ZZ] + 1), self.cutoff)) continue # Calculate and/or reinitialize shifted coordinates @@ -1169,29 +849,29 @@ cdef class FastNS(object): cellindex_probe = self.grid.coord2cellid(probe) if cellindex == cellindex_probe and xi != 1 and yi != 1 and zi != 1: - if self.debug and debug: - with gil: - print("FastNS: Grid shift [{}][{}][{}]: Cutoff is inside current cell -> This shift is ignored".format( - xi - 1, - yi -1, - zi -1 - )) + # if self.debug and debug: + # with gil: + # print("FastNS: Grid shift [{}][{}][{}]: Cutoff is inside current cell -> This shift is ignored".format( + # xi - 1, + # yi -1, + # zi -1 + # )) continue - if self.debug and debug: - self.grid.cellid2cellxyz(cellindex_adjacent, debug_cellxyz) - with gil: - dist_shift = self.box.fast_distance(&self.coords[current_beadid, XX], shifted_coord) - grid_shift = np.array([(xi - 1) * self.grid.cellsize[XX], - (yi - 1) * self.grid.cellsize[YY], - (zi - 1) * self.grid.cellsize[ZZ]]) - print("FastNS: -> Checking cell#{} ({},{},{}) for neighbors (dshift={:.3f}, grid_shift=({:.3f},{:.3f},{:.3f}->{:.3f})".format( - cellindex, - debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], - dist_shift, - grid_shift[XX], grid_shift[YY], grid_shift[ZZ], - np.sqrt(np.sum(grid_shift**2)) - )) + # if self.debug and debug: + # self.grid.cellid2cellxyz(cellindex_adjacent, debug_cellxyz) + # with gil: + # dist_shift = self.box.fast_distance(&self.coords[current_beadid, XX], shifted_coord) + # grid_shift = np.array([(xi - 1) * self.grid.cellsize[XX], + # (yi - 1) * self.grid.cellsize[YY], + # (zi - 1) * self.grid.cellsize[ZZ]]) + # print("FastNS: -> Checking cell#{} ({},{},{}) for neighbors (dshift={:.3f}, grid_shift=({:.3f},{:.3f},{:.3f}->{:.3f})".format( + # cellindex, + # debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], + # dist_shift, + # grid_shift[XX], grid_shift[YY], grid_shift[ZZ], + # np.sqrt(np.sum(grid_shift**2)) + # )) for j in range(self.grid.nbeads[cellindex_adjacent]): @@ -1223,12 +903,12 @@ cdef class FastNS(object): if d2 < EPSILON: continue - if self.debug and debug: - self.grid.cellid2cellxyz(cellindex, debug_cellxyz) - with gil: - self.box.fast_pbc_dx(&self.coords[current_beadid, XX], &self.coords[bid, XX], dx) - dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) - print("FastNS: \_ Neighbor found: bead#{} (cell[{},{},{}]) -> dx={} -> d={:.3f}".format(bid, debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], dx_py, np.sqrt(d2))) + # if self.debug and debug: + # self.grid.cellid2cellxyz(cellindex, debug_cellxyz) + # with gil: + # self.box.fast_pbc_dx(&self.coords[current_beadid, XX], &self.coords[bid, XX], dx) + # dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) + # print("FastNS: \_ Neighbor found: bead#{} (cell[{},{},{}]) -> dx={} -> d={:.3f}".format(bid, debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], dx_py, np.sqrt(d2))) if results.add_neighbors(current_beadid, bid, d2) == 0: memory_error = True break @@ -1260,183 +940,4 @@ cdef class FastNS(object): # self.box.fast_distance(&self.coords[ref_bead, XX], &self.coords[bid, XX]) <= self.cutoff, # )) - return results - - -# Python interface -cdef class FastNSOld(object): - cdef PBCBox box - cdef readonly real[:, ::1] coords - cdef real[:, ::1] coords_bbox - cdef readonly real cutoff - cdef bint prepared - cdef ns_grid grid - - def __init__(self, u): - import MDAnalysis as mda - from MDAnalysis.lib.mdamath import triclinic_vectors - - if not isinstance(u, mda.Universe): - raise TypeError("FastNS class must be initialized with a valid MDAnalysis.Universe instance") - box = triclinic_vectors(u.dimensions) - - if box.shape != (3, 3): - raise ValueError("Box must be provided as triclinic_dimensions (a 3x3 numpy.ndarray of unit cell vectors") - - self.box = PBCBox(box) - - self.coords = None - self.coords_bbox = None - - self.cutoff = -1 - - self.prepared = False - - self.grid.size = 0 - - - def __dealloc__(self): - cdef ns_int i - - # Deallocate NS grid - if self.grid.nbeads != NULL: - free(self.grid.nbeads) - - if self.grid.beadids != NULL: - free(self.grid.beadids) - - if self.grid.cellids != NULL: - free(self.grid.cellids) - - self.grid.size = 0 - - - def set_coords(self, real[:, ::1] coords): - self.coords = coords - - # Make sure atoms are inside the brick-shaped box - self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) - - self.prepared = False - - - def set_cutoff(self, real cutoff): - self.cutoff = cutoff - - self.prepared = False - - - def prepare(self, force=False): - cdef ns_int i, cellindex = -1 - cdef ns_int ncoords = self.coords.shape[0] - cdef rvec *coords = &self.coords_bbox[0, 0] - - cdef ns_int *beadcounts = NULL - - if self.prepared and not force: - print("NS already prepared, nothing to do!") - - if self.coords is None: - raise ValueError("Coordinates must be set before NS preparation!") - - if self.cutoff < 0: - raise ValueError("Cutoff must be set before NS preparation!") - - with nogil: - - # Initializing grid - for i in range(DIM): - self.grid.ncells[i] = (self.box.c_pbcbox.box[i][i] / self.cutoff) - if self.grid.ncells[i] == 0: - self.grid.ncells[i] = 1 - self.grid.cellsize[i] = self.box.c_pbcbox.box[i][i] / self.grid.ncells[i] - self.grid.size = self.grid.ncells[XX] * self.grid.ncells[YY] * self.grid.ncells[ZZ] - - # Allocate memory for temporary buffers - self.grid.cellids = malloc(sizeof(ns_int) * ncoords) - if self.grid.cellids == NULL: - with gil: - raise MemoryError("Could not allocate memory for cell ids") - - beadcounts = malloc(sizeof(ns_int) * self.grid.size) - if beadcounts == NULL: - with gil: - raise MemoryError("Could not allocate memory for bead count buffer") - - self.grid.nbeads = malloc(sizeof(ns_int) * self.grid.size) - if self.grid.nbeads == NULL: - with gil: - raise MemoryError("Could not allocate memory for NS grid") - - # Initialize buffers - for i in range(self.grid.size): - self.grid.nbeads[i] = 0 - beadcounts[i] = 0 - - - # First loop: find cellindex for each bead - for i in range(ncoords): - cellindex = (coords[i][ZZ] / self.grid.cellsize[ZZ]) * (self.grid.ncells[XX] * self.grid.ncells[YY]) +\ - (coords[i][YY] / self.grid.cellsize[YY]) * self.grid.ncells[XX] + \ - (coords[i][XX] / self.grid.cellsize[XX]) - - self.grid.nbeads[cellindex] += 1 - self.grid.cellids[i] = cellindex - - if self.grid.nbeads[cellindex] > self.grid.beadpercell: - self.grid.beadpercell = self.grid.nbeads[cellindex] - - # Allocate memory and set offsets - self.grid.beadids = malloc(sizeof(ns_int) * self.grid.size * self.grid.beadpercell) - if self.grid.beadids == NULL: - with gil: - raise MemoryError("Could not allocate memory for NS grid bead ids") - - # Second loop: fill grid - for i in range(ncoords): - cellindex = self.grid.cellids[i] - self.grid.beadids[cellindex * self.grid.beadpercell + beadcounts[cellindex]] = i - beadcounts[cellindex] += 1 - - # Now we can free the allocation buffer - free(beadcounts) - - self.prepared = True - - - def search(self, search_coords): - cdef real[:, ::1] search_coords_bbox - cdef real[:, ::1] search_coords_view - cdef ns_int nid, i, j - cdef ns_neighborhood_holder *holder - cdef ns_neighborhood *neighborhood - - if not self.prepared: - self.prepare() - - # Check the shape of search_coords as a array of 3D coords if needed - shape = search_coords.shape - if len(shape) == 1: - if not shape[0] == 3: - raise ValueError("Coordinates must be 3D") - else: - search_coords_view = np.array([search_coords,], dtype=np.float32) - else: - search_coords_view = search_coords - - # Make sure atoms are inside the brick-shaped box - search_coords_bbox = self.box.fast_put_atoms_in_bbox(search_coords_view) - - with nogil: - holder = ns_core(search_coords_bbox, self.coords_bbox, &self.grid, self.box, self.cutoff) - - if holder == NULL: - raise MemoryError("Could not allocate memory to run NS core") - - results = NSResultsOld(self.box, self.cutoff) - results.populate(holder, self.coords, search_coords_view) - - # Free memory allocated to holder - free_neighborhood_holder(holder) - - return results + return results \ No newline at end of file diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index d7be4f79e65..387b7119578 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -24,11 +24,11 @@ import pytest -from numpy.testing import assert_equal +from numpy.testing import assert_equal, assert_allclose import numpy as np import MDAnalysis as mda -from MDAnalysisTests.datafiles import GRO +from MDAnalysisTests.datafiles import GRO, Martini_membrane_gro from MDAnalysis.lib import nsgrid @@ -45,12 +45,95 @@ def run_grid_search(u, ids, cutoff=3): # Run grid search searcher = nsgrid.FastNS(u, cutoff, coords, debug=True) + return searcher.search(ids) - return searcher.search(ids, debug=False) +def test_pbc_badbox(): + """Check that PBC box accepts only well-formated boxes""" + with pytest.raises(TypeError): + nsgrid.PBCBox([]) -def test_gridsearch(universe): - """Check that pkdtree and grid search return the same results (No PBC needed)""" + with pytest.raises(ValueError): + nsgrid.PBCBox(np.zeros((3))) # Bad shape + nsgrid.PBCBox(np.zeros((3, 3))) # Collapsed box + nsgrid.PBCBOX(np.array([[0, 0, 0], [0, 1, 0], [0, 0, 1]])) # 2D box + nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])) # Box provided as array of integers + nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=float)) # Box provided as array of double + + +def test_pbc_distances(): + """Check that PBC box computes distances""" + box = np.identity(3, dtype=np.float32) + bad = np.array([0.1, 0.2], dtype=np.float32) + a = np.array([0.1, 0.1, 0.1], dtype=np.float32) + b = np.array([1.1, -0.1, 0.2], dtype=np.float32) + dx = np.array([0, -0.2, 0.1], dtype=np.float32) + pbcbox = nsgrid.PBCBox(box) + + with pytest.raises(ValueError): + pbcbox.distance(a, bad) + pbcbox.distance(bad, a) + + pbcbox.distance2(a, bad) + pbcbox.distance2(bad, a) + + pbcbox.dx(bad, a) + pbcbox.dx(a, bad) + + assert_equal(pbcbox.dx(a, b), dx) + assert pbcbox.distance(a, b) == np.sqrt(np.sum(dx*dx)) + assert pbcbox.distance2(a, b) == np.sum(dx*dx) + + +def test_pbc_put_in_bbox(): + "Check that PBC put beads in brick-shaped box" + box = np.identity(3, dtype=np.float32) + coords = np.array( + [ + [0.1, 0.1, 0.1], + [-0.1, 1.1, 0.9] + ], + dtype=np.float32 + ) + results = np.array( + [ + [0.1, 0.1, 0.1], + [0.9, 0.1, 0.9] + ], + dtype=np.float32 + ) + + pbcbox = nsgrid.PBCBox(box) + + assert_allclose(pbcbox.put_atoms_in_bbox(coords), results, atol=1e-5) + + +def test_nsgrid_badinit(): + with pytest.raises(TypeError): + nsgrid.FastNS(None, 1) + +def test_nsgrid_badcutoff(universe): + with pytest.raises(ValueError): + run_grid_search(universe, 0, -4) + run_grid_search(universe, 0, 100000) + +def test_ns_grid_noneighbor(universe): + """Check that grid search returns empty lists/arrays when there is no neighbors""" + ref_id = 0 + cutoff = 0.5 + + results_grid = run_grid_search(universe, ref_id, cutoff) + + assert len(results_grid.get_coordinates()[0]) == 0 + assert len(results_grid.get_distances()[0]) == 0 + assert len(results_grid.get_indices()[0]) == 0 + assert len(results_grid.get_pairs()) == 0 + assert len(results_grid.get_pair_distances()) == 0 + assert len(results_grid.get_pair_coordinates()) == 0 + + +def test_nsgrid_noPBC(universe): + """Check that grid search works when no PBC is needed""" ref_id = 0 @@ -63,8 +146,31 @@ def test_gridsearch(universe): assert_equal(results, results_grid) -def test_gridsearch_PBC(universe): - """Check that pkdtree and grid search return the same results (No PBC needed)""" +def test_nsgrid_PBC_rect(): + """Check that nsgrid works with rect boxes and PBC""" + ref_id = 191 + results = np.array([191, 672, 682, 683, 684, 995, 996, 2060, 2808, 3300, 3791, + 3792]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! + + universe = mda.Universe(Martini_membrane_gro) + cutoff = 7 + + # FastNS is called differently to max coverage + searcher = nsgrid.FastNS(universe, cutoff, prepare=False) + + results_grid = searcher.search([ref_id,]).get_indices()[0] # pass the id as a list for test+coverage purpose + + searcher.prepare() # Does nothing, called here for coverage + results_grid2 = searcher.search().get_indices() # call without specifying any ids, should do NS for all beads + + assert_equal(results, results_grid) + assert_equal(len(universe.atoms), len(results_grid2)) + assert searcher.cutoff == 7 + assert_equal(results_grid, results_grid2[ref_id]) + + +def test_nsgrid_PBC(universe): + """Check that grid search works when PBC is needed""" ref_id = 13937 results = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, @@ -76,51 +182,80 @@ def test_gridsearch_PBC(universe): -# def test_gridsearch_PBC(universe): -# """Check that pkdtree and grid search return the same results (PBC needed)""" -# -# ref_id = 13937 -# results_pkdtree, results_grid = run_search(universe, ref_id) -# assert_equal(results_pkdtree, results_grid) -# -# -# def test_gridsearch_arraycoord(universe): -# """Check the NS routine accepts a single bead coordinate as well as array of coordinates""" -# cutoff = 2 -# ref_pos = universe.atoms.positions[:5] -# -# results = [ -# np.array([2, 1, 4, 3]), -# np.array([2, 0, 3]), -# np.array([0, 1, 3]), -# np.array([ 2, 0, 1, 38341]), -# np.array([ 6, 0, 5, 17]) -# ] -# -# results_grid = run_grid_search(universe, ref_pos, cutoff).get_indices() -# -# assert_equal(results_grid, results) -# -# -# def test_gridsearch_search_coordinates(grid_results): -# """Check the NS routine can return coordinates instead of ids""" -# -# results = np.array( -# [ -# [40.32, 34.25, 55.9], -# [0.61, 76.33, -0.56], -# [0.48999998, 75.9, 0.19999999], -# [-0.11, 76.19, 0.77] -# ]) -# -# assert_allclose(grid_results.get_coordinates()[0], results) -# -# -# def test_gridsearch_search_distances(grid_results): -# """Check the NS routine can return PBC distances from neighbors""" -# results = np.array([0.096, 0.096, 0.015, 0.179]) * 10 # These distances were obtained using gmx distance -# results.sort() -# -# rounded_results = np.round(grid_results.get_distances()[0], 2) -# -# assert_allclose(sorted(rounded_results), results) +def test_nsgrid_pairs(universe): + """Check that grid search returns the proper pairs""" + + ref_id = 13937 + neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, + 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! + results = [] + for nid in neighbors: + if nid < ref_id: + results.append([nid, ref_id]) + else: + results.append([ref_id, nid]) + results = np.array(results) + + results_grid = run_grid_search(universe, ref_id).get_pairs() + + assert_equal(np.sort(results, axis=0), np.sort(results_grid, axis=0)) + + +def test_nsgrid_pair_distances(universe): + """Check that grid search returns the proper pair distances""" + + ref_id = 13937 + results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, + 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm + + results_grid = run_grid_search(universe, ref_id).get_pair_distances() + + assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) + + +def test_nsgrid_pair_coordinates(universe): + """Check that grid search return the proper pair coordinates""" + + ref_id = 13937 + neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, + 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! + coords = universe.atoms.positions + + results = [] + for nid in neighbors: + if nid < ref_id: + results.append([coords[nid], coords[ref_id]]) + else: + results.append([coords[ref_id], coords[nid]]) + results = np.array(results) + + results_grid = run_grid_search(universe, ref_id).get_pair_coordinates() + + assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) + + +def test_nsgrid_distances(universe): + """Check that grid search returns the proper distances""" + + ref_id = 13937 + results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, + 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm + + results_grid = run_grid_search(universe, ref_id).get_distances()[0] + + assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) + + +def test_nsgrid_coordinates(universe): + """Check that grid search return the proper coordinates""" + + ref_id = 13937 + neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, + 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! + + results = universe.atoms.positions[neighbors] + + results_grid = run_grid_search(universe, ref_id).get_coordinates()[0] + + assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) + From 8a75a5fe81259ca5f2baee8ee780d3266a23b4cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Buchoux?= Date: Wed, 18 Jul 2018 17:29:27 +0200 Subject: [PATCH 347/455] Removed all references to c_gridsearch.pyx/grid module that reappeared after merge/rebase --- .../doc/sphinx/source/documentation_pages/lib_modules.rst | 4 ++-- package/setup.py | 7 ++++--- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package/doc/sphinx/source/documentation_pages/lib_modules.rst b/package/doc/sphinx/source/documentation_pages/lib_modules.rst index 83d7f81cfd9..f918f37137e 100644 --- a/package/doc/sphinx/source/documentation_pages/lib_modules.rst +++ b/package/doc/sphinx/source/documentation_pages/lib_modules.rst @@ -36,7 +36,7 @@ functions whereas mathematical functions are to be found in :mod:`MDAnalysis.lib.NeighborSearch` contains classes to do neighbor searches with MDAnalysis objects. -:mod:`MDAnalysis.lib.grid` contains a fast implementation of grid neighbor search. +:mod:`MDAnalysis.lib.nsgrid` contains a fast implementation of grid neighbor search. List of modules --------------- @@ -51,7 +51,7 @@ List of modules ./lib/transformations ./lib/qcprot ./lib/util - ./lib/grid + ./lib/nsgrid Low level file formats ---------------------- diff --git a/package/setup.py b/package/setup.py index bd3aceec8df..52d29fecc7c 100755 --- a/package/setup.py +++ b/package/setup.py @@ -380,8 +380,8 @@ def extensions(config): libraries=mathlib, define_macros=define_macros, extra_compile_args=extra_compile_args) - grid = MDAExtension('MDAnalysis.lib.grid', - ['MDAnalysis/lib/c_gridsearch' + source_suffix], + nsgrid = MDAExtension('MDAnalysis.lib.nsgrid', + ['MDAnalysis/lib/nsgrid' + source_suffix], include_dirs=include_dirs, libraries=mathlib + parallel_libraries, define_macros=define_macros + parallel_macros, @@ -389,7 +389,8 @@ def extensions(config): extra_link_args=parallel_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, - ap_clustering, spe_dimred, grid] + ap_clustering, spe_dimred, cutil, nsgrid] + cython_generated = [] if use_cython: diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index 387b7119578..0fc6e1ec880 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -81,8 +81,8 @@ def test_pbc_distances(): pbcbox.dx(a, bad) assert_equal(pbcbox.dx(a, b), dx) - assert pbcbox.distance(a, b) == np.sqrt(np.sum(dx*dx)) - assert pbcbox.distance2(a, b) == np.sum(dx*dx) + assert_allclose(pbcbox.distance(a, b), np.sqrt(np.sum(dx*dx)), atol=1e-5) + assert_allclose(pbcbox.distance2(a, b), np.sum(dx*dx), atol=1e-5) def test_pbc_put_in_bbox(): From 7b0c56c99d5e99c4f4d092ba7d951b4052b89e76 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 21 Jul 2018 14:30:23 +0200 Subject: [PATCH 348/455] remove unused code --- package/MDAnalysis/lib/nsgrid.pyx | 93 ++----------------------------- 1 file changed, 5 insertions(+), 88 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index e4de849ffff..dc4017191c0 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -69,20 +69,15 @@ cdef void rvec_clear(rvec a) nogil: a[YY]=0.0 a[ZZ]=0.0 -######################################################################################################################## -# -# Utility class to handle PBC -# -######################################################################################################################## +############################### +# Utility class to handle PBC # +############################### cdef struct cPBCBox_t: matrix box rvec fbox_diag rvec hbox_diag rvec mhbox_diag real max_cutoff2 - ns_int ntric_vec - ns_int[DIM] tric_shift[MAX_NTRICVEC] - real[DIM] tric_vec[MAX_NTRICVEC] # Class to handle PBC calculations @@ -141,90 +136,12 @@ cdef class PBCBox(object): tmp += box[ZZ, YY] min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) - self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) - # Update shift vectors - self.c_pbcbox.ntric_vec = 0 - - # We will only use single shifts - for kk in range(3): - k = order[kk] - - for jj in range(3): - j = order[jj] - - for ii in range(3): - i = order[ii] - - # A shift is only useful when it is trilinic - if j != 0 or k != 0: - d2old = 0 - d2new = 0 - - for d in range(DIM): - trial[d] = i*box[XX, d] + j*box[YY, d] + k*box[ZZ, d] - - # Choose the vector within the brick around 0,0,0 that - # will become the shortest due to shift try. - if trial[d] < 0: - pos[d] = min(self.c_pbcbox.hbox_diag[d], -trial[d]) - else: - pos[d] = max(-self.c_pbcbox.hbox_diag[d], -trial[d]) - - d2old += pos[d]**2 - d2new += (pos[d] + trial[d])**2 - - if BOX_MARGIN*d2new < d2old: - if not (j < -1 or j > 1 or k < -1 or k > 1): - use = True - - for dd in range(DIM): - if dd == 0: - shift = i - elif dd == 1: - shift = j - else: - shift = k - - if shift: - d2new_c = 0 - - for d in range(DIM): - d2new_c += (pos[d] + trial[d] - shift*box[dd, d])**2 - - if d2new_c <= BOX_MARGIN*d2new: - use = False - - if use: # Accept this shift vector. - if self.c_pbcbox.ntric_vec >= MAX_NTRICVEC: - with gil: - print("\nWARNING: Found more than %d triclinic " - "correction vectors, ignoring some." - % MAX_NTRICVEC) - print(" There is probably something wrong with " - "your box.") - print(np.array(box)) - - for i in range(self.c_pbcbox.ntric_vec): - print(" -> shift #{}: [{}, {}, {}]".format(i+1, - self.c_pbcbox.tric_shift[i][XX], - self.c_pbcbox.tric_shift[i][YY], - self.c_pbcbox.tric_shift[i][ZZ])) - else: - for d in range(DIM): - self.c_pbcbox.tric_vec[self.c_pbcbox.ntric_vec][d] = \ - trial[d] - self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][XX] = i - self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][YY] = j - self.c_pbcbox.tric_shift[self.c_pbcbox.ntric_vec][ZZ] = k - self.c_pbcbox.ntric_vec += 1 - - def update(self, real[:,::1] box): if box.shape[0] != DIM or box.shape[1] != DIM: - raise ValueError("Box must be a %i x %i matrix. (shape: %i x %i)" % - (DIM, DIM, box.shape[0], box.shape[1])) + raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( + DIM, DIM, box.shape[0], box.shape[1])) if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): raise ValueError("Box does not correspond to PBC=xyz") self.fast_update(box) From 37658683132363094a86776671887e88742c79cd Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 21 Jul 2018 14:30:43 +0200 Subject: [PATCH 349/455] make init_callable twice --- package/MDAnalysis/lib/nsgrid.pyx | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index dc4017191c0..f051e7e413d 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -221,11 +221,9 @@ cdef class PBCBox(object): return np.asarray(self.fast_put_atoms_in_bbox(coords)) -######################################################################################################################## -# -# Neighbor Search Stuff -# -######################################################################################################################## +######################### +# Neighbor Search Stuff # +######################### cdef class NSResults(object): cdef readonly real cutoff cdef ns_int npairs @@ -246,7 +244,6 @@ cdef class NSResults(object): cdef np.ndarray pair_coordinates_buffer def __init__(self, real cutoff, real[:, ::1]coords, ns_int[:] search_ids, debug=False): - self.debug = debug self.cutoff = cutoff self.coords = coords @@ -254,12 +251,19 @@ cdef class NSResults(object): # Preallocate memory self.allocation_size = search_ids.shape[0] + 1 - self.pairs = PyMem_Malloc(sizeof(ipair) * self.allocation_size) - if not self.pairs: - MemoryError("Could not allocate memory for NSResults.pairs ({} bits requested)".format(sizeof(ipair) * self.allocation_size)) - self.pair_distances2 = PyMem_Malloc(sizeof(real) * self.allocation_size) - if not self.pair_distances2: - raise MemoryError("Could not allocate memory for NSResults.pair_distances2 ({} bits requested)".format(sizeof(real) * self.allocation_size)) + if not self.pairs and not self.pair_distances2: + self.pairs = PyMem_Malloc(sizeof(ipair) * self.allocation_size) + if not self.pairs: + MemoryError("Could not allocate memory for NSResults.pairs " + "({} bits requested)".format(sizeof(ipair) * self.allocation_size)) + self.pair_distances2 = PyMem_Malloc(sizeof(real) * self.allocation_size) + if not self.pair_distances2: + raise MemoryError("Could not allocate memory for NSResults.pair_distances2 " + "({} bits requested)".format(sizeof(real) * self.allocation_size)) + else: + if self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) == 0: + raise MemoryError("foo") + self.npairs = 0 # Buffer From f23000868a1b3b8780b7c9afd0007ac5711d2225 Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 21 Jul 2018 15:34:44 +0200 Subject: [PATCH 350/455] use OK and ERROR as return codes --- package/MDAnalysis/lib/nsgrid.pyx | 32 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index f051e7e413d..01bf67e0c4c 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -46,6 +46,9 @@ DEF EPSILON = 1e-5 DEF BOX_MARGIN=1.0010 DEF MAX_NTRICVEC=12 +DEF OK=0 +DEF ERROR=1 + # Used to handle memory allocation from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free from libc.math cimport sqrt @@ -261,7 +264,7 @@ cdef class NSResults(object): raise MemoryError("Could not allocate memory for NSResults.pair_distances2 " "({} bits requested)".format(sizeof(real) * self.allocation_size)) else: - if self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) == 0: + if self.resize(self.allocation_size) != OK: raise MemoryError("foo") self.npairs = 0 @@ -278,13 +281,13 @@ cdef class NSResults(object): PyMem_Free(self.pair_distances2) cdef int add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: - # Important: If this function returns 0, it means that memory allocation failed + # Important: If this function returns ERROR, it means that memory allocation failed # Reallocate memory if needed if self.npairs >= self.allocation_size: # We need to reallocate memory - if self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) == 0: - return 0 + if self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) != OK: + return ERROR # Actually store pair and distance squared if beadid_i < beadid_j: @@ -296,20 +299,20 @@ cdef class NSResults(object): self.pair_distances2[self.npairs] = distance2 self.npairs += 1 - return self.npairs + return OK cdef int resize(self, ns_int new_size) nogil: # Important: If this function returns 0, it means that memory allocation failed if new_size < self.npairs: # Silently ignored the request - return 1 + return OK if self.allocation_size >= new_size: if self.debug: with gil: print("NSresults: Reallocation requested but not needed ({} requested but {} already allocated)".format(new_size, self.allocation_size)) - return 1 + return OK self.allocation_size = new_size @@ -323,12 +326,12 @@ cdef class NSResults(object): self.pair_distances2 = PyMem_Realloc(self.pair_distances2, sizeof(real) * self.allocation_size) if not self.pairs: - return 0 + return ERROR if not self.pair_distances2: - return 0 + return ERROR - return 1 + return OK def get_pairs(self): cdef ns_int i @@ -823,14 +826,7 @@ cdef class FastNS(object): if d2 < EPSILON: continue - - # if self.debug and debug: - # self.grid.cellid2cellxyz(cellindex, debug_cellxyz) - # with gil: - # self.box.fast_pbc_dx(&self.coords[current_beadid, XX], &self.coords[bid, XX], dx) - # dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) - # print("FastNS: \_ Neighbor found: bead#{} (cell[{},{},{}]) -> dx={} -> d={:.3f}".format(bid, debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], dx_py, np.sqrt(d2))) - if results.add_neighbors(current_beadid, bid, d2) == 0: + elif results.add_neighbors(current_beadid, bid, d2) != OK: memory_error = True break npairs += 1 From a738fa9b8bd4492e66141aca15662d5f76e7f42e Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 21 Jul 2018 15:34:59 +0200 Subject: [PATCH 351/455] remove dead code --- package/MDAnalysis/lib/nsgrid.pyx | 171 +----------------------------- 1 file changed, 4 insertions(+), 167 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 01bf67e0c4c..df6d130ef14 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -615,14 +615,11 @@ cdef class FastNS(object): cdef rvec shifted_coord, probe, dx cdef ns_int nchecked = 0 + cdef ns_int[:] checked = np.zeros(size, dtype=np.int) cdef real cutoff2 = self.cutoff * self.cutoff - cdef ns_int[:] checked cdef ns_int npairs = 0 - #cdef bint debug=False - - if not self.prepared: self.prepare() @@ -636,134 +633,44 @@ cdef class FastNS(object): search_ids_view = search_ids size_search = search_ids.shape[0] - checked = np.zeros(size, dtype=np.int) - results = NSResults(self.cutoff, self.coords, search_ids, self.debug) cdef bint memory_error = False - # if self.debug and debug: - # print("FastNS: Debug flag is set to True for FastNS.search()") - with nogil: for i in range(size_search): if memory_error: break current_beadid = search_ids_view[i] - cellindex = self.grid.cellids[current_beadid] self.grid.cellid2cellxyz(cellindex, cellxyz) - - # if self.debug and debug: - # with gil: - # print("FastNS: Checking neighbors for bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]:" .format( - # current_beadid, - # self.coords[current_beadid, XX], self.coords[current_beadid, YY], self.coords[current_beadid, ZZ], - # self.coords_bbox[current_beadid, XX], self.coords_bbox[current_beadid, YY], self.coords_bbox[current_beadid, ZZ], - # cellxyz[XX], cellxyz[YY], cellxyz[ZZ])) - - for xi in range(DIM): if memory_error: break - - if not self.box.is_triclinic: - # If box is not triclinic (ie rect), when can already check if the shift can be skipped (ie cutoff inside the cell) - if xi == 0: - if self.coords_bbox[current_beadid, XX] - self.cutoff > self.grid.cellsize[XX] * cellxyz[XX]: - # if self.debug and debug: - # with gil: - # print("FastNS: -> Bead X={:.3f}, Cell X={:.3f}, cutoff={:.3f} -> -X shift ignored".format( - # self.coords_bbox[current_beadid, XX], - # self.grid.cellsize[XX] * cellxyz[XX], - # self.cutoff - # )) - continue - - if xi == 2: - if self.coords_bbox[current_beadid, XX] + self.cutoff < self.grid.cellsize[XX] * (cellxyz[XX] + 1): - # if self.debug and debug: - # with gil: - # print( - # "FastNS: -> Bead X={:.3f}, Next cell X={:.3f}, cutoff={:.3f} -> +X shift ignored".format( - # self.coords_bbox[current_beadid, XX], - # self.grid.cellsize[XX] * (cellxyz[XX] + 1), - # self.cutoff - # )) - continue - for yi in range(DIM): if memory_error: break - - if not self.box.is_triclinic: - if yi == 0: - if self.coords_bbox[current_beadid, YY] - self.cutoff > self.grid.cellsize[YY] * cellxyz[YY]: - # if self.debug and debug: - # with gil: - # print("FastNS: -> Bead Y={:.3f}, Cell Y={:.3f}, cutoff={:.3f} -> -Y shift is ignored".format( - # self.coords_bbox[current_beadid, YY], - # self.grid.cellsize[YY] * cellxyz[YY], - # self.cutoff, - # )) - continue - - if yi == 2: - if self.coords_bbox[current_beadid, YY] + self.cutoff < self.grid.cellsize[YY] * (cellxyz[YY] + 1): - # if self.debug and debug: - # with gil: - # print("FastNS: -> Bead Y={:.3f}, Next cell Y={:.3f}, cutoff={:.3f} -> +Y shift is ignored".format( - # self.coords_bbox[current_beadid, YY], - # self.grid.cellsize[YY] * (cellxyz[YY] +1), - # self.cutoff, - # )) - continue - - for zi in range(DIM): - if not self.box.is_triclinic: - if zi == 0: - if self.coords_bbox[current_beadid, ZZ] - self.cutoff > self.grid.cellsize[ZZ] * cellxyz[ZZ]: - if self.coords_bbox[current_beadid, ZZ] - self.cutoff > 0: - # if self.debug and debug: - # with gil: - # print("FastNS: -> Bead Z={:.3f}, Cell Z={:.3f}, cutoff={:.3f} -> -Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[ZZ] * cellxyz[ZZ], self.cutoff)) - continue - - if zi == 2: - if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.grid.cellsize[ZZ] * (cellxyz[ZZ] + 1): - if self.coords_bbox[current_beadid, ZZ] + self.cutoff < self.box.c_pbcbox.box[ZZ][ZZ]: - # if self.debug and debug: - # with gil: - # print("FastNS: -> Bead Z={:.3f}, Next cell Z={:.3f}, cutoff={:.3f} -> +Z shift is ignored".format(self.coords_bbox[current_beadid, ZZ], self.grid.cellsize[XX] * (cellxyz[ZZ] + 1), self.cutoff)) - continue - + if memory_error: + break # Calculate and/or reinitialize shifted coordinates shifted_coord[XX] = self.coords[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] shifted_coord[YY] = self.coords[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] shifted_coord[ZZ] = self.coords[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] - probe[XX] = self.coords[current_beadid, XX] + (xi - 1) * self.cutoff probe[YY] = self.coords[current_beadid, YY] + (yi - 1) * self.cutoff probe[ZZ] = self.coords[current_beadid, ZZ] + (zi - 1) * self.cutoff - # Make sure the shifted coordinates is inside the brick-shaped box for m in range(DIM - 1, -1, -1): - while shifted_coord[m] < 0: for d in range(m+1): shifted_coord[d] += self.box.c_pbcbox.box[m][d] - - while shifted_coord[m] >= self.box.c_pbcbox.box[m][m]: for d in range(m+1): shifted_coord[d] -= self.box.c_pbcbox.box[m][d] - while probe[m] < 0: for d in range(m+1): probe[d] += self.box.c_pbcbox.box[m][d] - - while probe[m] >= self.box.c_pbcbox.box[m][m]: for d in range(m+1): probe[d] -= self.box.c_pbcbox.box[m][d] @@ -772,58 +679,12 @@ cdef class FastNS(object): cellindex_adjacent = self.grid.coord2cellid(shifted_coord) cellindex_probe = self.grid.coord2cellid(probe) - if cellindex == cellindex_probe and xi != 1 and yi != 1 and zi != 1: - # if self.debug and debug: - # with gil: - # print("FastNS: Grid shift [{}][{}][{}]: Cutoff is inside current cell -> This shift is ignored".format( - # xi - 1, - # yi -1, - # zi -1 - # )) - continue - - # if self.debug and debug: - # self.grid.cellid2cellxyz(cellindex_adjacent, debug_cellxyz) - # with gil: - # dist_shift = self.box.fast_distance(&self.coords[current_beadid, XX], shifted_coord) - # grid_shift = np.array([(xi - 1) * self.grid.cellsize[XX], - # (yi - 1) * self.grid.cellsize[YY], - # (zi - 1) * self.grid.cellsize[ZZ]]) - # print("FastNS: -> Checking cell#{} ({},{},{}) for neighbors (dshift={:.3f}, grid_shift=({:.3f},{:.3f},{:.3f}->{:.3f})".format( - # cellindex, - # debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], - # dist_shift, - # grid_shift[XX], grid_shift[YY], grid_shift[ZZ], - # np.sqrt(np.sum(grid_shift**2)) - # )) - - for j in range(self.grid.nbeads[cellindex_adjacent]): bid = self.grid.beadids[cellindex_adjacent * self.grid.nbeads_per_cell + j] - if checked[bid] != 0: continue - d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) - - # if self.debug: - # self.grid.cellid2cellxyz(cellindex, debug_cellxyz) - # with gil: - # print( - # "Beads #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) and #{} (cell[{},{},{}]-coords[{:.3f},{:.3f},{:.3f}]) are tested (d2={:.3f})".format( - # current_beadid, - # cellxyz[XX], cellxyz[YY], cellxyz[ZZ], - # self.coords_bbox[current_beadid, XX], - # self.coords_bbox[current_beadid, YY], - # self.coords_bbox[current_beadid, ZZ], - # bid, - # debug_cellxyz[XX], debug_cellxyz[YY], debug_cellxyz[ZZ], - # self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], - # self.coords_bbox[bid, ZZ], - # d2)) - if d2 < cutoff2: - if d2 < EPSILON: continue elif results.add_neighbors(current_beadid, bid, d2) != OK: @@ -831,30 +692,6 @@ cdef class FastNS(object): break npairs += 1 checked[current_beadid] = 1 - if memory_error: raise MemoryError("Could not allocate memory to store NS results") - - - if self.debug: - print("Total number of pairs={}".format(npairs)) - - # ref_bead = 13937 - # beads = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 - # for bid in beads: - # self.box.fast_pbc_dx(&self.coords[ref_bead, XX], &self.coords[bid, XX], dx) - # dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) - # self.box.fast_pbc_dx(&self.coords_bbox[ref_bead, XX], &self.coords_bbox[bid, XX], dx) - # rect_dx_py = np.array([dx[XX], dx[YY], dx[ZZ]]) - # self.grid.cellid2cellxyz(self.grid.coord2cellid(&self.coords_bbox[bid, XX]), cellxyz) - # print("Bead #{} ({:.3f},{:.3f},{:.3f})->rect({:.3f},{:.3f},{:.3f}) - cell[{},{},{}]: dx=[{:.3f},{:.3f},{:.3f}] -> dist: {:.3f} ({})".format( - # bid, - # self.coords[bid, XX], self.coords[bid, YY], self.coords[bid,ZZ], - # self.coords_bbox[bid, XX], self.coords_bbox[bid, YY], self.coords_bbox[bid,ZZ], - # cellxyz[XX], cellxyz[YY], cellxyz[ZZ], - # dx[XX], dx[YY], dx[ZZ], - # np.sqrt(np.sum(dx_py**2)), - # self.box.fast_distance(&self.coords[ref_bead, XX], &self.coords[bid, XX]) <= self.cutoff, - # )) - - return results \ No newline at end of file + return results From 89f0b897ce5eb3efa84f9ea0964c7c493da5e69f Mon Sep 17 00:00:00 2001 From: Max Linke Date: Sat, 21 Jul 2018 20:42:25 +0200 Subject: [PATCH 352/455] remove possible memory leak --- package/MDAnalysis/lib/nsgrid.pyx | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index df6d130ef14..6dff29a6bab 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -506,12 +506,7 @@ cdef class NSGrid(object): cdef fill_grid(self, real[:, ::1] coords): cdef ns_int i, cellindex = -1 cdef ns_int ncoords = coords.shape[0] - cdef ns_int *beadcounts = NULL - - # Allocate memory - beadcounts = PyMem_Malloc(sizeof(ns_int) * self.size) - if not beadcounts: - raise MemoryError("Could not allocate memory for bead count buffer ({} bits requested)".format(sizeof(ns_int) * self.size)) + cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) with nogil: # Initialize buffers @@ -528,12 +523,12 @@ cdef class NSGrid(object): if self.nbeads[cellindex] > self.nbeads_per_cell: self.nbeads_per_cell = self.nbeads[cellindex] - # Allocate memory - with gil: - self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) #np.empty((self.size, nbeads_max), dtype=np.int) - if not self.beadids: - raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + # Allocate memory + self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) #np.empty((self.size, nbeads_max), dtype=np.int) + if not self.beadids: + raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + with nogil: # Second loop: fill grid for i in range(ncoords): @@ -542,8 +537,6 @@ cdef class NSGrid(object): self.beadids[cellindex * self.nbeads_per_cell + beadcounts[cellindex]] = i beadcounts[cellindex] += 1 - # Now we can free the allocation buffer - PyMem_Free(beadcounts) cdef class FastNS(object): From 08de29ba921f2c71b456a8b6f4eee9b6ec482c74 Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 26 Jul 2018 20:31:33 -0700 Subject: [PATCH 353/455] added the capped function, modified the nsgrid to use box, coordinates as input parameters, modified tests --- package/MDAnalysis/lib/distances.py | 58 ++++++++++++++++++- package/MDAnalysis/lib/nsgrid.pyx | 12 ++-- .../MDAnalysisTests/lib/test_distances.py | 7 ++- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 4 +- 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 1cb86147235..4d662068a69 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -520,7 +520,8 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, """ methods = {'bruteforce': _bruteforce_capped, - 'pkdtree': _pkdtree_capped} + 'pkdtree': _pkdtree_capped, + 'nsgrid': _nsgrid_capped} if method is not None: return methods[method] @@ -643,6 +644,61 @@ def _pkdtree_capped(reference, configuration, max_cutoff, distances.append(dist[num]) return pairs, distances +def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, + box=None): + """Search all the pairs in *reference* and *configuration* within + a specified distance using Grid Search + + + Parameters + ----------- + reference : array + reference coordinates array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)``. + configuration : array + Configuration coordinate array with shape ``reference.shape = (3,)`` + or ``reference.shape = (len(reference), 3)`` + max_cutoff : float + Maximum cutoff distance between the reference and configuration + min_cutoff : (optional) float + Minimum cutoff distance between reference and configuration [None] + box : array + The dimensions, if provided, must be provided in the same + The unitcell dimesions for this system format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention + is applied if the box is provided + + Note + ---- + Non Periodic Boundary conditions can-not be handled currently + + """ + from .nsgrid import FastNS + if reference.shape == (3, ): + reference = reference[None, :] + if configuration.shape == (3, ): + configuration = configuration[None, :] + all_coords = np.concatenate([configuration, reference]) + mapping = np.arange(len(reference), dtype=np.int64) + gridsearch = FastNS(box, max_cutoff, all_coords) + gridsearch.prepare() + search_ids = np.arange(len(configuration), len(all_coords)) + results = gridsearch.search(search_ids=search_ids) + pairs = results.get_pairs() + pairs[:, 1] = undo_augment(pairs[:, 1], mapping, len(configuration)) + pair_distance = results.get_pair_distances() + + if min_cutoff is not None: + idx = pair_distance > min_cutoff + pairs, pair_distance = pairs[idx], pair_distance[idx] + if pairs.size > 0: + # removing the pairs (i, j) from (reference, reference) + mask = (pairs[:, 0] < (len(configuration) - 1) ) + pairs, pair_distance = pairs[mask], pair_distance[mask] + pairs = np.sort(pairs, axis=1) + return pairs, pair_distance + def self_capped_distance(reference, max_cutoff, min_cutoff=None, box=None, method=None): diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 6dff29a6bab..f38e8e143c4 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -548,21 +548,20 @@ cdef class FastNS(object): cdef bint prepared cdef NSGrid grid - def __init__(self, u, cutoff, coords=None, prepare=True, debug=False, max_gridsize=5000): + def __init__(self, box, cutoff, coords, prepare=True, debug=False, max_gridsize=5000): import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors self.debug = debug - if not isinstance(u, mda.Universe): - raise TypeError("FastNS class must be initialized with a valid MDAnalysis.Universe instance") - box = triclinic_vectors(u.dimensions) + if box.shape != (3,3): + box = triclinic_vectors(box) self.box = PBCBox(box) - if coords is None: - coords = u.atoms.positions + #if coords is None: + # coords = u.atoms.positions self.coords = coords.copy() @@ -579,7 +578,6 @@ cdef class FastNS(object): if prepare: self.prepare() - def prepare(self, force=False): if self.prepared and not force: return diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 38f634844e3..d83d8903e93 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -66,7 +66,7 @@ def test_capped_distance_noresults(): np.array([[0.1, 0.1, 0.1], [0.2, 0.1, 0.1]], dtype=np.float32)) -method_1 = ('bruteforce', 'pkdtree') +method_1 = ('bruteforce', 'pkdtree', 'nsgrid') min_cutoff_1 = (None, 0.1) @@ -77,6 +77,10 @@ def test_capped_distance_noresults(): @pytest.mark.parametrize('method', method_1) @pytest.mark.parametrize('min_cutoff', min_cutoff_1) def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): + if method == 'nsgrid' and box is None: + pytest.skip('Not implemented yet') + + np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(npoints, 3))*(boxes_1[0][:3])).astype(np.float32) @@ -89,6 +93,7 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): min_cutoff=min_cutoff, box=box, method=method) + if pairs.shape != (0, ): found_pairs = pairs[:, 1] else: diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index 0fc6e1ec880..3e8ca02d3fe 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -43,7 +43,7 @@ def run_grid_search(u, ids, cutoff=3): coords = u.atoms.positions # Run grid search - searcher = nsgrid.FastNS(u, cutoff, coords, debug=True) + searcher = nsgrid.FastNS(u.dimensions, cutoff, coords, debug=True) return searcher.search(ids) @@ -156,7 +156,7 @@ def test_nsgrid_PBC_rect(): cutoff = 7 # FastNS is called differently to max coverage - searcher = nsgrid.FastNS(universe, cutoff, prepare=False) + searcher = nsgrid.FastNS(universe.dimensions, cutoff, universe.atoms.positions, prepare=False) results_grid = searcher.search([ref_id,]).get_indices()[0] # pass the id as a list for test+coverage purpose From 9d52ac91889628616e63a4709e8803abcd1e272a Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 26 Jul 2018 23:10:41 -0700 Subject: [PATCH 354/455] recovering accidently removed augment in setupd during rebase --- package/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/setup.py b/package/setup.py index 52d29fecc7c..9df60bb149e 100755 --- a/package/setup.py +++ b/package/setup.py @@ -389,7 +389,7 @@ def extensions(config): extra_link_args=parallel_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, - ap_clustering, spe_dimred, cutil, nsgrid] + ap_clustering, spe_dimred, cutil, augment, nsgrid] cython_generated = [] From 8b8ea74933f9e2405ed8fb9a91d67012e596f032 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 28 Jul 2018 12:16:50 -0700 Subject: [PATCH 355/455] corrected name in documentation --- package/doc/sphinx/source/documentation_pages/lib/grid.rst | 2 -- package/doc/sphinx/source/documentation_pages/lib/nsgrid.rst | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 package/doc/sphinx/source/documentation_pages/lib/grid.rst create mode 100644 package/doc/sphinx/source/documentation_pages/lib/nsgrid.rst diff --git a/package/doc/sphinx/source/documentation_pages/lib/grid.rst b/package/doc/sphinx/source/documentation_pages/lib/grid.rst deleted file mode 100644 index a6143e9ca38..00000000000 --- a/package/doc/sphinx/source/documentation_pages/lib/grid.rst +++ /dev/null @@ -1,2 +0,0 @@ -.. automodule:: MDAnalysis.lib.grid - :members: \ No newline at end of file diff --git a/package/doc/sphinx/source/documentation_pages/lib/nsgrid.rst b/package/doc/sphinx/source/documentation_pages/lib/nsgrid.rst new file mode 100644 index 00000000000..f36f2480b0b --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/lib/nsgrid.rst @@ -0,0 +1,2 @@ +.. automodule:: MDAnalysis.lib.nsgrid + :members: \ No newline at end of file From e71b671af47353915ea50e849b0b8c7fd08cee04 Mon Sep 17 00:00:00 2001 From: ayush Date: Sat, 28 Jul 2018 14:32:16 -0700 Subject: [PATCH 356/455] minor corrections to remove pylint error --- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index 3e8ca02d3fe..db623fedb95 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -112,11 +112,13 @@ def test_nsgrid_badinit(): with pytest.raises(TypeError): nsgrid.FastNS(None, 1) + def test_nsgrid_badcutoff(universe): with pytest.raises(ValueError): run_grid_search(universe, 0, -4) run_grid_search(universe, 0, 100000) + def test_ns_grid_noneighbor(universe): """Check that grid search returns empty lists/arrays when there is no neighbors""" ref_id = 0 @@ -158,10 +160,10 @@ def test_nsgrid_PBC_rect(): # FastNS is called differently to max coverage searcher = nsgrid.FastNS(universe.dimensions, cutoff, universe.atoms.positions, prepare=False) - results_grid = searcher.search([ref_id,]).get_indices()[0] # pass the id as a list for test+coverage purpose + results_grid = searcher.search([ref_id, ]).get_indices()[0] # pass the id as a list for test+coverage purpose searcher.prepare() # Does nothing, called here for coverage - results_grid2 = searcher.search().get_indices() # call without specifying any ids, should do NS for all beads + results_grid2 = searcher.search().get_indices() # call without specifying any ids, should do NS for all beads assert_equal(results, results_grid) assert_equal(len(universe.atoms), len(results_grid2)) @@ -181,7 +183,6 @@ def test_nsgrid_PBC(universe): assert_equal(results, results_grid) - def test_nsgrid_pairs(universe): """Check that grid search returns the proper pairs""" @@ -258,4 +259,3 @@ def test_nsgrid_coordinates(universe): results_grid = run_grid_search(universe, ref_id).get_coordinates()[0] assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) - From a5d1355f90793a376642feed8b8611769d081c16 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 31 Jul 2018 02:45:55 -0700 Subject: [PATCH 357/455] Used vectors in place of lists and dict, cleaned code and modified function to take coordinates as input, modified tests accordingly --- package/MDAnalysis/lib/nsgrid.pyx | 510 ++++++++----------- package/setup.py | 3 +- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 88 ++-- 3 files changed, 256 insertions(+), 345 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index f38e8e143c4..ffb240e2f0a 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -43,25 +43,26 @@ DEF ZZ = 2 DEF EPSILON = 1e-5 -DEF BOX_MARGIN=1.0010 -DEF MAX_NTRICVEC=12 - -DEF OK=0 -DEF ERROR=1 # Used to handle memory allocation from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free from libc.math cimport sqrt import numpy as np cimport numpy as np +from libcpp.vector cimport vector +from libcpp.map cimport map as cmap + ctypedef np.int_t ns_int ctypedef np.float32_t real ctypedef real rvec[DIM] ctypedef ns_int ivec[DIM] -ctypedef ns_int ipair[2] ctypedef real matrix[DIM][DIM] +ctypedef vector[ns_int] intvec +ctypedef cmap[ns_int, intvec] intmap +ctypedef vector[real] realvec +ctypedef cmap[ns_int, realvec] realmap # Useful Functions cdef real rvec_norm2(const rvec a) nogil: @@ -86,34 +87,25 @@ cdef struct cPBCBox_t: # Class to handle PBC calculations cdef class PBCBox(object): cdef cPBCBox_t c_pbcbox - cdef rvec center - cdef rvec bbox_center cdef bint is_triclinic def __init__(self, real[:,::1] box): self.update(box) cdef void fast_update(self, real[:,::1] box) nogil: - cdef ns_int i, j, k, d, jc, kc, shift - cdef real d2old, d2new, d2new_c - cdef rvec trial, pos - cdef ns_int ii, jj ,kk - cdef ns_int *order = [0, -1, 1, -2, 2] - cdef bint use + + cdef ns_int i, j cdef real min_hv2, min_ss, tmp - rvec_clear(self.center) # Update matrix self.is_triclinic = False for i in range(DIM): for j in range(DIM): self.c_pbcbox.box[i][j] = box[i, j] - self.center[j] += 0.5 * box[i, j] if i != j: if box[i, j] > EPSILON: self.is_triclinic = True - self.bbox_center[i] = 0.5 * box[i, i] # Update diagonals for i in range(DIM): @@ -151,8 +143,8 @@ cdef class PBCBox(object): cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: + cdef ns_int i, j - cdef rvec dx_start, trial for i in range(DIM): dx[i] = other[i] - ref[i] @@ -170,9 +162,7 @@ cdef class PBCBox(object): cdef rvec dx if a.shape[0] != DIM or b.shape[0] != DIM: raise ValueError("Not 3 D coordinates") - self.fast_pbc_dx(&a[XX], &b[XX], dx) - return np.array([dx[XX], dx[YY], dx[ZZ]], dtype=np.float32) @@ -193,9 +183,9 @@ cdef class PBCBox(object): if a.shape[0] != DIM or b.shape[0] != DIM: raise ValueError("Not 3 D coordinates") return self.fast_distance(&a[XX], &b[XX]) - + cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: - cdef ns_int i, m, d, natoms, wd = 0 + cdef ns_int i, m, d, natoms cdef real[:,::1] bbox_coords natoms = coords.shape[0] @@ -223,220 +213,108 @@ cdef class PBCBox(object): def put_atoms_in_bbox(self, real[:,::1] coords): return np.asarray(self.fast_put_atoms_in_bbox(coords)) - ######################### # Neighbor Search Stuff # ######################### + cdef class NSResults(object): cdef readonly real cutoff cdef ns_int npairs - cdef bint debug - - cdef real[:, ::1] coords # shape: size, DIM - cdef ns_int[:] search_ids - - cdef ns_int allocation_size - cdef ipair *pairs # shape: pair_allocation - cdef real *pair_distances2 # shape: pair_allocation - cdef list indices_buffer - cdef list coordinates_buffer - cdef list distances_buffer - cdef np.ndarray pairs_buffer - cdef np.ndarray pair_distances_buffer - cdef np.ndarray pair_coordinates_buffer - - def __init__(self, real cutoff, real[:, ::1]coords, ns_int[:] search_ids, debug=False): - self.debug = debug + cdef real[:, ::1] coords # shape: size, DIM + cdef real[:, ::1] searchcoords + + cdef intmap indices_buffer + cdef realmap distances_buffer + cdef vector[ns_int] pairs_buffer + cdef vector[real] pair_distances_buffer + cdef vector[real] pair_distances2_buffer + + def __init__(self, real cutoff, real[:, ::1]coords, real[:, ::1]searchcoords): self.cutoff = cutoff self.coords = coords - self.search_ids = search_ids + self.searchcoords = searchcoords # Preallocate memory - self.allocation_size = search_ids.shape[0] + 1 - if not self.pairs and not self.pair_distances2: - self.pairs = PyMem_Malloc(sizeof(ipair) * self.allocation_size) - if not self.pairs: - MemoryError("Could not allocate memory for NSResults.pairs " - "({} bits requested)".format(sizeof(ipair) * self.allocation_size)) - self.pair_distances2 = PyMem_Malloc(sizeof(real) * self.allocation_size) - if not self.pair_distances2: - raise MemoryError("Could not allocate memory for NSResults.pair_distances2 " - "({} bits requested)".format(sizeof(real) * self.allocation_size)) - else: - if self.resize(self.allocation_size) != OK: - raise MemoryError("foo") - self.npairs = 0 - - # Buffer - self.indices_buffer = None - self.coordinates_buffer = None - self.distances_buffer = None - self.pairs_buffer = None - self.pair_coordinates_buffer = None - - def __dealloc__(self): - PyMem_Free(self.pairs) - PyMem_Free(self.pair_distances2) - - cdef int add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: + + cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: # Important: If this function returns ERROR, it means that memory allocation failed - # Reallocate memory if needed - if self.npairs >= self.allocation_size: - # We need to reallocate memory - if self.resize(self.allocation_size + (self.allocation_size * 0.5 + 1)) != OK: - return ERROR - - # Actually store pair and distance squared - if beadid_i < beadid_j: - self.pairs[self.npairs][0] = beadid_i - self.pairs[self.npairs][1] = beadid_j - else: - self.pairs[self.npairs][1] = beadid_i - self.pairs[self.npairs][0] = beadid_j - self.pair_distances2[self.npairs] = distance2 + self.pairs_buffer.push_back(beadid_i) + self.pairs_buffer.push_back(beadid_j) + self.pair_distances2_buffer.push_back(distance2) self.npairs += 1 - - return OK - - cdef int resize(self, ns_int new_size) nogil: - # Important: If this function returns 0, it means that memory allocation failed - - if new_size < self.npairs: - # Silently ignored the request - return OK - - if self.allocation_size >= new_size: - if self.debug: - with gil: - print("NSresults: Reallocation requested but not needed ({} requested but {} already allocated)".format(new_size, self.allocation_size)) - return OK - - self.allocation_size = new_size - - if self.debug: - with gil: - print("NSresults: Reallocated to {} pairs".format(self.allocation_size)) - - # Allocating memory - with gil: - self.pairs = PyMem_Realloc(self.pairs, sizeof(ipair) * self.allocation_size) - self.pair_distances2 = PyMem_Realloc(self.pair_distances2, sizeof(real) * self.allocation_size) - - if not self.pairs: - return ERROR - - if not self.pair_distances2: - return ERROR - - return OK - + def get_pairs(self): - cdef ns_int i - - if self.pairs_buffer is None: - self.pairs_buffer = np.empty((self.npairs, 2), dtype=np.int) - for i in range(self.npairs): - self.pairs_buffer[i, 0] = self.pairs[i][0] - self.pairs_buffer[i, 1] = self.pairs[i][1] - return self.pairs_buffer + return np.asarray(self.pairs_buffer).reshape(self.npairs, 2) def get_pair_distances(self): - cdef ns_int i - if self.pair_coordinates_buffer is None: - self.pair_coordinates_buffer = np.empty(self.npairs, dtype=np.float32) - for i in range(self.npairs): - self.pair_coordinates_buffer[i] = self.pair_distances2[i] - self.pair_coordinates_buffer = np.sqrt(self.pair_coordinates_buffer) - return self.pair_coordinates_buffer - - def get_pair_coordinates(self): - cdef ns_int i, j, bead_i, bead_j - if self.pair_coordinates_buffer is None: - self.pair_coordinates_buffer = np.empty((self.npairs, 2, DIM), dtype=np.float32) - for i in range(self.npairs): - bead_i = self.pairs[i][0] - bead_j = self.pairs[i][1] - - for j in range(DIM): - self.pair_coordinates_buffer[i, 0, j] = self.coords[bead_i, j] - self.pair_coordinates_buffer[i, 1, j] = self.coords[bead_j, j] - return self.pair_coordinates_buffer - + self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) + return np.asarray(self.pair_distances_buffer) + cdef create_buffers(self): cdef ns_int i, beadid_i, beadid_j + cdef ns_int idx, nsearch cdef real dist2 - cdef real[:] coord_i, coord_j - from collections import defaultdict - - indices_buffer = defaultdict(list) - coords_buffer = defaultdict(list) - dists_buffer = defaultdict(list) - - for i in range(self.npairs): - beadid_i = self.pairs[i][0] - beadid_j = self.pairs[i][1] - - dist2 = self.pair_distances2[i] - coord_i = self.coords[beadid_i] - coord_j = self.coords[beadid_j] - - indices_buffer[beadid_i].append(beadid_j) - indices_buffer[beadid_j].append(beadid_i) - - coords_buffer[beadid_i].append(coord_j) - coords_buffer[beadid_j].append((coord_i)) - - dists_buffer[beadid_i].append(dist2) - dists_buffer[beadid_j].append(dist2) - - self.indices_buffer = [] - self.coordinates_buffer = [] - self.distances_buffer = [] - - for elm in self.search_ids: - sorted_indices = np.argsort(indices_buffer[elm]) - self.indices_buffer.append(np.array(indices_buffer[elm])[sorted_indices]) - self.coordinates_buffer.append(np.array(coords_buffer[elm])[sorted_indices]) - self.distances_buffer.append(np.sqrt(dists_buffer[elm])[sorted_indices]) - + + nsearch = len(self.searchcoords) + + cdef intmap indices_buffer + cdef realmap distances_buffer + + for i in range(0, 2*self.npairs, 2): + beadid_i = self.pairs_buffer[i] + beadid_j = self.pairs_buffer[i + 1] + + dist2 = self.pair_distances2_buffer[i//2] + + indices_buffer[beadid_i].push_back(beadid_j) + + dist = sqrt(dist2) + + distances_buffer[beadid_i].push_back(dist) + + self.indices_buffer.clear() + self.distances_buffer.clear() + + for idx in range(nsearch): + sorted_indices = np.argsort(indices_buffer[idx]) + self.indices_buffer.insert((idx, intvec())) + self.distances_buffer.insert((idx, realvec())) + for index in sorted_indices: + self.indices_buffer[idx].push_back(indices_buffer[idx][index]) + self.distances_buffer[idx].push_back(distances_buffer[idx][index]) + + def get_indices(self): - if self.indices_buffer is None: + if self.indices_buffer.empty(): self.create_buffers() return self.indices_buffer def get_distances(self): - if self.distances_buffer is None: + if self.distances_buffer.empty(): self.create_buffers() return self.distances_buffer - - def get_coordinates(self): - if self.coordinates_buffer is None: - self.create_buffers() - return self.coordinates_buffer - - - + cdef class NSGrid(object): - cdef bint debug - cdef readonly real cutoff - cdef ns_int size - cdef ns_int ncoords - cdef ns_int[DIM] ncells - cdef ns_int[DIM] cell_offsets - cdef real[DIM] cellsize - cdef ns_int nbeads_per_cell - cdef ns_int *nbeads # size - cdef ns_int *beadids # size * nbeads_per_cell - cdef ns_int *cellids # ncoords - - def __init__(self, ncoords, cutoff, PBCBox box, max_size, debug=False): - cdef ns_int i, x, y, z + cdef readonly real cutoff # cutoff + cdef ns_int size # total cells + cdef ns_int ncoords # number of coordinates + cdef ns_int[DIM] ncells # individual cells in every dimension + cdef ns_int[DIM] cell_offsets # Cell Multipliers + cdef real[DIM] cellsize # cell size in every dimension + cdef ns_int nbeads_per_cell # maximum beads + cdef ns_int *nbeads # size (Number of beads in every cell) + cdef ns_int *beadids # size * nbeads_per_cell (Beadids in every cell) + cdef ns_int *cellids # ncoords (Cell occupation id for every atom) + + def __init__(self, ncoords, cutoff, PBCBox box, max_size): + cdef ns_int i cdef ns_int ncellx, ncelly, ncellz, size, nbeadspercell + cdef ns_int xi, yi, zi cdef real bbox_vol - self.debug = debug + self.ncoords = ncoords @@ -449,18 +327,10 @@ cdef class NSGrid(object): self.cutoff *= 1.2 for i in range(DIM): - self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) - if self.ncells[i] == 0: - self.ncells[i] = 1 + self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff + 1) self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] - if self.debug: - print("NSGrid: Requested cutoff: {:.3f} (Ncells={}, Avg # of beads per cell={}), Optimized cutoff= {:.3f} (Ncells={}, Avg # of beads per cell={})".format( - cutoff, size, nbeadspercell, - self.cutoff, self.size, (ncoords / self.size) - )) - print("NSGrid: Size={}x{}x{}={}".format(self.ncells[XX], self.ncells[YY], self.ncells[ZZ], self.size)) self.cell_offsets[XX] = 0 self.cell_offsets[YY] = self.ncells[XX] @@ -478,15 +348,15 @@ cdef class NSGrid(object): for i in range(self.size): self.nbeads[i] = 0 - + def __dealloc__(self): PyMem_Free(self.nbeads) PyMem_Free(self.beadids) PyMem_Free(self.cellids) cdef ns_int coord2cellid(self, rvec coord) nogil: - return (coord[ZZ] / self.cellsize[ZZ]) * (self.ncells[XX] * self.ncells[YY]) +\ - (coord[YY] / self.cellsize[YY]) * self.ncells[XX] + \ + return (coord[ZZ] / self.cellsize[ZZ]) * (self.cell_offsets[ZZ]) +\ + (coord[YY] / self.cellsize[YY]) * self.cell_offsets[YY] + \ (coord[XX] / self.cellsize[XX]) cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: @@ -540,125 +410,171 @@ cdef class NSGrid(object): cdef class FastNS(object): - cdef bint debug + cdef PBCBox box cdef real[:, ::1] coords cdef real[:, ::1] coords_bbox + cdef real[:, ::1] searchcoords + cdef real[:, ::1] searchcoords_bbox cdef readonly real cutoff cdef bint prepared cdef NSGrid grid + cdef NSGrid searchgrid + cdef ns_int max_gridsize + cdef intmap cell_neighbors + - def __init__(self, box, cutoff, coords, prepare=True, debug=False, max_gridsize=5000): + def __init__(self, box, cutoff, coords, prepare=True, max_gridsize=5000): import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors - self.debug = debug if box.shape != (3,3): box = triclinic_vectors(box) self.box = PBCBox(box) - - #if coords is None: - # coords = u.atoms.positions - - self.coords = coords.copy() - - self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) - if cutoff < 0: raise ValueError("Cutoff must be positive!") if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") - self.cutoff = cutoff + + self.coords = coords.copy() - self.grid = NSGrid(self.coords_bbox.shape[0], cutoff, self.box, max_gridsize, debug=debug) - self.prepared = False - if prepare: - self.prepare() + self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) - def prepare(self, force=False): - if self.prepared and not force: - return + self.cutoff = cutoff + self.max_gridsize = max_gridsize + self.grid = NSGrid(self.coords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) + self.grid.fill_grid(self.coords_bbox) - self.prepared = True + - def search(self, search_ids=None): + def search(self, searchcoords): cdef ns_int i, j, size_search cdef ns_int d, m + cdef ns_int ncells # Total number of cells + cdef ns_int current_beadid, bid + cdef ns_int cellindex, cellindex_probe + cdef ns_int xi, yi, zi + cdef NSResults results - cdef ns_int size = self.coords_bbox.shape[0] + + cdef ivec cellxyz + + cdef real d2 + cdef rvec probe - cdef ns_int current_beadid, bid - cdef rvec current_coords + ncells = self.grid.size + cdef ns_int[:] checked = np.zeros(ncells, dtype=np.int) + + cdef real cutoff2 = self.cutoff * self.cutoff + cdef ns_int npairs = 0 + + # Generate another grid to search + self.searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) + self.searchgrid = NSGrid(self.searchcoords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) + #cdef ns_int size = self.searchcoords_bbox.shape[0] + + + + size_search = searchcoords.shape[0] + + results = NSResults(self.cutoff, self.coords, searchcoords) - cdef ns_int cellindex, cellindex_adjacent, cellindex_probe - cdef ivec cellxyz, debug_cellxyz + with nogil: + for i in range(size_search): + for m in range(ncells): + checked[m] = 0 + # Start with first search coordinate + current_beadid = i + # find the cellindex of the coordinate + cellindex = self.searchgrid.cellids[current_beadid] + # Find the actual position of cell + self.searchgrid.cellid2cellxyz(cellindex, cellxyz) + for xi in range(DIM): + for yi in range(DIM): + for zi in range(DIM): + #Probe the search coordinates in a brick shaped box + probe[XX] = self.searchcoords_bbox[current_beadid, XX] + (xi - 1) * self.cutoff + probe[YY] = self.searchcoords_bbox[current_beadid, YY] + (yi - 1) * self.cutoff + probe[ZZ] = self.searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * self.cutoff + # Make sure the shifted coordinates is inside the brick-shaped box + for m in range(DIM - 1, -1, -1): + while probe[m] < 0: + for d in range(m+1): + probe[d] += self.box.c_pbcbox.box[m][d] + while probe[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + probe[d] -= self.box.c_pbcbox.box[m][d] + # Get the cell index corresponding to the probe + cellindex_probe = self.grid.coord2cellid(probe) + if checked[cellindex_probe] != 0: + continue + #for this cellindex search in grid + for j in range(self.grid.nbeads[cellindex_probe]): + bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + #find distance between search coords[i] and coords[bid] + d2 = self.box.fast_distance2(&self.searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + if d2 < cutoff2: + if d2 < EPSILON: + continue + else: + results.add_neighbors(current_beadid, bid, d2) + npairs += 1 + checked[cellindex_probe] = 1 + return results - cdef real[:, ::1] search_coords - cdef ns_int[:] search_ids_view + def self_search(self): + cdef ns_int i, j, size_search + cdef ns_int d, m + cdef ns_int ncells # Total number of cells + cdef ns_int current_beadid, bid + cdef ns_int cellindex, cellindex_probe cdef ns_int xi, yi, zi + + cdef NSResults results + + + + cdef ivec cellxyz + cdef real d2 - cdef rvec shifted_coord, probe, dx + cdef rvec probe - cdef ns_int nchecked = 0 - cdef ns_int[:] checked = np.zeros(size, dtype=np.int) + ncells = self.grid.size + cdef ns_int[:] checked = np.zeros(ncells, dtype=np.int) cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int npairs = 0 - if not self.prepared: - self.prepare() - - if search_ids is None: - search_ids=np.arange(size) - elif type(search_ids) == np.int: - search_ids = np.array([search_ids,], dtype=np.int) - elif type(search_ids) != np.ndarray: - search_ids = np.array(search_ids, dtype=np.int) + size_search = self.coords.shape[0] - search_ids_view = search_ids - size_search = search_ids.shape[0] - - results = NSResults(self.cutoff, self.coords, search_ids, self.debug) - - cdef bint memory_error = False + results = NSResults(self.cutoff, self.coords, self.coords) with nogil: for i in range(size_search): - if memory_error: - break - current_beadid = search_ids_view[i] + for m in range(ncells): + checked[m] = 0 + # Start with first search coordinate + current_beadid = i + # find the cellindex of the coordinate cellindex = self.grid.cellids[current_beadid] + # Find the actual position of cell self.grid.cellid2cellxyz(cellindex, cellxyz) for xi in range(DIM): - if memory_error: - break - for yi in range(DIM): - if memory_error: - break + for yi in range(DIM): for zi in range(DIM): - if memory_error: - break # Calculate and/or reinitialize shifted coordinates - shifted_coord[XX] = self.coords[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] - shifted_coord[YY] = self.coords[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] - shifted_coord[ZZ] = self.coords[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] - probe[XX] = self.coords[current_beadid, XX] + (xi - 1) * self.cutoff - probe[YY] = self.coords[current_beadid, YY] + (yi - 1) * self.cutoff - probe[ZZ] = self.coords[current_beadid, ZZ] + (zi - 1) * self.cutoff + #Probe the search coordinates in a brick shaped box + probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.cutoff + probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.cutoff + probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.cutoff # Make sure the shifted coordinates is inside the brick-shaped box for m in range(DIM - 1, -1, -1): - while shifted_coord[m] < 0: - for d in range(m+1): - shifted_coord[d] += self.box.c_pbcbox.box[m][d] - while shifted_coord[m] >= self.box.c_pbcbox.box[m][m]: - for d in range(m+1): - shifted_coord[d] -= self.box.c_pbcbox.box[m][d] while probe[m] < 0: for d in range(m+1): probe[d] += self.box.c_pbcbox.box[m][d] @@ -666,23 +582,23 @@ cdef class FastNS(object): for d in range(m+1): probe[d] -= self.box.c_pbcbox.box[m][d] - # Get the cell index corresponding to the coord - cellindex_adjacent = self.grid.coord2cellid(shifted_coord) + # Get the cell index corresponding to the probe cellindex_probe = self.grid.coord2cellid(probe) - - for j in range(self.grid.nbeads[cellindex_adjacent]): - bid = self.grid.beadids[cellindex_adjacent * self.grid.nbeads_per_cell + j] - if checked[bid] != 0: + if checked[cellindex_probe] != 0: + continue + #for this cellindex search in grid + for j in range(self.grid.nbeads[cellindex_probe]): + bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + if bid > current_beadid: continue + #find distance between search coords[i] and coords[bid] d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) if d2 < cutoff2: if d2 < EPSILON: continue - elif results.add_neighbors(current_beadid, bid, d2) != OK: - memory_error = True - break + else: + results.add_neighbors(current_beadid, bid, d2) + results.add_neighbors(bid, current_beadid, d2) npairs += 1 - checked[current_beadid] = 1 - if memory_error: - raise MemoryError("Could not allocate memory to store NS results") + checked[cellindex_probe] = 1 return results diff --git a/package/setup.py b/package/setup.py index 9df60bb149e..fe2e8bb7d1c 100755 --- a/package/setup.py +++ b/package/setup.py @@ -383,7 +383,8 @@ def extensions(config): nsgrid = MDAExtension('MDAnalysis.lib.nsgrid', ['MDAnalysis/lib/nsgrid' + source_suffix], include_dirs=include_dirs, - libraries=mathlib + parallel_libraries, + language='c++', + libraries=parallel_libraries, define_macros=define_macros + parallel_macros, extra_compile_args=extra_compile_args + parallel_args, extra_link_args=parallel_args) diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index db623fedb95..2808d1247aa 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -39,13 +39,14 @@ def universe(): -def run_grid_search(u, ids, cutoff=3): +def run_grid_search(u, searchcoords, cutoff=3): coords = u.atoms.positions - + if searchcoords.shape == (3, ): + searchcoords = searchcoords[None, :] # Run grid search - searcher = nsgrid.FastNS(u.dimensions, cutoff, coords, debug=True) + searcher = nsgrid.FastNS(u.dimensions, cutoff, coords) - return searcher.search(ids) + return searcher.search(searchcoords) def test_pbc_badbox(): @@ -115,8 +116,8 @@ def test_nsgrid_badinit(): def test_nsgrid_badcutoff(universe): with pytest.raises(ValueError): - run_grid_search(universe, 0, -4) - run_grid_search(universe, 0, 100000) + run_grid_search(universe, universe.atoms.positions[0], -4) + run_grid_search(universe, universe.atoms.positions[0], 100000) def test_ns_grid_noneighbor(universe): @@ -124,14 +125,12 @@ def test_ns_grid_noneighbor(universe): ref_id = 0 cutoff = 0.5 - results_grid = run_grid_search(universe, ref_id, cutoff) + results_grid = run_grid_search(universe, universe.atoms.positions[ref_id], cutoff) - assert len(results_grid.get_coordinates()[0]) == 0 assert len(results_grid.get_distances()[0]) == 0 assert len(results_grid.get_indices()[0]) == 0 assert len(results_grid.get_pairs()) == 0 assert len(results_grid.get_pair_distances()) == 0 - assert len(results_grid.get_pair_coordinates()) == 0 def test_nsgrid_noPBC(universe): @@ -143,7 +142,7 @@ def test_nsgrid_noPBC(universe): results = np.array([2, 3, 4, 5, 6, 7, 8, 9, 18, 19, 1211, 10862, 10865, 17582, 17585, 38342, 38345]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - results_grid = run_grid_search(universe, ref_id, cutoff).get_indices()[0] + results_grid = run_grid_search(universe, universe.atoms.positions[ref_id], cutoff).get_indices()[0] assert_equal(results, results_grid) @@ -158,12 +157,11 @@ def test_nsgrid_PBC_rect(): cutoff = 7 # FastNS is called differently to max coverage - searcher = nsgrid.FastNS(universe.dimensions, cutoff, universe.atoms.positions, prepare=False) + searcher = nsgrid.FastNS(universe.dimensions, cutoff, universe.atoms.positions) - results_grid = searcher.search([ref_id, ]).get_indices()[0] # pass the id as a list for test+coverage purpose + results_grid = searcher.search(universe.atoms.positions[ref_id][None, :]).get_indices()[0] # pass the id as a list for test+coverage purpose - searcher.prepare() # Does nothing, called here for coverage - results_grid2 = searcher.search().get_indices() # call without specifying any ids, should do NS for all beads + results_grid2 = searcher.search(universe.atoms.positions).get_indices() # call without specifying any ids, should do NS for all beads assert_equal(results, results_grid) assert_equal(len(universe.atoms), len(results_grid2)) @@ -178,7 +176,7 @@ def test_nsgrid_PBC(universe): results = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - results_grid = run_grid_search(universe, ref_id).get_indices()[0] + results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_indices()[0] assert_equal(results, results_grid) @@ -190,16 +188,12 @@ def test_nsgrid_pairs(universe): neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! results = [] - for nid in neighbors: - if nid < ref_id: - results.append([nid, ref_id]) - else: - results.append([ref_id, nid]) + results = np.array(results) - results_grid = run_grid_search(universe, ref_id).get_pairs() + results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_pairs() - assert_equal(np.sort(results, axis=0), np.sort(results_grid, axis=0)) + assert_equal(np.sort(neighbors, axis=0), np.sort(results_grid[:, 1], axis=0)) def test_nsgrid_pair_distances(universe): @@ -209,30 +203,30 @@ def test_nsgrid_pair_distances(universe): results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm - results_grid = run_grid_search(universe, ref_id).get_pair_distances() + results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_pair_distances() assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) -def test_nsgrid_pair_coordinates(universe): - """Check that grid search return the proper pair coordinates""" +# def test_nsgrid_pair_coordinates(universe): +# """Check that grid search return the proper pair coordinates""" - ref_id = 13937 - neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, - 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - coords = universe.atoms.positions +# ref_id = 13937 +# neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, +# 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! +# coords = universe.atoms.positions - results = [] - for nid in neighbors: - if nid < ref_id: - results.append([coords[nid], coords[ref_id]]) - else: - results.append([coords[ref_id], coords[nid]]) - results = np.array(results) +# results = [] +# for nid in neighbors: +# if nid < ref_id: +# results.append([coords[nid], coords[ref_id]]) +# else: +# results.append([coords[ref_id], coords[nid]]) +# results = np.array(results) - results_grid = run_grid_search(universe, ref_id).get_pair_coordinates() +# results_grid = run_grid_search(universe, ref_id).get_pair_coordinates() - assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) +# assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) def test_nsgrid_distances(universe): @@ -242,20 +236,20 @@ def test_nsgrid_distances(universe): results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm - results_grid = run_grid_search(universe, ref_id).get_distances()[0] + results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_distances()[0] assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) -def test_nsgrid_coordinates(universe): - """Check that grid search return the proper coordinates""" +# def test_nsgrid_coordinates(universe): +# """Check that grid search return the proper coordinates""" - ref_id = 13937 - neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, - 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! +# ref_id = 13937 +# neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, +# 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - results = universe.atoms.positions[neighbors] +# results = universe.atoms.positions[neighbors] - results_grid = run_grid_search(universe, ref_id).get_coordinates()[0] +# results_grid = run_grid_search(universe, ref_id).get_coordinates()[0] - assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) +# assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) From 46f9030e95d261e89d8645c9e8262ce6934d7b5e Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 31 Jul 2018 15:57:42 -0700 Subject: [PATCH 358/455] removed dict from buffers for speedup and modified tests --- package/MDAnalysis/lib/nsgrid.pyx | 131 ++++++++----------- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 54 ++------ 2 files changed, 64 insertions(+), 121 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index ffb240e2f0a..8598bec1e97 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -50,7 +50,6 @@ from libc.math cimport sqrt import numpy as np cimport numpy as np from libcpp.vector cimport vector -from libcpp.map cimport map as cmap ctypedef np.int_t ns_int @@ -60,9 +59,7 @@ ctypedef ns_int ivec[DIM] ctypedef real matrix[DIM][DIM] ctypedef vector[ns_int] intvec -ctypedef cmap[ns_int, intvec] intmap ctypedef vector[real] realvec -ctypedef cmap[ns_int, realvec] realmap # Useful Functions cdef real rvec_norm2(const rvec a) nogil: @@ -224,8 +221,8 @@ cdef class NSResults(object): cdef real[:, ::1] coords # shape: size, DIM cdef real[:, ::1] searchcoords - cdef intmap indices_buffer - cdef realmap distances_buffer + cdef vector[intvec] indices_buffer + cdef vector[realvec] distances_buffer cdef vector[ns_int] pairs_buffer cdef vector[real] pair_distances_buffer cdef vector[real] pair_distances2_buffer @@ -235,7 +232,6 @@ cdef class NSResults(object): self.coords = coords self.searchcoords = searchcoords - # Preallocate memory self.npairs = 0 cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: @@ -260,8 +256,14 @@ cdef class NSResults(object): nsearch = len(self.searchcoords) - cdef intmap indices_buffer - cdef realmap distances_buffer + self.indices_buffer = vector[intvec]() + self.distances_buffer = vector[realvec]() + + # initialize rows corresponding to search + for i in range(nsearch): + self.indices_buffer.push_back(intvec()) + self.distances_buffer.push_back(realvec()) + for i in range(0, 2*self.npairs, 2): beadid_i = self.pairs_buffer[i] @@ -269,33 +271,27 @@ cdef class NSResults(object): dist2 = self.pair_distances2_buffer[i//2] - indices_buffer[beadid_i].push_back(beadid_j) + self.indices_buffer[beadid_i].push_back(beadid_j) dist = sqrt(dist2) - distances_buffer[beadid_i].push_back(dist) + self.distances_buffer[beadid_i].push_back(dist) - self.indices_buffer.clear() - self.distances_buffer.clear() + for i in range(self.searchcoords.shape[0]): + sorted_indices = np.argsort(self.indices_buffer[i]) + self.indices_buffer[i] = np.array(self.indices_buffer[i])[sorted_indices] + self.distances_buffer[i] = np.array(self.distances_buffer[i])[sorted_indices] - for idx in range(nsearch): - sorted_indices = np.argsort(indices_buffer[idx]) - self.indices_buffer.insert((idx, intvec())) - self.distances_buffer.insert((idx, realvec())) - for index in sorted_indices: - self.indices_buffer[idx].push_back(indices_buffer[idx][index]) - self.distances_buffer[idx].push_back(distances_buffer[idx][index]) - def get_indices(self): if self.indices_buffer.empty(): self.create_buffers() - return self.indices_buffer + return np.asarray(self.indices_buffer) def get_distances(self): if self.distances_buffer.empty(): self.create_buffers() - return self.distances_buffer + return np.asarray(self.distances_buffer) cdef class NSGrid(object): cdef readonly real cutoff # cutoff @@ -308,8 +304,9 @@ cdef class NSGrid(object): cdef ns_int *nbeads # size (Number of beads in every cell) cdef ns_int *beadids # size * nbeads_per_cell (Beadids in every cell) cdef ns_int *cellids # ncoords (Cell occupation id for every atom) + cdef bint force # To negate the effects of optimized cutoff - def __init__(self, ncoords, cutoff, PBCBox box, max_size): + def __init__(self, ncoords, cutoff, PBCBox box, max_size, force=False): cdef ns_int i cdef ns_int ncellx, ncelly, ncellz, size, nbeadspercell cdef ns_int xi, yi, zi @@ -320,14 +317,15 @@ cdef class NSGrid(object): # Calculate best cutoff self.cutoff = cutoff - bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] - size = bbox_vol/cutoff**3 - nbeadspercell = ncoords/size - while bbox_vol/self.cutoff**3 > max_size: - self.cutoff *= 1.2 + if not force: + bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + size = bbox_vol/cutoff**3 + nbeadspercell = ncoords/size + while bbox_vol/self.cutoff**3 > max_size: + self.cutoff *= 1.2 for i in range(DIM): - self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff + 1) + self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] @@ -414,17 +412,12 @@ cdef class FastNS(object): cdef PBCBox box cdef real[:, ::1] coords cdef real[:, ::1] coords_bbox - cdef real[:, ::1] searchcoords - cdef real[:, ::1] searchcoords_bbox cdef readonly real cutoff - cdef bint prepared cdef NSGrid grid - cdef NSGrid searchgrid cdef ns_int max_gridsize - cdef intmap cell_neighbors - def __init__(self, box, cutoff, coords, prepare=True, max_gridsize=5000): + def __init__(self, box, cutoff, coords, max_gridsize=5000): import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors @@ -445,39 +438,39 @@ cdef class FastNS(object): self.cutoff = cutoff self.max_gridsize = max_gridsize - + # Note that self.cutoff might be different from self.grid.cutoff self.grid = NSGrid(self.coords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) self.grid.fill_grid(self.coords_bbox) - def search(self, searchcoords): + def search(self, search_coords): cdef ns_int i, j, size_search cdef ns_int d, m - cdef ns_int ncells # Total number of cells cdef ns_int current_beadid, bid cdef ns_int cellindex, cellindex_probe cdef ns_int xi, yi, zi cdef NSResults results - cdef ivec cellxyz - cdef real d2 cdef rvec probe - ncells = self.grid.size - cdef ns_int[:] checked = np.zeros(ncells, dtype=np.int) + cdef real[:, ::1] searchcoords + cdef real[:, ::1] searchcoords_bbox + cdef NSGrid searchgrid + ncells = self.grid.size + cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int npairs = 0 # Generate another grid to search - self.searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) - self.searchgrid = NSGrid(self.searchcoords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) - #cdef ns_int size = self.searchcoords_bbox.shape[0] - + searchcoords = np.array(search_coords, dtype=np.float32) + searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) + searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) + searchgrid.fill_grid(searchcoords_bbox) size_search = searchcoords.shape[0] @@ -486,22 +479,18 @@ cdef class FastNS(object): with nogil: for i in range(size_search): - for m in range(ncells): - checked[m] = 0 # Start with first search coordinate current_beadid = i # find the cellindex of the coordinate - cellindex = self.searchgrid.cellids[current_beadid] - # Find the actual position of cell - self.searchgrid.cellid2cellxyz(cellindex, cellxyz) + cellindex = searchgrid.cellids[current_beadid] for xi in range(DIM): for yi in range(DIM): for zi in range(DIM): #Probe the search coordinates in a brick shaped box - probe[XX] = self.searchcoords_bbox[current_beadid, XX] + (xi - 1) * self.cutoff - probe[YY] = self.searchcoords_bbox[current_beadid, YY] + (yi - 1) * self.cutoff - probe[ZZ] = self.searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * self.cutoff - # Make sure the shifted coordinates is inside the brick-shaped box + probe[XX] = searchcoords[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] + probe[YY] = searchcoords[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] + probe[ZZ] = searchcoords[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] + # Make sure the probe coordinates is inside the brick-shaped box for m in range(DIM - 1, -1, -1): while probe[m] < 0: for d in range(m+1): @@ -511,43 +500,36 @@ cdef class FastNS(object): probe[d] -= self.box.c_pbcbox.box[m][d] # Get the cell index corresponding to the probe cellindex_probe = self.grid.coord2cellid(probe) - if checked[cellindex_probe] != 0: - continue #for this cellindex search in grid for j in range(self.grid.nbeads[cellindex_probe]): bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] #find distance between search coords[i] and coords[bid] - d2 = self.box.fast_distance2(&self.searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) if d2 < cutoff2: if d2 < EPSILON: continue else: results.add_neighbors(current_beadid, bid, d2) npairs += 1 - checked[cellindex_probe] = 1 return results def self_search(self): cdef ns_int i, j, size_search cdef ns_int d, m - cdef ns_int ncells # Total number of cells cdef ns_int current_beadid, bid cdef ns_int cellindex, cellindex_probe cdef ns_int xi, yi, zi + cdef NSResults results - - - - cdef ivec cellxyz + + cdef ns_int size = self.coords_bbox.shape[0] + cdef ns_int[:] checked = np.zeros(size, dtype=np.int) cdef real d2 cdef rvec probe - ncells = self.grid.size - cdef ns_int[:] checked = np.zeros(ncells, dtype=np.int) - cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int npairs = 0 @@ -557,22 +539,18 @@ cdef class FastNS(object): with nogil: for i in range(size_search): - for m in range(ncells): - checked[m] = 0 # Start with first search coordinate current_beadid = i # find the cellindex of the coordinate cellindex = self.grid.cellids[current_beadid] - # Find the actual position of cell - self.grid.cellid2cellxyz(cellindex, cellxyz) for xi in range(DIM): for yi in range(DIM): for zi in range(DIM): # Calculate and/or reinitialize shifted coordinates #Probe the search coordinates in a brick shaped box - probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.cutoff - probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.cutoff - probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.cutoff + probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] + probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[XX] + probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[XX] # Make sure the shifted coordinates is inside the brick-shaped box for m in range(DIM - 1, -1, -1): while probe[m] < 0: @@ -584,12 +562,10 @@ cdef class FastNS(object): # Get the cell index corresponding to the probe cellindex_probe = self.grid.coord2cellid(probe) - if checked[cellindex_probe] != 0: - continue #for this cellindex search in grid for j in range(self.grid.nbeads[cellindex_probe]): bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] - if bid > current_beadid: + if bid < current_beadid: continue #find distance between search coords[i] and coords[bid] d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) @@ -600,5 +576,4 @@ cdef class FastNS(object): results.add_neighbors(current_beadid, bid, d2) results.add_neighbors(bid, current_beadid, d2) npairs += 1 - checked[cellindex_probe] = 1 return results diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index 2808d1247aa..a6b94784cfe 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -39,8 +39,9 @@ def universe(): -def run_grid_search(u, searchcoords, cutoff=3): +def run_grid_search(u, ref_id, cutoff=3): coords = u.atoms.positions + searchcoords = u.atoms.positions[ref_id] if searchcoords.shape == (3, ): searchcoords = searchcoords[None, :] # Run grid search @@ -116,8 +117,8 @@ def test_nsgrid_badinit(): def test_nsgrid_badcutoff(universe): with pytest.raises(ValueError): - run_grid_search(universe, universe.atoms.positions[0], -4) - run_grid_search(universe, universe.atoms.positions[0], 100000) + run_grid_search(universe, 0, -4) + run_grid_search(universe, 0, 100000) def test_ns_grid_noneighbor(universe): @@ -125,7 +126,7 @@ def test_ns_grid_noneighbor(universe): ref_id = 0 cutoff = 0.5 - results_grid = run_grid_search(universe, universe.atoms.positions[ref_id], cutoff) + results_grid = run_grid_search(universe, ref_id, cutoff) assert len(results_grid.get_distances()[0]) == 0 assert len(results_grid.get_indices()[0]) == 0 @@ -142,7 +143,7 @@ def test_nsgrid_noPBC(universe): results = np.array([2, 3, 4, 5, 6, 7, 8, 9, 18, 19, 1211, 10862, 10865, 17582, 17585, 38342, 38345]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - results_grid = run_grid_search(universe, universe.atoms.positions[ref_id], cutoff).get_indices()[0] + results_grid = run_grid_search(universe, ref_id, cutoff).get_indices()[0] assert_equal(results, results_grid) @@ -159,7 +160,7 @@ def test_nsgrid_PBC_rect(): # FastNS is called differently to max coverage searcher = nsgrid.FastNS(universe.dimensions, cutoff, universe.atoms.positions) - results_grid = searcher.search(universe.atoms.positions[ref_id][None, :]).get_indices()[0] # pass the id as a list for test+coverage purpose + results_grid = searcher.search(universe.atoms.positions[ref_id][None, :]).get_indices()[0] results_grid2 = searcher.search(universe.atoms.positions).get_indices() # call without specifying any ids, should do NS for all beads @@ -176,7 +177,7 @@ def test_nsgrid_PBC(universe): results = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_indices()[0] + results_grid = run_grid_search(universe, ref_id).get_indices()[0] assert_equal(results, results_grid) @@ -191,7 +192,7 @@ def test_nsgrid_pairs(universe): results = np.array(results) - results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_pairs() + results_grid = run_grid_search(universe, ref_id).get_pairs() assert_equal(np.sort(neighbors, axis=0), np.sort(results_grid[:, 1], axis=0)) @@ -203,30 +204,11 @@ def test_nsgrid_pair_distances(universe): results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm - results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_pair_distances() + results_grid = run_grid_search(universe, ref_id).get_pair_distances() assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) -# def test_nsgrid_pair_coordinates(universe): -# """Check that grid search return the proper pair coordinates""" - -# ref_id = 13937 -# neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, -# 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! -# coords = universe.atoms.positions - -# results = [] -# for nid in neighbors: -# if nid < ref_id: -# results.append([coords[nid], coords[ref_id]]) -# else: -# results.append([coords[ref_id], coords[nid]]) -# results = np.array(results) - -# results_grid = run_grid_search(universe, ref_id).get_pair_coordinates() - -# assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) def test_nsgrid_distances(universe): @@ -236,20 +218,6 @@ def test_nsgrid_distances(universe): results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm - results_grid = run_grid_search(universe, universe.atoms.positions[ref_id]).get_distances()[0] + results_grid = run_grid_search(universe, ref_id).get_distances()[0] assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) - - -# def test_nsgrid_coordinates(universe): -# """Check that grid search return the proper coordinates""" - -# ref_id = 13937 -# neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, -# 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - -# results = universe.atoms.positions[neighbors] - -# results_grid = run_grid_search(universe, ref_id).get_coordinates()[0] - -# assert_allclose(np.sort(results, axis=0), np.sort(results_grid, axis=0), atol=1e-5) From 2c83681d155308322d2469ebe9b3c97d4edf8457 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 31 Jul 2018 16:02:25 -0700 Subject: [PATCH 359/455] mend Removed dict from buffers from speedup, seperated search and self_search, construct a grid and search with another grid --- package/MDAnalysis/lib/distances.py | 14 ++------------ testsuite/MDAnalysisTests/lib/test_distances.py | 2 +- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 4d662068a69..bec705c36e6 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -679,24 +679,14 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, reference = reference[None, :] if configuration.shape == (3, ): configuration = configuration[None, :] - all_coords = np.concatenate([configuration, reference]) - mapping = np.arange(len(reference), dtype=np.int64) - gridsearch = FastNS(box, max_cutoff, all_coords) - gridsearch.prepare() - search_ids = np.arange(len(configuration), len(all_coords)) - results = gridsearch.search(search_ids=search_ids) + gridsearch = FastNS(box, max_cutoff, configuration) + results = gridsearch.search(reference) pairs = results.get_pairs() - pairs[:, 1] = undo_augment(pairs[:, 1], mapping, len(configuration)) pair_distance = results.get_pair_distances() if min_cutoff is not None: idx = pair_distance > min_cutoff pairs, pair_distance = pairs[idx], pair_distance[idx] - if pairs.size > 0: - # removing the pairs (i, j) from (reference, reference) - mask = (pairs[:, 0] < (len(configuration) - 1) ) - pairs, pair_distance = pairs[mask], pair_distance[mask] - pairs = np.sort(pairs, axis=1) return pairs, pair_distance diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index d83d8903e93..2bea060a778 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -57,7 +57,7 @@ def test_capped_distance_noresults(): npoints_1 = (1, 100) boxes_1 = (np.array([1, 2, 3, 90, 90, 90], dtype=np.float32), # ortho - np.array([1, 2, 3, 30, 45, 60], dtype=np.float32), # tri_box + np.array([1, 2, 3, 45, 60, 90], dtype=np.float32), # tri_box None, # Non Periodic ) From b05e2430b5542de435e000936598e5ddb1203bf9 Mon Sep 17 00:00:00 2001 From: ayush Date: Tue, 31 Jul 2018 19:23:52 -0700 Subject: [PATCH 360/455] reverted tests, removed sorting from get_indices, get_distances, modified compilation libs in setup --- package/MDAnalysis/lib/nsgrid.pyx | 5 ----- package/setup.py | 2 +- testsuite/MDAnalysisTests/lib/test_distances.py | 2 +- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 8 ++++---- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 8598bec1e97..7b8624a2836 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -277,11 +277,6 @@ cdef class NSResults(object): self.distances_buffer[beadid_i].push_back(dist) - for i in range(self.searchcoords.shape[0]): - sorted_indices = np.argsort(self.indices_buffer[i]) - self.indices_buffer[i] = np.array(self.indices_buffer[i])[sorted_indices] - self.distances_buffer[i] = np.array(self.distances_buffer[i])[sorted_indices] - def get_indices(self): if self.indices_buffer.empty(): diff --git a/package/setup.py b/package/setup.py index fe2e8bb7d1c..91a539db326 100755 --- a/package/setup.py +++ b/package/setup.py @@ -386,7 +386,7 @@ def extensions(config): language='c++', libraries=parallel_libraries, define_macros=define_macros + parallel_macros, - extra_compile_args=extra_compile_args + parallel_args, + extra_compile_args=cpp_extra_compile_args + parallel_args, extra_link_args=parallel_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 2bea060a778..d83d8903e93 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -57,7 +57,7 @@ def test_capped_distance_noresults(): npoints_1 = (1, 100) boxes_1 = (np.array([1, 2, 3, 90, 90, 90], dtype=np.float32), # ortho - np.array([1, 2, 3, 45, 60, 90], dtype=np.float32), # tri_box + np.array([1, 2, 3, 30, 45, 60], dtype=np.float32), # tri_box None, # Non Periodic ) diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index a6b94784cfe..41112e6bf25 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -145,7 +145,7 @@ def test_nsgrid_noPBC(universe): results_grid = run_grid_search(universe, ref_id, cutoff).get_indices()[0] - assert_equal(results, results_grid) + assert_equal(np.sort(results), np.sort(results_grid)) def test_nsgrid_PBC_rect(): @@ -164,10 +164,10 @@ def test_nsgrid_PBC_rect(): results_grid2 = searcher.search(universe.atoms.positions).get_indices() # call without specifying any ids, should do NS for all beads - assert_equal(results, results_grid) + assert_equal(np.sort(results), np.sort(results_grid)) assert_equal(len(universe.atoms), len(results_grid2)) assert searcher.cutoff == 7 - assert_equal(results_grid, results_grid2[ref_id]) + assert_equal(np.sort(results_grid), np.sort(results_grid2[ref_id])) def test_nsgrid_PBC(universe): @@ -179,7 +179,7 @@ def test_nsgrid_PBC(universe): results_grid = run_grid_search(universe, ref_id).get_indices()[0] - assert_equal(results, results_grid) + assert_equal(np.sort(results), np.sort(results_grid)) def test_nsgrid_pairs(universe): From 4f1e729c143f7a13721541e3d68ea5cb1c072e0f Mon Sep 17 00:00:00 2001 From: ayush Date: Wed, 1 Aug 2018 08:57:07 -0700 Subject: [PATCH 361/455] minor changes for failing tests --- package/MDAnalysis/lib/nsgrid.pyx | 38 +++++++++++-------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 7b8624a2836..518be1ef594 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -249,10 +249,10 @@ cdef class NSResults(object): self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) return np.asarray(self.pair_distances_buffer) - cdef create_buffers(self): + cdef void create_buffers(self) nogil: cdef ns_int i, beadid_i, beadid_j cdef ns_int idx, nsearch - cdef real dist2 + cdef real dist2, dist nsearch = len(self.searchcoords) @@ -281,12 +281,12 @@ cdef class NSResults(object): def get_indices(self): if self.indices_buffer.empty(): self.create_buffers() - return np.asarray(self.indices_buffer) + return np.ascontiguousarray(self.indices_buffer) def get_distances(self): if self.distances_buffer.empty(): self.create_buffers() - return np.asarray(self.distances_buffer) + return np.ascontiguousarray(self.distances_buffer) cdef class NSGrid(object): cdef readonly real cutoff # cutoff @@ -456,13 +456,12 @@ cdef class FastNS(object): cdef real[:, ::1] searchcoords_bbox cdef NSGrid searchgrid - ncells = self.grid.size cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int npairs = 0 # Generate another grid to search - searchcoords = np.array(search_coords, dtype=np.float32) + searchcoords = np.asarray(search_coords, dtype=np.float32) searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) searchgrid.fill_grid(searchcoords_bbox) @@ -482,9 +481,9 @@ cdef class FastNS(object): for yi in range(DIM): for zi in range(DIM): #Probe the search coordinates in a brick shaped box - probe[XX] = searchcoords[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] - probe[YY] = searchcoords[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] - probe[ZZ] = searchcoords[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] + probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] + probe[YY] = searchcoords_bbox[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] + probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] # Make sure the probe coordinates is inside the brick-shaped box for m in range(DIM - 1, -1, -1): while probe[m] < 0: @@ -500,11 +499,8 @@ cdef class FastNS(object): bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] #find distance between search coords[i] and coords[bid] d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) - if d2 < cutoff2: - if d2 < EPSILON: - continue - else: - results.add_neighbors(current_beadid, bid, d2) + if d2 < cutoff2 and d2 > EPSILON: + results.add_neighbors(current_beadid, bid, d2) npairs += 1 return results @@ -516,12 +512,7 @@ cdef class FastNS(object): cdef ns_int cellindex, cellindex_probe cdef ns_int xi, yi, zi - cdef NSResults results - - cdef ns_int size = self.coords_bbox.shape[0] - cdef ns_int[:] checked = np.zeros(size, dtype=np.int) - cdef real d2 cdef rvec probe @@ -564,11 +555,8 @@ cdef class FastNS(object): continue #find distance between search coords[i] and coords[bid] d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) - if d2 < cutoff2: - if d2 < EPSILON: - continue - else: - results.add_neighbors(current_beadid, bid, d2) - results.add_neighbors(bid, current_beadid, d2) + if d2 < cutoff2 and d2 > EPSILON: + results.add_neighbors(current_beadid, bid, d2) + results.add_neighbors(bid, current_beadid, d2) npairs += 1 return results From 7fd1f805192757464fdcd0fc22ef7344a9ba1d3d Mon Sep 17 00:00:00 2001 From: ayush Date: Wed, 1 Aug 2018 10:18:29 -0700 Subject: [PATCH 362/455] added hack to handle NoPBC, tests to follow --- package/MDAnalysis/lib/nsgrid.pyx | 130 ++++++++++++++++++++---------- 1 file changed, 89 insertions(+), 41 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 518be1ef594..3e3013b8e44 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -85,10 +85,13 @@ cdef struct cPBCBox_t: cdef class PBCBox(object): cdef cPBCBox_t c_pbcbox cdef bint is_triclinic + cdef bint periodic - def __init__(self, real[:,::1] box): + def __init__(self, real[:,::1] box, bint periodic): + self.periodic = periodic self.update(box) + cdef void fast_update(self, real[:,::1] box) nogil: cdef ns_int i, j @@ -146,14 +149,15 @@ cdef class PBCBox(object): for i in range(DIM): dx[i] = other[i] - ref[i] - for i in range (DIM-1, -1, -1): - while dx[i] > self.c_pbcbox.hbox_diag[i]: - for j in range (i, -1, -1): - dx[j] -= self.c_pbcbox.box[i][j] + if self.periodic: + for i in range (DIM-1, -1, -1): + while dx[i] > self.c_pbcbox.hbox_diag[i]: + for j in range (i, -1, -1): + dx[j] -= self.c_pbcbox.box[i][j] - while dx[i] <= self.c_pbcbox.mhbox_diag[i]: - for j in range (i, -1, -1): - dx[j] += self.c_pbcbox.box[i][j] + while dx[i] <= self.c_pbcbox.mhbox_diag[i]: + for j in range (i, -1, -1): + dx[j] += self.c_pbcbox.box[i][j] def dx(self, real[:] a, real[:] b): cdef rvec dx @@ -189,22 +193,23 @@ cdef class PBCBox(object): with gil: bbox_coords = coords.copy() - if self.is_triclinic: - for i in range(natoms): - for m in range(DIM - 1, -1, -1): - while bbox_coords[i, m] < 0: - for d in range(m+1): - bbox_coords[i, d] += self.c_pbcbox.box[m][d] - while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: - for d in range(m+1): - bbox_coords[i, d] -= self.c_pbcbox.box[m][d] - else: - for i in range(natoms): - for m in range(DIM): - while bbox_coords[i, m] < 0: - bbox_coords[i, m] += self.c_pbcbox.box[m][m] - while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: - bbox_coords[i, m] -= self.c_pbcbox.box[m][m] + if self.periodic: + if self.is_triclinic: + for i in range(natoms): + for m in range(DIM - 1, -1, -1): + while bbox_coords[i, m] < 0: + for d in range(m+1): + bbox_coords[i, d] += self.c_pbcbox.box[m][d] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + for d in range(m+1): + bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + else: + for i in range(natoms): + for m in range(DIM): + while bbox_coords[i, m] < 0: + bbox_coords[i, m] += self.c_pbcbox.box[m][m] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + bbox_coords[i, m] -= self.c_pbcbox.box[m][m] return bbox_coords def put_atoms_in_bbox(self, real[:,::1] coords): @@ -410,17 +415,35 @@ cdef class FastNS(object): cdef readonly real cutoff cdef NSGrid grid cdef ns_int max_gridsize + cdef bint periodic - def __init__(self, box, cutoff, coords, max_gridsize=5000): + def __init__(self, cutoff, coords, box=None, max_gridsize=5000): import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors + cdef real[:] pseudobox = np.zeros(6, dtype=np.float32) + cdef real[DIM] bmax, bmin + cdef ns_int i + self.periodic = True + + if (box is None) or np.allclose(box[:3], 0.): + bmax = np.max(coords, axis=0) + bmin = np.min(coords, axis=0) + for i in range(DIM): + pseudobox[i] = 1.1*(bmax - bmin) + pseudobox[DIM + i] = 90. + box = pseudobox + # shift the origin + coords -= bmin + self.periodic = False + + if box.shape != (3,3): box = triclinic_vectors(box) - self.box = PBCBox(box) + self.box = PBCBox(box, self.periodic) if cutoff < 0: raise ValueError("Cutoff must be positive!") @@ -455,6 +478,7 @@ cdef class FastNS(object): cdef real[:, ::1] searchcoords cdef real[:, ::1] searchcoords_bbox cdef NSGrid searchgrid + cdef bint check cdef real cutoff2 = self.cutoff * self.cutoff @@ -480,18 +504,30 @@ cdef class FastNS(object): for xi in range(DIM): for yi in range(DIM): for zi in range(DIM): + check = True #Probe the search coordinates in a brick shaped box probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] probe[YY] = searchcoords_bbox[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] # Make sure the probe coordinates is inside the brick-shaped box - for m in range(DIM - 1, -1, -1): - while probe[m] < 0: - for d in range(m+1): - probe[d] += self.box.c_pbcbox.box[m][d] - while probe[m] >= self.box.c_pbcbox.box[m][m]: - for d in range(m+1): - probe[d] -= self.box.c_pbcbox.box[m][d] + if self.periodic: + for m in range(DIM - 1, -1, -1): + while probe[m] < 0: + for d in range(m+1): + probe[d] += self.box.c_pbcbox.box[m][d] + while probe[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + probe[d] -= self.box.c_pbcbox.box[m][d] + else: + for m in range(DIM, -1, -1, -1): + if probe[m] < 0: + check = False + break + if probe[m] > self.box.c_pbcbox.box[m][m]: + check = False + break + if not check: + continue # Get the cell index corresponding to the probe cellindex_probe = self.grid.coord2cellid(probe) #for this cellindex search in grid @@ -518,6 +554,7 @@ cdef class FastNS(object): cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int npairs = 0 + cdef bint check size_search = self.coords.shape[0] @@ -532,20 +569,31 @@ cdef class FastNS(object): for xi in range(DIM): for yi in range(DIM): for zi in range(DIM): + check = True # Calculate and/or reinitialize shifted coordinates #Probe the search coordinates in a brick shaped box probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[XX] probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[XX] # Make sure the shifted coordinates is inside the brick-shaped box - for m in range(DIM - 1, -1, -1): - while probe[m] < 0: - for d in range(m+1): - probe[d] += self.box.c_pbcbox.box[m][d] - while probe[m] >= self.box.c_pbcbox.box[m][m]: - for d in range(m+1): - probe[d] -= self.box.c_pbcbox.box[m][d] - + if self.periodic: + for m in range(DIM - 1, -1, -1): + while probe[m] < 0: + for d in range(m+1): + probe[d] += self.box.c_pbcbox.box[m][d] + while probe[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + probe[d] -= self.box.c_pbcbox.box[m][d] + else: + for m in range(DIM, -1, -1, -1): + if probe[m] < 0: + check = False + break + elif probe[m] > self.box.c_pbcbox.box[m][m]: + check = False + break + if not check: + continue # Get the cell index corresponding to the probe cellindex_probe = self.grid.coord2cellid(probe) #for this cellindex search in grid From 57e9d55f5c4b546ee2cbdbe794578c550a77fe70 Mon Sep 17 00:00:00 2001 From: ayush Date: Wed, 1 Aug 2018 12:31:07 -0700 Subject: [PATCH 363/455] conform tests a/c to modifications in API --- package/MDAnalysis/lib/distances.py | 2 +- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index bec705c36e6..729ebb1e3ba 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -679,7 +679,7 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, reference = reference[None, :] if configuration.shape == (3, ): configuration = configuration[None, :] - gridsearch = FastNS(box, max_cutoff, configuration) + gridsearch = FastNS(max_cutoff, configuration, box=box) results = gridsearch.search(reference) pairs = results.get_pairs() pair_distance = results.get_pair_distances() diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index 41112e6bf25..cd9e514f3a1 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -45,7 +45,7 @@ def run_grid_search(u, ref_id, cutoff=3): if searchcoords.shape == (3, ): searchcoords = searchcoords[None, :] # Run grid search - searcher = nsgrid.FastNS(u.dimensions, cutoff, coords) + searcher = nsgrid.FastNS(cutoff, coords, box=u.dimensions) return searcher.search(searchcoords) @@ -56,11 +56,11 @@ def test_pbc_badbox(): nsgrid.PBCBox([]) with pytest.raises(ValueError): - nsgrid.PBCBox(np.zeros((3))) # Bad shape - nsgrid.PBCBox(np.zeros((3, 3))) # Collapsed box - nsgrid.PBCBOX(np.array([[0, 0, 0], [0, 1, 0], [0, 0, 1]])) # 2D box - nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])) # Box provided as array of integers - nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=float)) # Box provided as array of double + nsgrid.PBCBox(np.zeros((3)), True) # Bad shape + nsgrid.PBCBox(np.zeros((3, 3)), True) # Collapsed box + nsgrid.PBCBOX(np.array([[0, 0, 0], [0, 1, 0], [0, 0, 1]]), True) # 2D box + nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), True) # Box provided as array of integers + nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=float), True) # Box provided as array of double def test_pbc_distances(): @@ -70,7 +70,7 @@ def test_pbc_distances(): a = np.array([0.1, 0.1, 0.1], dtype=np.float32) b = np.array([1.1, -0.1, 0.2], dtype=np.float32) dx = np.array([0, -0.2, 0.1], dtype=np.float32) - pbcbox = nsgrid.PBCBox(box) + pbcbox = nsgrid.PBCBox(box, True) with pytest.raises(ValueError): pbcbox.distance(a, bad) @@ -105,7 +105,7 @@ def test_pbc_put_in_bbox(): dtype=np.float32 ) - pbcbox = nsgrid.PBCBox(box) + pbcbox = nsgrid.PBCBox(box, True) assert_allclose(pbcbox.put_atoms_in_bbox(coords), results, atol=1e-5) @@ -158,7 +158,7 @@ def test_nsgrid_PBC_rect(): cutoff = 7 # FastNS is called differently to max coverage - searcher = nsgrid.FastNS(universe.dimensions, cutoff, universe.atoms.positions) + searcher = nsgrid.FastNS(cutoff, universe.atoms.positions, box=universe.dimensions) results_grid = searcher.search(universe.atoms.positions[ref_id][None, :]).get_indices()[0] From a7264ec6cda550acf49f53ed62b70f3565b7929c Mon Sep 17 00:00:00 2001 From: ayush Date: Thu, 2 Aug 2018 02:30:58 -0700 Subject: [PATCH 364/455] removed python functions, added no pbc handle using python min, max --- package/MDAnalysis/lib/nsgrid.pyx | 32 +---- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 125 ++++++++----------- 2 files changed, 58 insertions(+), 99 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 3e3013b8e44..ab0df6d2e46 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -159,31 +159,12 @@ cdef class PBCBox(object): for j in range (i, -1, -1): dx[j] += self.c_pbcbox.box[i][j] - def dx(self, real[:] a, real[:] b): - cdef rvec dx - if a.shape[0] != DIM or b.shape[0] != DIM: - raise ValueError("Not 3 D coordinates") - self.fast_pbc_dx(&a[XX], &b[XX], dx) - return np.array([dx[XX], dx[YY], dx[ZZ]], dtype=np.float32) - cdef real fast_distance2(self, rvec a, rvec b) nogil: cdef rvec dx self.fast_pbc_dx(a, b, dx) return rvec_norm2(dx) - def distance2(self, real[:] a, real[:] b): - if a.shape[0] != DIM or b.shape[0] != DIM: - raise ValueError("Not 3 D coordinates") - return self.fast_distance2(&a[XX], &b[XX]) - - cdef real fast_distance(self, rvec a, rvec b) nogil: - return sqrt(self.fast_distance2(a,b)) - - def distance(self, real[:] a, real[:] b): - if a.shape[0] != DIM or b.shape[0] != DIM: - raise ValueError("Not 3 D coordinates") - return self.fast_distance(&a[XX], &b[XX]) cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: cdef ns_int i, m, d, natoms @@ -212,9 +193,6 @@ cdef class PBCBox(object): bbox_coords[i, m] -= self.c_pbcbox.box[m][m] return bbox_coords - def put_atoms_in_bbox(self, real[:,::1] coords): - return np.asarray(self.fast_put_atoms_in_bbox(coords)) - ######################### # Neighbor Search Stuff # ######################### @@ -427,11 +405,12 @@ cdef class FastNS(object): cdef ns_int i self.periodic = True - if (box is None) or np.allclose(box[:3], 0.): + + if (box is None) or (np.allclose(box[:3], 0.) and box.shape[0] == 6): bmax = np.max(coords, axis=0) bmin = np.min(coords, axis=0) for i in range(DIM): - pseudobox[i] = 1.1*(bmax - bmin) + pseudobox[i] = 1.1*(bmax[i] - bmin[i]) pseudobox[DIM + i] = 90. box = pseudobox # shift the origin @@ -439,7 +418,6 @@ cdef class FastNS(object): self.periodic = False - if box.shape != (3,3): box = triclinic_vectors(box) @@ -519,7 +497,7 @@ cdef class FastNS(object): for d in range(m+1): probe[d] -= self.box.c_pbcbox.box[m][d] else: - for m in range(DIM, -1, -1, -1): + for m in range(DIM -1, -1, -1): if probe[m] < 0: check = False break @@ -585,7 +563,7 @@ cdef class FastNS(object): for d in range(m+1): probe[d] -= self.box.c_pbcbox.box[m][d] else: - for m in range(DIM, -1, -1, -1): + for m in range(DIM -1, -1, -1): if probe[m] < 0: check = False break diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index cd9e514f3a1..bcb335f59a8 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -24,7 +24,7 @@ import pytest -from numpy.testing import assert_equal, assert_allclose +from numpy.testing import assert_equal, assert_allclose, assert_array_equal import numpy as np import MDAnalysis as mda @@ -50,69 +50,18 @@ def run_grid_search(u, ref_id, cutoff=3): return searcher.search(searchcoords) -def test_pbc_badbox(): +def test_pbc_box(): """Check that PBC box accepts only well-formated boxes""" + pbc = True with pytest.raises(TypeError): nsgrid.PBCBox([]) with pytest.raises(ValueError): - nsgrid.PBCBox(np.zeros((3)), True) # Bad shape - nsgrid.PBCBox(np.zeros((3, 3)), True) # Collapsed box - nsgrid.PBCBOX(np.array([[0, 0, 0], [0, 1, 0], [0, 0, 1]]), True) # 2D box - nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), True) # Box provided as array of integers - nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=float), True) # Box provided as array of double - - -def test_pbc_distances(): - """Check that PBC box computes distances""" - box = np.identity(3, dtype=np.float32) - bad = np.array([0.1, 0.2], dtype=np.float32) - a = np.array([0.1, 0.1, 0.1], dtype=np.float32) - b = np.array([1.1, -0.1, 0.2], dtype=np.float32) - dx = np.array([0, -0.2, 0.1], dtype=np.float32) - pbcbox = nsgrid.PBCBox(box, True) - - with pytest.raises(ValueError): - pbcbox.distance(a, bad) - pbcbox.distance(bad, a) - - pbcbox.distance2(a, bad) - pbcbox.distance2(bad, a) - - pbcbox.dx(bad, a) - pbcbox.dx(a, bad) - - assert_equal(pbcbox.dx(a, b), dx) - assert_allclose(pbcbox.distance(a, b), np.sqrt(np.sum(dx*dx)), atol=1e-5) - assert_allclose(pbcbox.distance2(a, b), np.sum(dx*dx), atol=1e-5) - - -def test_pbc_put_in_bbox(): - "Check that PBC put beads in brick-shaped box" - box = np.identity(3, dtype=np.float32) - coords = np.array( - [ - [0.1, 0.1, 0.1], - [-0.1, 1.1, 0.9] - ], - dtype=np.float32 - ) - results = np.array( - [ - [0.1, 0.1, 0.1], - [0.9, 0.1, 0.9] - ], - dtype=np.float32 - ) - - pbcbox = nsgrid.PBCBox(box, True) - - assert_allclose(pbcbox.put_atoms_in_bbox(coords), results, atol=1e-5) - - -def test_nsgrid_badinit(): - with pytest.raises(TypeError): - nsgrid.FastNS(None, 1) + nsgrid.PBCBox(np.zeros((3)), pbc) # Bad shape + nsgrid.PBCBox(np.zeros((3, 3)), pbc) # Collapsed box + nsgrid.PBCBOX(np.array([[0, 0, 0], [0, 1, 0], [0, 0, 1]]), pbc) # 2D box + nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), pbc) # Box provided as array of integers + nsgrid.PBCBOX(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=float), pbc) # Box provided as array of double def test_nsgrid_badcutoff(universe): @@ -134,19 +83,6 @@ def test_ns_grid_noneighbor(universe): assert len(results_grid.get_pair_distances()) == 0 -def test_nsgrid_noPBC(universe): - """Check that grid search works when no PBC is needed""" - - ref_id = 0 - - cutoff = 3 - results = np.array([2, 3, 4, 5, 6, 7, 8, 9, 18, 19, 1211, 10862, 10865, 17582, 17585, 38342, - 38345]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! - - results_grid = run_grid_search(universe, ref_id, cutoff).get_indices()[0] - - assert_equal(np.sort(results), np.sort(results_grid)) - def test_nsgrid_PBC_rect(): """Check that nsgrid works with rect boxes and PBC""" @@ -221,3 +157,48 @@ def test_nsgrid_distances(universe): results_grid = run_grid_search(universe, ref_id).get_distances()[0] assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) + + +@pytest.mark.parametrize('box, results', + ((None, [3, 13, 24]), + (np.array([0., 0., 0., 90., 90., 90.]), [3, 13, 24]), + (np.array([10., 10., 10., 90., 90., 90.]), [3, 13, 24, 39, 67]), + (np.array([10., 10., 10., 60., 75., 90.]), [3, 13, 24, 39, 60, 79]))) +def test_nsgrid_search(box, results): + np.random.seed(90003) + points = (np.random.uniform(low=0, high=1.0, + size=(100, 3))*(10.)).astype(np.float32) + cutoff = 2.0 + query = np.array([1., 1., 1.]).reshape((1,3)) + searcher = nsgrid.FastNS(cutoff, points, box=box) + searchresults = searcher.search(query) + indices = searchresults.get_indices()[0] + assert_equal(np.sort(indices), results) + + +@pytest.mark.parametrize('box, result', + ((None, 21), + (np.array([0., 0., 0., 90., 90., 90.]), 21), + (np.array([10., 10., 10., 90., 90., 90.]), 26), + (np.array([10., 10., 10., 60., 75., 90.]), 33))) +def test_nsgrid_selfsearch(box, result): + np.random.seed(90003) + points = (np.random.uniform(low=0, high=1.0, + size=(100, 3))*(10.)).astype(np.float32) + cutoff = 1.0 + searcher = nsgrid.FastNS(cutoff, points, box=box) + searchresults = searcher.self_search() + pairs = searchresults.get_pairs() + assert_equal(len(pairs)//2, result) + +def test_contiguous(universe): + ref_id = 13937 + cutoff = 3 + coords = universe.atoms.positions + searcher = nsgrid.FastNS(cutoff, coords, box=None) + searchresults = searcher.search(coords[ref_id][None, :]) + indices = searchresults.get_indices() + distances = searchresults.get_distances() + + assert indices.flags['C_CONTIGUOUS'] == True + assert distances.flags['C_CONTIGUOUS'] == True From 929fbf589d0a27ac7aeb6fc4bb3061f9647405c4 Mon Sep 17 00:00:00 2001 From: ayush Date: Fri, 3 Aug 2018 02:37:28 -0700 Subject: [PATCH 365/455] docs unchecked --- package/MDAnalysis/lib/nsgrid.pyx | 366 +++++++++++++++++++++++++++++- 1 file changed, 362 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index ab0df6d2e46..85207f9da1b 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -28,10 +28,41 @@ # cython: initializedcheck=False """ -Neighbor search library --- :mod:`MDAnalysis.lib.grid` -====================================================== +Neighbor search library --- :mod:`MDAnalysis.lib.nsgrid` +======================================================== + +About the code +--------------- + +This Neighbor search library is a serialized Cython version greatly +inspired by the NS grid search implemented in +`GROMACS `_ . + +GROMACS 4.x code (more precisely `nsgrid.c `_ +and `ns.c `_ ) +was used as reference to write this file. + +GROMACS 4.x code is released under the GNU Public Licence v2. + +About the algorithm +-------------------- + +The neighbor search implemented here is based on `cell lists `_ which allow +computation of pairs [#]_ with a cost of :math:`O(N)`, instead of :math:`O(N^2)`. +The basic algorithm is described in Appendix F, Page 552 of +``Understanding Molecular Dynamics: From Algorithm to Applications`` by Frenkel and Smit. + +In brief, the algorithm divides the domain into smaller subdomains called `cells` +and distributes every particle to these cells based on its position. Subsequently, +any distance based query first identifies the corresponding cell position in the +domain followed by distance evaluations within the identified cell and +neighboring cells only. Care must be taken to ensure that `cellsize` is +greater than the desired search distance, otherwise all of the neighbours might +not reflect in the results. + + +.. [#] a pair correspond to two particles that are considered as neighbors . -This Neighbor search library is a serialized Cython port of the NS grid search implemented in GROMACS. """ @@ -83,16 +114,47 @@ cdef struct cPBCBox_t: # Class to handle PBC calculations cdef class PBCBox(object): + """ + Cython implementation of `PBC-related `_ operations. + This class is used by classes :class:`FastNS` and :class:`NSGrid` to put all particles inside a brick-shaped box + and to compute PBC-aware distance. The class can also handle non-PBC aware distance evaluations through + ``periodic`` argument. + + .. warning:: + This class is not meant to be used by end users. + + .. warning:: + Even if MD triclinic boxes can be handled by this class, internal optimization is made based on the + assumption that particles are inside a brick-shaped box. When this is not the case, calculated distances are not + warranted to be exact. + """ cdef cPBCBox_t c_pbcbox cdef bint is_triclinic cdef bint periodic def __init__(self, real[:,::1] box, bint periodic): + """ + Parameters + ---------- + box : numpy.ndarray + box vectors of shape ``(3, 3)`` or + as returned by ``MDAnalysis.lib.mdamath.triclinic_vectors`` + ``dtype`` must be ``numpy.float32`` + periodic : boolean + ``True`` for PBC-aware calculations + ``False`` for non PBC aware calculations + """ self.periodic = periodic self.update(box) cdef void fast_update(self, real[:,::1] box) nogil: + """ + Updates the internal box parameters for + PBC-aware distance calculations. The internal + box parameters are used to define the brick-shaped + box which is eventually used for distance calculations. + """ cdef ns_int i, j cdef real min_hv2, min_ss, tmp @@ -134,6 +196,23 @@ cdef class PBCBox(object): self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) def update(self, real[:,::1] box): + """ + Updates internal MD box representation and parameters used for calculations. + + + Parameters + ---------- + box : numpy.ndarray + Describes the MD box vectors as returned by + :func:`MDAnalysis.lib.mdamath.triclinic_vectors`. + `dtype` must be :class:`numpy.float32` + + Note + ---- + Call to this method is only needed when the MD box is changed + as it always called when class is instantiated. + + """ if box.shape[0] != DIM or box.shape[1] != DIM: raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( DIM, DIM, box.shape[0], box.shape[1])) @@ -143,6 +222,15 @@ cdef class PBCBox(object): cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: + """Dislacement between two points for both + PBC and non-PBC conditions + + Modifies the displacement vector between two points based + on the minimum image convention for PBC aware calculations. + + For non-PBC aware distance evaluations, calculates the + displacement vector without any modifications + """ cdef ns_int i, j @@ -161,12 +249,25 @@ cdef class PBCBox(object): cdef real fast_distance2(self, rvec a, rvec b) nogil: + """Distance calculation between two points + for both PBC and non-PBC aware calculations + + Returns the distance obeying minimum + image convention if periodic is set to ``True`` while + instantiating the ``PBCBox`` object. + """ cdef rvec dx self.fast_pbc_dx(a, b, dx) return rvec_norm2(dx) cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: + """Shifts all ``coords`` to an orthogonal brick shaped box + + All the coordinates are brought into an orthogonal + box. The box vectors for the brick-shaped box + are defined in ``fast_update`` method. + """ cdef ns_int i, m, d, natoms cdef real[:,::1] bbox_coords @@ -198,6 +299,26 @@ cdef class PBCBox(object): ######################### cdef class NSResults(object): + """Class to store the results + + All the required outputs from :class:`FastNS` is stored in the + instance of this class. All the methods of :class:`FastNS` returns + an instance of this class, which can be used to generate the desired + results on demand. + + While more details can be found in individual method description, + a brief list of methods and their returns can be summarized as follows + - ``get_pairs`` : All the pairs of particles within the specified cutoff distance. + - ``get_pair_distances`` : Distance corresponding to every pair of neighbors + - ``get_indices`` : An array with arrays of neighbour corresponding to every individual particle. + - ``get_distances`` : Corresponding distance for every neighbor in ``get_indices`` + + + SeeAlso + ------- + MDAnalysis.lib.nsgrid.FastNS + + """ cdef readonly real cutoff cdef ns_int npairs @@ -211,6 +332,18 @@ cdef class NSResults(object): cdef vector[real] pair_distances2_buffer def __init__(self, real cutoff, real[:, ::1]coords, real[:, ::1]searchcoords): + """ + Parameters + ---------- + cutoff : float + Specified cutoff distance + coords : numpy.ndarray + Array with coordinates of atoms of shape ``(N, 3)`` for + ``N`` particles. ``dtype`` must be ``numpy.float32`` + searchcoords : numpy.ndarray + Array with query coordinates. Shape must be ``(M, 3)`` + for ``M`` queries. ``dtype`` must be ``numpy.float32`` + """ self.cutoff = cutoff self.coords = coords self.searchcoords = searchcoords @@ -218,21 +351,58 @@ cdef class NSResults(object): self.npairs = 0 cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: - # Important: If this function returns ERROR, it means that memory allocation failed + """Internal function to add pairs and distances to buffers + The buffers populated using this method are used by other methods of this class. + This is the primary function used by :class:`FastNS` to save the pair of atoms, + which can be considered as neighbors. + """ self.pairs_buffer.push_back(beadid_i) self.pairs_buffer.push_back(beadid_j) self.pair_distances2_buffer.push_back(distance2) self.npairs += 1 def get_pairs(self): + """Returns all the pairs within the desired cutoff distance + + Returns an array of shape ``(N, 2)``, where N is the number of pairs + between ``reference`` and ``configuration`` within the specified distance. + For every pair ``(i, j)``, ``reference[i]`` and ``configuration[j]`` are + atom positions such that ``reference`` is the position of query + atoms while ``configuration`` coontains the position of group of + atoms used to search against the query atoms. + + Returns + ------- + pairs : numpy.ndarray + pairs of atom indices of neighbors from query + and initial atom coordinates of shape ``(N, 2)`` + """ return np.asarray(self.pairs_buffer).reshape(self.npairs, 2) def get_pair_distances(self): + """Returns all the distances corresponding to each pair of neighbors + + Returns an array of shape ``N`` where N is the number of pairs + among the query atoms and initial atoms within a specified distance. + Every element ``[i]`` corresponds to the distance between + ``pairs[i, 0]`` and ``pairs[i, 1]``, where pairs is the array + obtained from ``get_pairs()`` + + SeeAlso + ------- + MDAnalysis.lib.nsgrid.NSResults.get_pairs + + """ self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) return np.asarray(self.pair_distances_buffer) cdef void create_buffers(self) nogil: + """ + Creates buffers to get individual neighbour list and distances + of the query atoms. + + """ cdef ns_int i, beadid_i, beadid_j cdef ns_int idx, nsearch cdef real dist2, dist @@ -262,16 +432,72 @@ cdef class NSResults(object): def get_indices(self): + """Individual neighbours of query atom + + For every queried atom ``i``, an array of all its neighbors + indices can be obtained from ``get_indices()[i]`` + + Returns + ------- + indices : np.ndarray + Indices of neighboring atoms. + Every element i.e. ``indices[i]`` will be an array of + shape ``m`` where m is the number of neighbours of + query atom[i]. ``dtype=numpy.int`` + + """ if self.indices_buffer.empty(): self.create_buffers() return np.ascontiguousarray(self.indices_buffer) def get_distances(self): + """Distance corresponding to individual neighbors of query atom + + For every queried atom ``i``, an array of all the distances + from its neighbors can be obtained from ``get_distances()[i]``. + Every ``distance[i, j]`` will correspond + to the distance between atoms whose indices can be obtained + from ``get_indices()[i, j]`` + + Returns + ------- + distances : np.ndarray + Every element i.e. ``distances[i]`` will be an array of + shape ``m`` where m is the number of neighbours of + query atom[i]. + + SeeAlso + ------- + MDAnalysis.lib.nsgrid.NSResults.get_indices + + """ if self.distances_buffer.empty(): self.create_buffers() return np.ascontiguousarray(self.distances_buffer) cdef class NSGrid(object): + """Constructs a uniform cuboidal grid for a brick-shaped box + + This class uses :class:`PBCBox` to define the brick shaped box. + It is essential to initialize the box with :class:`PBCBox` + inorder to form the grid. + + The domain is subdivided into number of cells based on the desired search + radius. Ideally cellsize should be equal to the search radius, but small + search radius leads to large cell-list data strucutres. + An optimization of cutoff is imposed to limit the size of data + structure such that the cellsize is always greater than or + equal to cutoff distance. + + Note + ---- + This class assumes that all the coordinates are already + inside the brick shaped box. Care must be taken to ensure + all the particles are within the brick shaped box as + defined by :class:`PBCBox`. This can be ensured by using + :func:`~MDAnalysis.lib.nsgrid.PBCBox.fast_put_atoms_in_bbox` + + """ cdef readonly real cutoff # cutoff cdef ns_int size # total cells cdef ns_int ncoords # number of coordinates @@ -285,6 +511,20 @@ cdef class NSGrid(object): cdef bint force # To negate the effects of optimized cutoff def __init__(self, ncoords, cutoff, PBCBox box, max_size, force=False): + """ + Parameters + ---------- + ncoords : int + Number of coordinates to fill inside the brick shaped box + cutoff : float + Desired cutoff radius + box : PBCBox + Instance of :class:`PBCBox` + max_size : int + Maximum total number of cells + force : boolean + Optimizes cutoff if set to ``False`` [False] + """ cdef ns_int i cdef ns_int ncellx, ncelly, ncellz, size, nbeadspercell cdef ns_int xi, yi, zi @@ -331,11 +571,21 @@ cdef class NSGrid(object): PyMem_Free(self.cellids) cdef ns_int coord2cellid(self, rvec coord) nogil: + """Finds the cell-id for the given coordinate inside the brick shaped box + + Note + ---- + Assumes the coordinate is already inside the brick shaped box. + Return wrong cell-id if this is not the case + """ return (coord[ZZ] / self.cellsize[ZZ]) * (self.cell_offsets[ZZ]) +\ (coord[YY] / self.cellsize[YY]) * self.cell_offsets[YY] + \ (coord[XX] / self.cellsize[XX]) + cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: + """Finds actual cell position `(x, y, z)` from a cell-id + """ if cellid < 0: return False if cellid >= self.size: @@ -350,6 +600,17 @@ cdef class NSGrid(object): return True cdef fill_grid(self, real[:, ::1] coords): + """Sorts atoms into cells based on their position in the brick shaped box + + Every atom inside the brick shaped box is assigned a + cell-id based on its position. Another list ``beadids`` + sort the atom-ids in each cell. + + Note + ---- + The method fails if any coordinate is outside the brick shaped box. + + """ cdef ns_int i, cellindex = -1 cdef ns_int ncoords = coords.shape[0] cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) @@ -386,6 +647,15 @@ cdef class NSGrid(object): cdef class FastNS(object): + """Grid based search between two group of atoms + + Instantiates a class object which uses :class:`PBCBox` and + :class:`NSGrid` to construct a cuboidal + grid in an orthogonal brick shaped box. + + Minimum image convention is used for distance evaluations + if box dimensions are provided. + """ cdef PBCBox box cdef real[:, ::1] coords @@ -397,6 +667,40 @@ cdef class FastNS(object): def __init__(self, cutoff, coords, box=None, max_gridsize=5000): + """ + Initialize the grid and sort the coordinates in respective + cells by shifting the coordinates in a brick shaped box. + The brick shaped box is defined by :class:`PBCBox` + and cuboidal grid is initialize by :class:`NSGrid`. + If box is supplied, periodic shifts along box vectors are used + to contain all the coordinates inside the brick shaped box. + If box is not supplied, the range of coordinates i.e. + ``[xmax, ymax, zmax] - [xmin, ymin, zmin]`` is used to construct + a pseudo box. Subsequently, the origin is also shifted + to the ``[xmin, ymin, zmin]``. + + Parameters + ---------- + cutoff : float + Desired cutoff distance + coords : numpy.ndarray + atom coordinates of shape ``(N, 3)`` for ``N`` atoms. + ``dtype=numpy.float32`` + box : numpy.ndarray + Box dimension of shape (6, ). The dimensions must be + provided in the same format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx, ly, lz, alpha, beta, gamma]`` (dtype = numpy.float32) + [None] + max_gridsize : int + maximum number of cells in the grid + + Note + ---- + box=``None`` and ``[0., 0., 0., 90., 90., 90]`` + both are used for Non-PBC aware calculations + + """ import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors @@ -442,6 +746,41 @@ cdef class FastNS(object): def search(self, search_coords): + """Search a group of atoms against initialized coordinates + + Creates a new grid with the query atoms and searches + against the initialized coordinates. The search is exclusive + i.e. only the pairs ``(i, j)`` such that ``atom[i]`` from query atoms + and ``atom[j]`` from the initialized set of coordinates is stored as + neighbors. + + PBC-aware/non PBC-aware calculations are automatically enabled during + the instantiation of :class:FastNS. + + Parameters + ---------- + search_coords : numpy.ndarray + Query coordinates of shape ``(N, 3)`` where + ``N`` is the number of queries + + Returns + ------- + results : NSResults object + The object from :class:NSResults + contains ``get_indices``, ``get_distances``. + ``get_pairs``, ``get_pair_distances`` + + Note + ---- + For non-PBC aware calculations, the current implementation doesn't work + if any of the query coordinates is beyond the specified range of + initialized coordinates in :func:`MDAnalysis.lib.nsgrid.FastNS`. + + SeeAlso + ------- + MDAnalysis.lib.nsgrid.NSResults + + """ cdef ns_int i, j, size_search cdef ns_int d, m cdef ns_int current_beadid, bid @@ -520,6 +859,25 @@ cdef class FastNS(object): def self_search(self): + """Searches all the pairs within the initialized coordinates + + All the pairs among the initialized coordinates are registered + in hald the time. Although the algorithm is still the same, but + the distance checks can be reduced to half in this particular case + as every pair need not be evaluated twice. + + Returns + ------- + results : NSResults object + The object from :class:NSResults + contains ``get_indices``, ``get_distances``. + ``get_pairs``, ``get_pair_distances`` + + SeeAlso + ------- + MDAnalysis.lib.nsgrid.NSResults + + """ cdef ns_int i, j, size_search cdef ns_int d, m cdef ns_int current_beadid, bid From c817b3945253b75be065c3b9fef6c3c5900e5e2b Mon Sep 17 00:00:00 2001 From: ayush Date: Fri, 3 Aug 2018 19:21:13 -0700 Subject: [PATCH 366/455] returning list for get_indices, checked Docs --- package/MDAnalysis/lib/nsgrid.pyx | 139 ++++++++++++------- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 14 +- 2 files changed, 93 insertions(+), 60 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 85207f9da1b..05214b35a68 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -21,18 +21,20 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -# + # cython: cdivision=True # cython: boundscheck=False # cython: initializedcheck=False +# cython: embedsignature=True """ Neighbor search library --- :mod:`MDAnalysis.lib.nsgrid` ======================================================== + About the code ---------------- +-------------- This Neighbor search library is a serialized Cython version greatly inspired by the NS grid search implemented in @@ -45,7 +47,7 @@ was used as reference to write this file. GROMACS 4.x code is released under the GNU Public Licence v2. About the algorithm --------------------- +------------------- The neighbor search implemented here is based on `cell lists `_ which allow computation of pairs [#]_ with a cost of :math:`O(N)`, instead of :math:`O(N^2)`. @@ -61,6 +63,7 @@ greater than the desired search distance, otherwise all of the neighbours might not reflect in the results. + .. [#] a pair correspond to two particles that are considered as neighbors . """ @@ -120,14 +123,16 @@ cdef class PBCBox(object): and to compute PBC-aware distance. The class can also handle non-PBC aware distance evaluations through ``periodic`` argument. - .. warning:: + .. warning:: This class is not meant to be used by end users. - .. warning:: + .. warning:: Even if MD triclinic boxes can be handled by this class, internal optimization is made based on the - assumption that particles are inside a brick-shaped box. When this is not the case, calculated distances are not - warranted to be exact. + assumption that particles are inside a brick-shaped box. When this is not the case, calculated distances are not + warranted to be exact. """ + + cdef cPBCBox_t c_pbcbox cdef bint is_triclinic cdef bint periodic @@ -144,6 +149,7 @@ cdef class PBCBox(object): ``True`` for PBC-aware calculations ``False`` for non PBC aware calculations """ + self.periodic = periodic self.update(box) @@ -154,8 +160,8 @@ cdef class PBCBox(object): PBC-aware distance calculations. The internal box parameters are used to define the brick-shaped box which is eventually used for distance calculations. - """ + """ cdef ns_int i, j cdef real min_hv2, min_ss, tmp @@ -212,7 +218,8 @@ cdef class PBCBox(object): Call to this method is only needed when the MD box is changed as it always called when class is instantiated. - """ + """ + if box.shape[0] != DIM or box.shape[1] != DIM: raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( DIM, DIM, box.shape[0], box.shape[1])) @@ -255,7 +262,9 @@ cdef class PBCBox(object): Returns the distance obeying minimum image convention if periodic is set to ``True`` while instantiating the ``PBCBox`` object. + """ + cdef rvec dx self.fast_pbc_dx(a, b, dx) return rvec_norm2(dx) @@ -267,7 +276,9 @@ cdef class PBCBox(object): All the coordinates are brought into an orthogonal box. The box vectors for the brick-shaped box are defined in ``fast_update`` method. + """ + cdef ns_int i, m, d, natoms cdef real[:,::1] bbox_coords @@ -305,20 +316,8 @@ cdef class NSResults(object): instance of this class. All the methods of :class:`FastNS` returns an instance of this class, which can be used to generate the desired results on demand. - - While more details can be found in individual method description, - a brief list of methods and their returns can be summarized as follows - - ``get_pairs`` : All the pairs of particles within the specified cutoff distance. - - ``get_pair_distances`` : Distance corresponding to every pair of neighbors - - ``get_indices`` : An array with arrays of neighbour corresponding to every individual particle. - - ``get_distances`` : Corresponding distance for every neighbor in ``get_indices`` - - - SeeAlso - ------- - MDAnalysis.lib.nsgrid.FastNS - """ + cdef readonly real cutoff cdef ns_int npairs @@ -344,6 +343,7 @@ cdef class NSResults(object): Array with query coordinates. Shape must be ``(M, 3)`` for ``M`` queries. ``dtype`` must be ``numpy.float32`` """ + self.cutoff = cutoff self.coords = coords self.searchcoords = searchcoords @@ -357,6 +357,7 @@ cdef class NSResults(object): This is the primary function used by :class:`FastNS` to save the pair of atoms, which can be considered as neighbors. """ + self.pairs_buffer.push_back(beadid_i) self.pairs_buffer.push_back(beadid_j) self.pair_distances2_buffer.push_back(distance2) @@ -378,6 +379,7 @@ cdef class NSResults(object): pairs of atom indices of neighbors from query and initial atom coordinates of shape ``(N, 2)`` """ + return np.asarray(self.pairs_buffer).reshape(self.npairs, 2) def get_pair_distances(self): @@ -389,11 +391,18 @@ cdef class NSResults(object): ``pairs[i, 0]`` and ``pairs[i, 1]``, where pairs is the array obtained from ``get_pairs()`` - SeeAlso + Returns ------- + distances : numpy.ndarray + distances between pairs of query and initial + atom coordinates of shape ``N`` + + See Also + -------- MDAnalysis.lib.nsgrid.NSResults.get_pairs """ + self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) return np.asarray(self.pair_distances_buffer) @@ -403,6 +412,7 @@ cdef class NSResults(object): of the query atoms. """ + cdef ns_int i, beadid_i, beadid_j cdef ns_int idx, nsearch cdef real dist2, dist @@ -439,25 +449,38 @@ cdef class NSResults(object): Returns ------- - indices : np.ndarray + indices : list Indices of neighboring atoms. - Every element i.e. ``indices[i]`` will be an array of - shape ``m`` where m is the number of neighbours of - query atom[i]. ``dtype=numpy.int`` + Every element i.e. ``indices[i]`` will be a list of + size ``m`` where m is the number of neighbours of + query atom[i]. + + .. code-block:: python + + results = NSResults() + indices = results.get_indices() + + ``indices[i]`` will output a list of neighboring + atoms of ``atom[i]`` from query atoms ``atom``. + ``indices[i][j]`` will give the atom-id of initial coordinates + such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]`` """ + if self.indices_buffer.empty(): self.create_buffers() - return np.ascontiguousarray(self.indices_buffer) + return list(self.indices_buffer) def get_distances(self): """Distance corresponding to individual neighbors of query atom - For every queried atom ``i``, an array of all the distances - from its neighbors can be obtained from ``get_distances()[i]``. - Every ``distance[i, j]`` will correspond - to the distance between atoms whose indices can be obtained - from ``get_indices()[i, j]`` + For every queried atom ``i``, a list of all the distances + from its neighboring atoms can be obtained from ``get_distances()[i]``. + Every ``distance[i][j]`` will correspond + to the distance between atoms ``atom[i]`` from the query + atoms and ``atom[indices[j]]`` from the initialized + set of coordinates, where ``indices`` can be obtained + by ``get_indices()`` Returns ------- @@ -466,14 +489,25 @@ cdef class NSResults(object): shape ``m`` where m is the number of neighbours of query atom[i]. - SeeAlso - ------- + .. code-block:: python + + results = NSResults() + distances = results.get_distances() + + + atoms of ``atom[i]`` and query atoms ``atom``. + ``indices[i][j]`` will give the atom-id of initial coordinates + such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]`` + + See Also + -------- MDAnalysis.lib.nsgrid.NSResults.get_indices """ + if self.distances_buffer.empty(): self.create_buffers() - return np.ascontiguousarray(self.distances_buffer) + return list(self.distances_buffer) cdef class NSGrid(object): """Constructs a uniform cuboidal grid for a brick-shaped box @@ -498,6 +532,7 @@ cdef class NSGrid(object): :func:`~MDAnalysis.lib.nsgrid.PBCBox.fast_put_atoms_in_bbox` """ + cdef readonly real cutoff # cutoff cdef ns_int size # total cells cdef ns_int ncoords # number of coordinates @@ -525,6 +560,7 @@ cdef class NSGrid(object): force : boolean Optimizes cutoff if set to ``False`` [False] """ + cdef ns_int i cdef ns_int ncellx, ncelly, ncellz, size, nbeadspercell cdef ns_int xi, yi, zi @@ -586,6 +622,7 @@ cdef class NSGrid(object): cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: """Finds actual cell position `(x, y, z)` from a cell-id """ + if cellid < 0: return False if cellid >= self.size: @@ -611,6 +648,7 @@ cdef class NSGrid(object): The method fails if any coordinate is outside the brick shaped box. """ + cdef ns_int i, cellindex = -1 cdef ns_int ncoords = coords.shape[0] cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) @@ -656,7 +694,6 @@ cdef class FastNS(object): Minimum image convention is used for distance evaluations if box dimensions are provided. """ - cdef PBCBox box cdef real[:, ::1] coords cdef real[:, ::1] coords_bbox @@ -701,24 +738,30 @@ cdef class FastNS(object): both are used for Non-PBC aware calculations """ + import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors cdef real[:] pseudobox = np.zeros(6, dtype=np.float32) cdef real[DIM] bmax, bmin - cdef ns_int i + cdef ns_int i, j, ncoords + self.periodic = True + self.coords = coords.copy() + ncoords = len(self.coords) if (box is None) or (np.allclose(box[:3], 0.) and box.shape[0] == 6): - bmax = np.max(coords, axis=0) - bmin = np.min(coords, axis=0) + bmax = np.max(self.coords, axis=0) + bmin = np.min(self.coords, axis=0) for i in range(DIM): pseudobox[i] = 1.1*(bmax[i] - bmin[i]) pseudobox[DIM + i] = 90. box = pseudobox # shift the origin - coords -= bmin + for i in range(ncoords): + for j in range(DIM): + self.coords[i][j] -= bmin[j] self.periodic = False @@ -732,9 +775,9 @@ cdef class FastNS(object): if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") - self.coords = coords.copy() + - self.coords_bbox = self.box.fast_put_atoms_in_bbox(coords) + self.coords_bbox = self.box.fast_put_atoms_in_bbox(self.coords) self.cutoff = cutoff self.max_gridsize = max_gridsize @@ -776,11 +819,12 @@ cdef class FastNS(object): if any of the query coordinates is beyond the specified range of initialized coordinates in :func:`MDAnalysis.lib.nsgrid.FastNS`. - SeeAlso - ------- + See Also + -------- MDAnalysis.lib.nsgrid.NSResults """ + cdef ns_int i, j, size_search cdef ns_int d, m cdef ns_int current_beadid, bid @@ -873,11 +917,12 @@ cdef class FastNS(object): contains ``get_indices``, ``get_distances``. ``get_pairs``, ``get_pair_distances`` - SeeAlso - ------- + See Also + -------- MDAnalysis.lib.nsgrid.NSResults """ + cdef ns_int i, j, size_search cdef ns_int d, m cdef ns_int current_beadid, bid diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index bcb335f59a8..d748808bb28 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -189,16 +189,4 @@ def test_nsgrid_selfsearch(box, result): searcher = nsgrid.FastNS(cutoff, points, box=box) searchresults = searcher.self_search() pairs = searchresults.get_pairs() - assert_equal(len(pairs)//2, result) - -def test_contiguous(universe): - ref_id = 13937 - cutoff = 3 - coords = universe.atoms.positions - searcher = nsgrid.FastNS(cutoff, coords, box=None) - searchresults = searcher.search(coords[ref_id][None, :]) - indices = searchresults.get_indices() - distances = searchresults.get_distances() - - assert indices.flags['C_CONTIGUOUS'] == True - assert distances.flags['C_CONTIGUOUS'] == True + assert_equal(len(pairs)//2, result) \ No newline at end of file From 66d94e5cc760e1789b9ce185d5308b2f92f187af Mon Sep 17 00:00:00 2001 From: ayush Date: Fri, 3 Aug 2018 23:00:27 -0700 Subject: [PATCH 367/455] removed parallel libraries --- package/setup.py | 6 ++---- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/package/setup.py b/package/setup.py index 91a539db326..9343ac793b0 100755 --- a/package/setup.py +++ b/package/setup.py @@ -384,10 +384,8 @@ def extensions(config): ['MDAnalysis/lib/nsgrid' + source_suffix], include_dirs=include_dirs, language='c++', - libraries=parallel_libraries, - define_macros=define_macros + parallel_macros, - extra_compile_args=cpp_extra_compile_args + parallel_args, - extra_link_args=parallel_args) + define_macros=define_macros, + extra_compile_args=cpp_extra_compile_args) pre_exts = [libdcd, distances, distances_omp, qcprot, transformation, libmdaxdr, util, encore_utils, ap_clustering, spe_dimred, cutil, augment, nsgrid] diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index a073057cf77..c161949f9d4 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -119,7 +119,6 @@ def test_searchpairs(b, radius, result): indices = tree.search_pairs(radius) assert_equal(len(indices), len(result)) - @pytest.mark.parametrize('radius, result', ((0.1, []), (0.3, [[0, 2]]))) def test_ckd_searchpairs_nopbc(radius, result): From e28c70a6167123221f6993e7aec30d37c046822b Mon Sep 17 00:00:00 2001 From: ayush Date: Sun, 5 Aug 2018 18:53:07 -0700 Subject: [PATCH 368/455] solved contiguous issue, fixed tests, and added checks in API --- package/MDAnalysis/lib/nsgrid.pyx | 1974 +++++++++--------- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 30 +- 2 files changed, 1002 insertions(+), 1002 deletions(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 05214b35a68..96ee469efde 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -1,991 +1,983 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 -# -# MDAnalysis --- https://www.mdanalysis.org -# -# Copyright (C) 2013-2018 Sébastien Buchoux -# Copyright (c) 2018 The MDAnalysis Development Team and contributors -# (see the file AUTHORS for the full list of names) -# -# Released under the GNU Public Licence, v3 or any higher version -# -# Please cite your use of MDAnalysis in published work: -# -# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, -# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. -# MDAnalysis: A Python package for the rapid analysis of molecular dynamics -# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th -# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. -# -# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. -# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. -# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 -# - - -# cython: cdivision=True -# cython: boundscheck=False -# cython: initializedcheck=False -# cython: embedsignature=True - -""" -Neighbor search library --- :mod:`MDAnalysis.lib.nsgrid` -======================================================== - - -About the code --------------- - -This Neighbor search library is a serialized Cython version greatly -inspired by the NS grid search implemented in -`GROMACS `_ . - -GROMACS 4.x code (more precisely `nsgrid.c `_ -and `ns.c `_ ) -was used as reference to write this file. - -GROMACS 4.x code is released under the GNU Public Licence v2. - -About the algorithm -------------------- - -The neighbor search implemented here is based on `cell lists `_ which allow -computation of pairs [#]_ with a cost of :math:`O(N)`, instead of :math:`O(N^2)`. -The basic algorithm is described in Appendix F, Page 552 of -``Understanding Molecular Dynamics: From Algorithm to Applications`` by Frenkel and Smit. - -In brief, the algorithm divides the domain into smaller subdomains called `cells` -and distributes every particle to these cells based on its position. Subsequently, -any distance based query first identifies the corresponding cell position in the -domain followed by distance evaluations within the identified cell and -neighboring cells only. Care must be taken to ensure that `cellsize` is -greater than the desired search distance, otherwise all of the neighbours might -not reflect in the results. - - - -.. [#] a pair correspond to two particles that are considered as neighbors . - -""" - - -# Preprocessor DEFs -DEF DIM = 3 -DEF XX = 0 -DEF YY = 1 -DEF ZZ = 2 - -DEF EPSILON = 1e-5 - - -# Used to handle memory allocation -from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free -from libc.math cimport sqrt -import numpy as np -cimport numpy as np -from libcpp.vector cimport vector - - -ctypedef np.int_t ns_int -ctypedef np.float32_t real -ctypedef real rvec[DIM] -ctypedef ns_int ivec[DIM] -ctypedef real matrix[DIM][DIM] - -ctypedef vector[ns_int] intvec -ctypedef vector[real] realvec - -# Useful Functions -cdef real rvec_norm2(const rvec a) nogil: - return a[XX]*a[XX]+a[YY]*a[YY]+a[ZZ]*a[ZZ] - -cdef void rvec_clear(rvec a) nogil: - a[XX]=0.0 - a[YY]=0.0 - a[ZZ]=0.0 - -############################### -# Utility class to handle PBC # -############################### -cdef struct cPBCBox_t: - matrix box - rvec fbox_diag - rvec hbox_diag - rvec mhbox_diag - real max_cutoff2 - - -# Class to handle PBC calculations -cdef class PBCBox(object): - """ - Cython implementation of `PBC-related `_ operations. - This class is used by classes :class:`FastNS` and :class:`NSGrid` to put all particles inside a brick-shaped box - and to compute PBC-aware distance. The class can also handle non-PBC aware distance evaluations through - ``periodic`` argument. - - .. warning:: - This class is not meant to be used by end users. - - .. warning:: - Even if MD triclinic boxes can be handled by this class, internal optimization is made based on the - assumption that particles are inside a brick-shaped box. When this is not the case, calculated distances are not - warranted to be exact. - """ - - - cdef cPBCBox_t c_pbcbox - cdef bint is_triclinic - cdef bint periodic - - def __init__(self, real[:,::1] box, bint periodic): - """ - Parameters - ---------- - box : numpy.ndarray - box vectors of shape ``(3, 3)`` or - as returned by ``MDAnalysis.lib.mdamath.triclinic_vectors`` - ``dtype`` must be ``numpy.float32`` - periodic : boolean - ``True`` for PBC-aware calculations - ``False`` for non PBC aware calculations - """ - - self.periodic = periodic - self.update(box) - - - cdef void fast_update(self, real[:,::1] box) nogil: - """ - Updates the internal box parameters for - PBC-aware distance calculations. The internal - box parameters are used to define the brick-shaped - box which is eventually used for distance calculations. - - """ - cdef ns_int i, j - cdef real min_hv2, min_ss, tmp - - # Update matrix - self.is_triclinic = False - for i in range(DIM): - for j in range(DIM): - self.c_pbcbox.box[i][j] = box[i, j] - - if i != j: - if box[i, j] > EPSILON: - self.is_triclinic = True - - # Update diagonals - for i in range(DIM): - self.c_pbcbox.fbox_diag[i] = box[i, i] - self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 - self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] - - # Update maximum cutoff - - # Physical limitation of the cut-off - # by half the length of the shortest box vector. - min_hv2 = min(0.25 * rvec_norm2(&box[XX, XX]), 0.25 * rvec_norm2(&box[YY, XX])) - min_hv2 = min(min_hv2, 0.25 * rvec_norm2(&box[ZZ, XX])) - - # Limitation to the smallest diagonal element due to optimizations: - # checking only linear combinations of single box-vectors (2 in x) - # in the grid search and pbc_dx is a lot faster - # than checking all possible combinations. - tmp = box[YY, YY] - if box[ZZ, YY] < 0: - tmp -= box[ZZ, YY] - else: - tmp += box[ZZ, YY] - - min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) - self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) - - def update(self, real[:,::1] box): - """ - Updates internal MD box representation and parameters used for calculations. - - - Parameters - ---------- - box : numpy.ndarray - Describes the MD box vectors as returned by - :func:`MDAnalysis.lib.mdamath.triclinic_vectors`. - `dtype` must be :class:`numpy.float32` - - Note - ---- - Call to this method is only needed when the MD box is changed - as it always called when class is instantiated. - - """ - - if box.shape[0] != DIM or box.shape[1] != DIM: - raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( - DIM, DIM, box.shape[0], box.shape[1])) - if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): - raise ValueError("Box does not correspond to PBC=xyz") - self.fast_update(box) - - - cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: - """Dislacement between two points for both - PBC and non-PBC conditions - - Modifies the displacement vector between two points based - on the minimum image convention for PBC aware calculations. - - For non-PBC aware distance evaluations, calculates the - displacement vector without any modifications - """ - - cdef ns_int i, j - - for i in range(DIM): - dx[i] = other[i] - ref[i] - - if self.periodic: - for i in range (DIM-1, -1, -1): - while dx[i] > self.c_pbcbox.hbox_diag[i]: - for j in range (i, -1, -1): - dx[j] -= self.c_pbcbox.box[i][j] - - while dx[i] <= self.c_pbcbox.mhbox_diag[i]: - for j in range (i, -1, -1): - dx[j] += self.c_pbcbox.box[i][j] - - - cdef real fast_distance2(self, rvec a, rvec b) nogil: - """Distance calculation between two points - for both PBC and non-PBC aware calculations - - Returns the distance obeying minimum - image convention if periodic is set to ``True`` while - instantiating the ``PBCBox`` object. - - """ - - cdef rvec dx - self.fast_pbc_dx(a, b, dx) - return rvec_norm2(dx) - - - cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:,::1] coords) nogil: - """Shifts all ``coords`` to an orthogonal brick shaped box - - All the coordinates are brought into an orthogonal - box. The box vectors for the brick-shaped box - are defined in ``fast_update`` method. - - """ - - cdef ns_int i, m, d, natoms - cdef real[:,::1] bbox_coords - - natoms = coords.shape[0] - with gil: - bbox_coords = coords.copy() - - if self.periodic: - if self.is_triclinic: - for i in range(natoms): - for m in range(DIM - 1, -1, -1): - while bbox_coords[i, m] < 0: - for d in range(m+1): - bbox_coords[i, d] += self.c_pbcbox.box[m][d] - while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: - for d in range(m+1): - bbox_coords[i, d] -= self.c_pbcbox.box[m][d] - else: - for i in range(natoms): - for m in range(DIM): - while bbox_coords[i, m] < 0: - bbox_coords[i, m] += self.c_pbcbox.box[m][m] - while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: - bbox_coords[i, m] -= self.c_pbcbox.box[m][m] - return bbox_coords - -######################### -# Neighbor Search Stuff # -######################### - -cdef class NSResults(object): - """Class to store the results - - All the required outputs from :class:`FastNS` is stored in the - instance of this class. All the methods of :class:`FastNS` returns - an instance of this class, which can be used to generate the desired - results on demand. - """ - - cdef readonly real cutoff - cdef ns_int npairs - - cdef real[:, ::1] coords # shape: size, DIM - cdef real[:, ::1] searchcoords - - cdef vector[intvec] indices_buffer - cdef vector[realvec] distances_buffer - cdef vector[ns_int] pairs_buffer - cdef vector[real] pair_distances_buffer - cdef vector[real] pair_distances2_buffer - - def __init__(self, real cutoff, real[:, ::1]coords, real[:, ::1]searchcoords): - """ - Parameters - ---------- - cutoff : float - Specified cutoff distance - coords : numpy.ndarray - Array with coordinates of atoms of shape ``(N, 3)`` for - ``N`` particles. ``dtype`` must be ``numpy.float32`` - searchcoords : numpy.ndarray - Array with query coordinates. Shape must be ``(M, 3)`` - for ``M`` queries. ``dtype`` must be ``numpy.float32`` - """ - - self.cutoff = cutoff - self.coords = coords - self.searchcoords = searchcoords - - self.npairs = 0 - - cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: - """Internal function to add pairs and distances to buffers - - The buffers populated using this method are used by other methods of this class. - This is the primary function used by :class:`FastNS` to save the pair of atoms, - which can be considered as neighbors. - """ - - self.pairs_buffer.push_back(beadid_i) - self.pairs_buffer.push_back(beadid_j) - self.pair_distances2_buffer.push_back(distance2) - self.npairs += 1 - - def get_pairs(self): - """Returns all the pairs within the desired cutoff distance - - Returns an array of shape ``(N, 2)``, where N is the number of pairs - between ``reference`` and ``configuration`` within the specified distance. - For every pair ``(i, j)``, ``reference[i]`` and ``configuration[j]`` are - atom positions such that ``reference`` is the position of query - atoms while ``configuration`` coontains the position of group of - atoms used to search against the query atoms. - - Returns - ------- - pairs : numpy.ndarray - pairs of atom indices of neighbors from query - and initial atom coordinates of shape ``(N, 2)`` - """ - - return np.asarray(self.pairs_buffer).reshape(self.npairs, 2) - - def get_pair_distances(self): - """Returns all the distances corresponding to each pair of neighbors - - Returns an array of shape ``N`` where N is the number of pairs - among the query atoms and initial atoms within a specified distance. - Every element ``[i]`` corresponds to the distance between - ``pairs[i, 0]`` and ``pairs[i, 1]``, where pairs is the array - obtained from ``get_pairs()`` - - Returns - ------- - distances : numpy.ndarray - distances between pairs of query and initial - atom coordinates of shape ``N`` - - See Also - -------- - MDAnalysis.lib.nsgrid.NSResults.get_pairs - - """ - - self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) - return np.asarray(self.pair_distances_buffer) - - cdef void create_buffers(self) nogil: - """ - Creates buffers to get individual neighbour list and distances - of the query atoms. - - """ - - cdef ns_int i, beadid_i, beadid_j - cdef ns_int idx, nsearch - cdef real dist2, dist - - nsearch = len(self.searchcoords) - - self.indices_buffer = vector[intvec]() - self.distances_buffer = vector[realvec]() - - # initialize rows corresponding to search - for i in range(nsearch): - self.indices_buffer.push_back(intvec()) - self.distances_buffer.push_back(realvec()) - - - for i in range(0, 2*self.npairs, 2): - beadid_i = self.pairs_buffer[i] - beadid_j = self.pairs_buffer[i + 1] - - dist2 = self.pair_distances2_buffer[i//2] - - self.indices_buffer[beadid_i].push_back(beadid_j) - - dist = sqrt(dist2) - - self.distances_buffer[beadid_i].push_back(dist) - - - def get_indices(self): - """Individual neighbours of query atom - - For every queried atom ``i``, an array of all its neighbors - indices can be obtained from ``get_indices()[i]`` - - Returns - ------- - indices : list - Indices of neighboring atoms. - Every element i.e. ``indices[i]`` will be a list of - size ``m`` where m is the number of neighbours of - query atom[i]. - - .. code-block:: python - - results = NSResults() - indices = results.get_indices() - - ``indices[i]`` will output a list of neighboring - atoms of ``atom[i]`` from query atoms ``atom``. - ``indices[i][j]`` will give the atom-id of initial coordinates - such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]`` - - """ - - if self.indices_buffer.empty(): - self.create_buffers() - return list(self.indices_buffer) - - def get_distances(self): - """Distance corresponding to individual neighbors of query atom - - For every queried atom ``i``, a list of all the distances - from its neighboring atoms can be obtained from ``get_distances()[i]``. - Every ``distance[i][j]`` will correspond - to the distance between atoms ``atom[i]`` from the query - atoms and ``atom[indices[j]]`` from the initialized - set of coordinates, where ``indices`` can be obtained - by ``get_indices()`` - - Returns - ------- - distances : np.ndarray - Every element i.e. ``distances[i]`` will be an array of - shape ``m`` where m is the number of neighbours of - query atom[i]. - - .. code-block:: python - - results = NSResults() - distances = results.get_distances() - - - atoms of ``atom[i]`` and query atoms ``atom``. - ``indices[i][j]`` will give the atom-id of initial coordinates - such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]`` - - See Also - -------- - MDAnalysis.lib.nsgrid.NSResults.get_indices - - """ - - if self.distances_buffer.empty(): - self.create_buffers() - return list(self.distances_buffer) - -cdef class NSGrid(object): - """Constructs a uniform cuboidal grid for a brick-shaped box - - This class uses :class:`PBCBox` to define the brick shaped box. - It is essential to initialize the box with :class:`PBCBox` - inorder to form the grid. - - The domain is subdivided into number of cells based on the desired search - radius. Ideally cellsize should be equal to the search radius, but small - search radius leads to large cell-list data strucutres. - An optimization of cutoff is imposed to limit the size of data - structure such that the cellsize is always greater than or - equal to cutoff distance. - - Note - ---- - This class assumes that all the coordinates are already - inside the brick shaped box. Care must be taken to ensure - all the particles are within the brick shaped box as - defined by :class:`PBCBox`. This can be ensured by using - :func:`~MDAnalysis.lib.nsgrid.PBCBox.fast_put_atoms_in_bbox` - - """ - - cdef readonly real cutoff # cutoff - cdef ns_int size # total cells - cdef ns_int ncoords # number of coordinates - cdef ns_int[DIM] ncells # individual cells in every dimension - cdef ns_int[DIM] cell_offsets # Cell Multipliers - cdef real[DIM] cellsize # cell size in every dimension - cdef ns_int nbeads_per_cell # maximum beads - cdef ns_int *nbeads # size (Number of beads in every cell) - cdef ns_int *beadids # size * nbeads_per_cell (Beadids in every cell) - cdef ns_int *cellids # ncoords (Cell occupation id for every atom) - cdef bint force # To negate the effects of optimized cutoff - - def __init__(self, ncoords, cutoff, PBCBox box, max_size, force=False): - """ - Parameters - ---------- - ncoords : int - Number of coordinates to fill inside the brick shaped box - cutoff : float - Desired cutoff radius - box : PBCBox - Instance of :class:`PBCBox` - max_size : int - Maximum total number of cells - force : boolean - Optimizes cutoff if set to ``False`` [False] - """ - - cdef ns_int i - cdef ns_int ncellx, ncelly, ncellz, size, nbeadspercell - cdef ns_int xi, yi, zi - cdef real bbox_vol - - - self.ncoords = ncoords - - # Calculate best cutoff - self.cutoff = cutoff - if not force: - bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] - size = bbox_vol/cutoff**3 - nbeadspercell = ncoords/size - while bbox_vol/self.cutoff**3 > max_size: - self.cutoff *= 1.2 - - for i in range(DIM): - self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) - self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] - self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] - - - self.cell_offsets[XX] = 0 - self.cell_offsets[YY] = self.ncells[XX] - self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] - - # Allocate memory - self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) - if not self.nbeads: - raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) - self.beadids = NULL - self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) - if not self.cellids: - raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) - self.nbeads_per_cell = 0 - - for i in range(self.size): - self.nbeads[i] = 0 - - def __dealloc__(self): - PyMem_Free(self.nbeads) - PyMem_Free(self.beadids) - PyMem_Free(self.cellids) - - cdef ns_int coord2cellid(self, rvec coord) nogil: - """Finds the cell-id for the given coordinate inside the brick shaped box - - Note - ---- - Assumes the coordinate is already inside the brick shaped box. - Return wrong cell-id if this is not the case - """ - return (coord[ZZ] / self.cellsize[ZZ]) * (self.cell_offsets[ZZ]) +\ - (coord[YY] / self.cellsize[YY]) * self.cell_offsets[YY] + \ - (coord[XX] / self.cellsize[XX]) - - - cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: - """Finds actual cell position `(x, y, z)` from a cell-id - """ - - if cellid < 0: - return False - if cellid >= self.size: - return False - - cellxyz[ZZ] = (cellid / self.cell_offsets[ZZ]) - cellid -= cellxyz[ZZ] * self.cell_offsets[ZZ] - - cellxyz[YY] = (cellid / self.cell_offsets[YY]) - cellxyz[XX] = cellid - cellxyz[YY] * self.cell_offsets[YY] - - return True - - cdef fill_grid(self, real[:, ::1] coords): - """Sorts atoms into cells based on their position in the brick shaped box - - Every atom inside the brick shaped box is assigned a - cell-id based on its position. Another list ``beadids`` - sort the atom-ids in each cell. - - Note - ---- - The method fails if any coordinate is outside the brick shaped box. - - """ - - cdef ns_int i, cellindex = -1 - cdef ns_int ncoords = coords.shape[0] - cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) - - with nogil: - # Initialize buffers - for i in range(self.size): - beadcounts[i] = 0 - - # First loop: find cellindex for each bead - for i in range(ncoords): - cellindex = self.coord2cellid(&coords[i, 0]) - - self.nbeads[cellindex] += 1 - self.cellids[i] = cellindex - - if self.nbeads[cellindex] > self.nbeads_per_cell: - self.nbeads_per_cell = self.nbeads[cellindex] - - # Allocate memory - self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) #np.empty((self.size, nbeads_max), dtype=np.int) - if not self.beadids: - raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) - - with nogil: - # Second loop: fill grid - for i in range(ncoords): - - # Add bead to grid cell - cellindex = self.cellids[i] - self.beadids[cellindex * self.nbeads_per_cell + beadcounts[cellindex]] = i - beadcounts[cellindex] += 1 - - - -cdef class FastNS(object): - """Grid based search between two group of atoms - - Instantiates a class object which uses :class:`PBCBox` and - :class:`NSGrid` to construct a cuboidal - grid in an orthogonal brick shaped box. - - Minimum image convention is used for distance evaluations - if box dimensions are provided. - """ - cdef PBCBox box - cdef real[:, ::1] coords - cdef real[:, ::1] coords_bbox - cdef readonly real cutoff - cdef NSGrid grid - cdef ns_int max_gridsize - cdef bint periodic - - - def __init__(self, cutoff, coords, box=None, max_gridsize=5000): - """ - Initialize the grid and sort the coordinates in respective - cells by shifting the coordinates in a brick shaped box. - The brick shaped box is defined by :class:`PBCBox` - and cuboidal grid is initialize by :class:`NSGrid`. - If box is supplied, periodic shifts along box vectors are used - to contain all the coordinates inside the brick shaped box. - If box is not supplied, the range of coordinates i.e. - ``[xmax, ymax, zmax] - [xmin, ymin, zmin]`` is used to construct - a pseudo box. Subsequently, the origin is also shifted - to the ``[xmin, ymin, zmin]``. - - Parameters - ---------- - cutoff : float - Desired cutoff distance - coords : numpy.ndarray - atom coordinates of shape ``(N, 3)`` for ``N`` atoms. - ``dtype=numpy.float32`` - box : numpy.ndarray - Box dimension of shape (6, ). The dimensions must be - provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx, ly, lz, alpha, beta, gamma]`` (dtype = numpy.float32) - [None] - max_gridsize : int - maximum number of cells in the grid - - Note - ---- - box=``None`` and ``[0., 0., 0., 90., 90., 90]`` - both are used for Non-PBC aware calculations - - """ - - import MDAnalysis as mda - from MDAnalysis.lib.mdamath import triclinic_vectors - - cdef real[:] pseudobox = np.zeros(6, dtype=np.float32) - cdef real[DIM] bmax, bmin - cdef ns_int i, j, ncoords - - self.periodic = True - self.coords = coords.copy() - ncoords = len(self.coords) - - - if (box is None) or (np.allclose(box[:3], 0.) and box.shape[0] == 6): - bmax = np.max(self.coords, axis=0) - bmin = np.min(self.coords, axis=0) - for i in range(DIM): - pseudobox[i] = 1.1*(bmax[i] - bmin[i]) - pseudobox[DIM + i] = 90. - box = pseudobox - # shift the origin - for i in range(ncoords): - for j in range(DIM): - self.coords[i][j] -= bmin[j] - self.periodic = False - - - if box.shape != (3,3): - box = triclinic_vectors(box) - - self.box = PBCBox(box, self.periodic) - - if cutoff < 0: - raise ValueError("Cutoff must be positive!") - if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: - raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") - - - - self.coords_bbox = self.box.fast_put_atoms_in_bbox(self.coords) - - self.cutoff = cutoff - self.max_gridsize = max_gridsize - # Note that self.cutoff might be different from self.grid.cutoff - self.grid = NSGrid(self.coords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) - - self.grid.fill_grid(self.coords_bbox) - - - - def search(self, search_coords): - """Search a group of atoms against initialized coordinates - - Creates a new grid with the query atoms and searches - against the initialized coordinates. The search is exclusive - i.e. only the pairs ``(i, j)`` such that ``atom[i]`` from query atoms - and ``atom[j]`` from the initialized set of coordinates is stored as - neighbors. - - PBC-aware/non PBC-aware calculations are automatically enabled during - the instantiation of :class:FastNS. - - Parameters - ---------- - search_coords : numpy.ndarray - Query coordinates of shape ``(N, 3)`` where - ``N`` is the number of queries - - Returns - ------- - results : NSResults object - The object from :class:NSResults - contains ``get_indices``, ``get_distances``. - ``get_pairs``, ``get_pair_distances`` - - Note - ---- - For non-PBC aware calculations, the current implementation doesn't work - if any of the query coordinates is beyond the specified range of - initialized coordinates in :func:`MDAnalysis.lib.nsgrid.FastNS`. - - See Also - -------- - MDAnalysis.lib.nsgrid.NSResults - - """ - - cdef ns_int i, j, size_search - cdef ns_int d, m - cdef ns_int current_beadid, bid - cdef ns_int cellindex, cellindex_probe - cdef ns_int xi, yi, zi - - cdef NSResults results - - cdef real d2 - cdef rvec probe - - cdef real[:, ::1] searchcoords - cdef real[:, ::1] searchcoords_bbox - cdef NSGrid searchgrid - cdef bint check - - - cdef real cutoff2 = self.cutoff * self.cutoff - cdef ns_int npairs = 0 - - # Generate another grid to search - searchcoords = np.asarray(search_coords, dtype=np.float32) - searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) - searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) - searchgrid.fill_grid(searchcoords_bbox) - - - size_search = searchcoords.shape[0] - - results = NSResults(self.cutoff, self.coords, searchcoords) - - with nogil: - for i in range(size_search): - # Start with first search coordinate - current_beadid = i - # find the cellindex of the coordinate - cellindex = searchgrid.cellids[current_beadid] - for xi in range(DIM): - for yi in range(DIM): - for zi in range(DIM): - check = True - #Probe the search coordinates in a brick shaped box - probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] - probe[YY] = searchcoords_bbox[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] - probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] - # Make sure the probe coordinates is inside the brick-shaped box - if self.periodic: - for m in range(DIM - 1, -1, -1): - while probe[m] < 0: - for d in range(m+1): - probe[d] += self.box.c_pbcbox.box[m][d] - while probe[m] >= self.box.c_pbcbox.box[m][m]: - for d in range(m+1): - probe[d] -= self.box.c_pbcbox.box[m][d] - else: - for m in range(DIM -1, -1, -1): - if probe[m] < 0: - check = False - break - if probe[m] > self.box.c_pbcbox.box[m][m]: - check = False - break - if not check: - continue - # Get the cell index corresponding to the probe - cellindex_probe = self.grid.coord2cellid(probe) - #for this cellindex search in grid - for j in range(self.grid.nbeads[cellindex_probe]): - bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] - #find distance between search coords[i] and coords[bid] - d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) - if d2 < cutoff2 and d2 > EPSILON: - results.add_neighbors(current_beadid, bid, d2) - npairs += 1 - return results - - - def self_search(self): - """Searches all the pairs within the initialized coordinates - - All the pairs among the initialized coordinates are registered - in hald the time. Although the algorithm is still the same, but - the distance checks can be reduced to half in this particular case - as every pair need not be evaluated twice. - - Returns - ------- - results : NSResults object - The object from :class:NSResults - contains ``get_indices``, ``get_distances``. - ``get_pairs``, ``get_pair_distances`` - - See Also - -------- - MDAnalysis.lib.nsgrid.NSResults - - """ - - cdef ns_int i, j, size_search - cdef ns_int d, m - cdef ns_int current_beadid, bid - cdef ns_int cellindex, cellindex_probe - cdef ns_int xi, yi, zi - - cdef NSResults results - cdef real d2 - cdef rvec probe - - cdef real cutoff2 = self.cutoff * self.cutoff - cdef ns_int npairs = 0 - cdef bint check - - size_search = self.coords.shape[0] - - results = NSResults(self.cutoff, self.coords, self.coords) - - with nogil: - for i in range(size_search): - # Start with first search coordinate - current_beadid = i - # find the cellindex of the coordinate - cellindex = self.grid.cellids[current_beadid] - for xi in range(DIM): - for yi in range(DIM): - for zi in range(DIM): - check = True - # Calculate and/or reinitialize shifted coordinates - #Probe the search coordinates in a brick shaped box - probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] - probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[XX] - probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[XX] - # Make sure the shifted coordinates is inside the brick-shaped box - if self.periodic: - for m in range(DIM - 1, -1, -1): - while probe[m] < 0: - for d in range(m+1): - probe[d] += self.box.c_pbcbox.box[m][d] - while probe[m] >= self.box.c_pbcbox.box[m][m]: - for d in range(m+1): - probe[d] -= self.box.c_pbcbox.box[m][d] - else: - for m in range(DIM -1, -1, -1): - if probe[m] < 0: - check = False - break - elif probe[m] > self.box.c_pbcbox.box[m][m]: - check = False - break - if not check: - continue - # Get the cell index corresponding to the probe - cellindex_probe = self.grid.coord2cellid(probe) - #for this cellindex search in grid - for j in range(self.grid.nbeads[cellindex_probe]): - bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] - if bid < current_beadid: - continue - #find distance between search coords[i] and coords[bid] - d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) - if d2 < cutoff2 and d2 > EPSILON: - results.add_neighbors(current_beadid, bid, d2) - results.add_neighbors(bid, current_beadid, d2) - npairs += 1 - return results +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# +# Copyright (C) 2013-2018 Sébastien Buchoux +# Copyright (c) 2018 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v3 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + + +# cython: cdivision=True +# cython: boundscheck=False +# cython: initializedcheck=False +# cython: embedsignature=True + +""" +Neighbor search library --- :mod:`MDAnalysis.lib.nsgrid` +======================================================== + + +About the code +-------------- + +This Neighbor search library is a serialized Cython version greatly +inspired by the NS grid search implemented in +`GROMACS `_ . + +GROMACS 4.x code (more precisely +`nsgrid.c `_ +and `ns.c `_ ) +was used as reference to write this file. + +GROMACS 4.x code is released under the GNU Public Licence v2. + +About the algorithm +------------------- + +The neighbor search implemented here is based on +`cell lists `_ which allow +computation of pairs [#]_ with a cost of :math:`O(N)`, instead +of :math:`O(N^2)`. The basic algorithm is described in +Appendix F, Page 552 of +``Understanding Molecular Dynamics: From Algorithm to Applications`` by Frenkel and Smit. + +In brief, the algorithm divides the domain into smaller subdomains called `cells` +and distributes every particle to these cells based on its position. Subsequently, +any distance based query first identifies the corresponding cell position in the +domain followed by distance evaluations within the identified cell and +neighboring cells only. Care must be taken to ensure that `cellsize` is +greater than the desired search distance, otherwise all of the neighbours might +not reflect in the results. + + +.. [#] a pair correspond to two particles that are considered as neighbors . + + +.. versionadded:: 0.19.0 +""" + +from MDAnalysis.lib.distances import _check_array +# Used to handle memory allocation +from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free +from libc.math cimport sqrt +import numpy as np +from libcpp.vector cimport vector +cimport numpy as np + +# Preprocessor DEFs +DEF DIM = 3 +DEF XX = 0 +DEF YY = 1 +DEF ZZ = 2 +DEF EPSILON = 1e-5 + +ctypedef np.int_t ns_int +ctypedef np.float32_t real +ctypedef real rvec[DIM] +ctypedef ns_int ivec[DIM] +ctypedef real matrix[DIM][DIM] + +ctypedef vector[ns_int] intvec +ctypedef vector[real] realvec + +# Useful Functions +cdef real rvec_norm2(const rvec a) nogil: + return a[XX]*a[XX] + a[YY]*a[YY] + a[ZZ]*a[ZZ] + +cdef void rvec_clear(rvec a) nogil: + a[XX] = 0.0 + a[YY] = 0.0 + a[ZZ] = 0.0 + +############################### +# Utility class to handle PBC # +############################### +cdef struct cPBCBox_t: + matrix box + rvec fbox_diag + rvec hbox_diag + rvec mhbox_diag + real max_cutoff2 + + +# Class to handle PBC calculations +cdef class PBCBox(object): + """ + Cython implementation of + `PBC-related `_ + operations. This class is used by classes :class:`FastNS` + and :class:`NSGrid` to put all particles inside a brick-shaped box + and to compute PBC-aware distance. The class can also handle + non-PBC aware distance evaluations through ``periodic`` argument. + + .. warning:: + This class is not meant to be used by end users. + + .. warning:: + Even if MD triclinic boxes can be handled by this class, internal optimization is made based on the + assumption that particles are inside a brick-shaped box. When this is not the case, calculated distances are not + warranted to be exact. + """ + + cdef cPBCBox_t c_pbcbox + cdef bint is_triclinic + cdef bint periodic + + def __init__(self, real[:, ::1] box, bint periodic): + """ + Parameters + ---------- + box : numpy.ndarray + box vectors of shape ``(3, 3)`` or + as returned by ``MDAnalysis.lib.mdamath.triclinic_vectors`` + ``dtype`` must be ``numpy.float32`` + periodic : boolean + ``True`` for PBC-aware calculations + ``False`` for non PBC aware calculations + """ + + self.periodic = periodic + self.update(box) + + cdef void fast_update(self, real[:, ::1] box) nogil: + """ + Updates the internal box parameters for + PBC-aware distance calculations. The internal + box parameters are used to define the brick-shaped + box which is eventually used for distance calculations. + + """ + cdef ns_int i, j + cdef real min_hv2, min_ss, tmp + + # Update matrix + self.is_triclinic = False + for i in range(DIM): + for j in range(DIM): + self.c_pbcbox.box[i][j] = box[i, j] + + if i != j: + if box[i, j] > EPSILON: + self.is_triclinic = True + + # Update diagonals + for i in range(DIM): + self.c_pbcbox.fbox_diag[i] = box[i, i] + self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 + self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] + + # Update maximum cutoff + + # Physical limitation of the cut-off + # by half the length of the shortest box vector. + min_hv2 = min(0.25 * rvec_norm2(&box[XX, XX]), 0.25 * rvec_norm2(&box[YY, XX])) + min_hv2 = min(min_hv2, 0.25 * rvec_norm2(&box[ZZ, XX])) + + # Limitation to the smallest diagonal element due to optimizations: + # checking only linear combinations of single box-vectors (2 in x) + # in the grid search and pbc_dx is a lot faster + # than checking all possible combinations. + tmp = box[YY, YY] + if box[ZZ, YY] < 0: + tmp -= box[ZZ, YY] + else: + tmp += box[ZZ, YY] + + min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) + self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) + + def update(self, real[:, ::1] box): + """ + Updates internal MD box representation and parameters used for calculations. + + Parameters + ---------- + box : numpy.ndarray + Describes the MD box vectors as returned by + :func:`MDAnalysis.lib.mdamath.triclinic_vectors`. + `dtype` must be :class:`numpy.float32` + + Note + ---- + Call to this method is only needed when the MD box is changed + as it always called when class is instantiated. + + """ + + if box.shape[0] != DIM or box.shape[1] != DIM: + raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( + DIM, DIM, box.shape[0], box.shape[1])) + if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + raise ValueError("Box does not correspond to PBC=xyz") + self.fast_update(box) + + cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: + """Dislacement between two points for both + PBC and non-PBC conditions + + Modifies the displacement vector between two points based + on the minimum image convention for PBC aware calculations. + + For non-PBC aware distance evaluations, calculates the + displacement vector without any modifications + """ + + cdef ns_int i, j + + for i in range(DIM): + dx[i] = other[i] - ref[i] + + if self.periodic: + for i in range(DIM-1, -1, -1): + while dx[i] > self.c_pbcbox.hbox_diag[i]: + for j in range(i, -1, -1): + dx[j] -= self.c_pbcbox.box[i][j] + + while dx[i] <= self.c_pbcbox.mhbox_diag[i]: + for j in range(i, -1, -1): + dx[j] += self.c_pbcbox.box[i][j] + + cdef real fast_distance2(self, rvec a, rvec b) nogil: + """Distance calculation between two points + for both PBC and non-PBC aware calculations + + Returns the distance obeying minimum + image convention if periodic is set to ``True`` while + instantiating the ``PBCBox`` object. + """ + + cdef rvec dx + self.fast_pbc_dx(a, b, dx) + return rvec_norm2(dx) + + cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:, ::1] coords) nogil: + """Shifts all ``coords`` to an orthogonal brick shaped box + + All the coordinates are brought into an orthogonal + box. The box vectors for the brick-shaped box + are defined in ``fast_update`` method. + + """ + + cdef ns_int i, m, d, natoms + cdef real[:, ::1] bbox_coords + + natoms = coords.shape[0] + with gil: + bbox_coords = coords.copy() + + if self.periodic: + if self.is_triclinic: + for i in range(natoms): + for m in range(DIM - 1, -1, -1): + while bbox_coords[i, m] < 0: + for d in range(m+1): + bbox_coords[i, d] += self.c_pbcbox.box[m][d] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + for d in range(m+1): + bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + else: + for i in range(natoms): + for m in range(DIM): + while bbox_coords[i, m] < 0: + bbox_coords[i, m] += self.c_pbcbox.box[m][m] + while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + bbox_coords[i, m] -= self.c_pbcbox.box[m][m] + return bbox_coords + +######################### +# Neighbor Search Stuff # +######################### + +cdef class NSResults(object): + """Class to store the results + + All the required outputs from :class:`FastNS` is stored in the + instance of this class. All the methods of :class:`FastNS` returns + an instance of this class, which can be used to generate the desired + results on demand. + """ + + cdef readonly real cutoff + cdef ns_int npairs + + cdef real[:, ::1] coords # shape: size, DIM + cdef real[:, ::1] searchcoords + + cdef vector[intvec] indices_buffer + cdef vector[realvec] distances_buffer + cdef vector[ns_int] pairs_buffer + cdef vector[real] pair_distances_buffer + cdef vector[real] pair_distances2_buffer + + def __init__(self, real cutoff, real[:, ::1]coords, real[:, ::1]searchcoords): + """ + Parameters + ---------- + cutoff : float + Specified cutoff distance + coords : numpy.ndarray + Array with coordinates of atoms of shape ``(N, 3)`` for + ``N`` particles. ``dtype`` must be ``numpy.float32`` + searchcoords : numpy.ndarray + Array with query coordinates. Shape must be ``(M, 3)`` + for ``M`` queries. ``dtype`` must be ``numpy.float32`` + """ + + self.cutoff = cutoff + self.coords = coords + self.searchcoords = searchcoords + + self.npairs = 0 + + cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: + """Internal function to add pairs and distances to buffers + + The buffers populated using this method are used by + other methods of this class. This is the + primary function used by :class:`FastNS` to save the pair of atoms, + which can be considered as neighbors. + """ + + self.pairs_buffer.push_back(beadid_i) + self.pairs_buffer.push_back(beadid_j) + self.pair_distances2_buffer.push_back(distance2) + self.npairs += 1 + + def get_pairs(self): + """Returns all the pairs within the desired cutoff distance + + Returns an array of shape ``(N, 2)``, where N is the number of pairs + between ``reference`` and ``configuration`` within the specified distance. + For every pair ``(i, j)``, ``reference[i]`` and ``configuration[j]`` are + atom positions such that ``reference`` is the position of query + atoms while ``configuration`` coontains the position of group of + atoms used to search against the query atoms. + + Returns + ------- + pairs : numpy.ndarray + pairs of atom indices of neighbors from query + and initial atom coordinates of shape ``(N, 2)`` + """ + + return np.asarray(self.pairs_buffer).reshape(self.npairs, 2) + + def get_pair_distances(self): + """Returns all the distances corresponding to each pair of neighbors + + Returns an array of shape ``N`` where N is the number of pairs + among the query atoms and initial atoms within a specified distance. + Every element ``[i]`` corresponds to the distance between + ``pairs[i, 0]`` and ``pairs[i, 1]``, where pairs is the array + obtained from ``get_pairs()`` + + Returns + ------- + distances : numpy.ndarray + distances between pairs of query and initial + atom coordinates of shape ``N`` + + See Also + -------- + MDAnalysis.lib.nsgrid.NSResults.get_pairs + + """ + + self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) + return np.asarray(self.pair_distances_buffer) + + cdef void create_buffers(self) nogil: + """ + Creates buffers to get individual neighbour list and distances + of the query atoms. + + """ + + cdef ns_int i, beadid_i, beadid_j + cdef ns_int idx, nsearch + cdef real dist2, dist + + nsearch = len(self.searchcoords) + + self.indices_buffer = vector[intvec]() + self.distances_buffer = vector[realvec]() + + # initialize rows corresponding to search + for i in range(nsearch): + self.indices_buffer.push_back(intvec()) + self.distances_buffer.push_back(realvec()) + + for i in range(0, 2*self.npairs, 2): + beadid_i = self.pairs_buffer[i] + beadid_j = self.pairs_buffer[i + 1] + + dist2 = self.pair_distances2_buffer[i//2] + + self.indices_buffer[beadid_i].push_back(beadid_j) + + dist = sqrt(dist2) + + self.distances_buffer[beadid_i].push_back(dist) + + def get_indices(self): + """Individual neighbours of query atom + + For every queried atom ``i``, an array of all its neighbors + indices can be obtained from ``get_indices()[i]`` + + Returns + ------- + indices : list + Indices of neighboring atoms. + Every element i.e. ``indices[i]`` will be a list of + size ``m`` where m is the number of neighbours of + query atom[i]. + + .. code-block:: python + + results = NSResults() + indices = results.get_indices() + + ``indices[i]`` will output a list of neighboring + atoms of ``atom[i]`` from query atoms ``atom``. + ``indices[i][j]`` will give the atom-id of initial coordinates + such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]`` + + """ + + if self.indices_buffer.empty(): + self.create_buffers() + return list(self.indices_buffer) + + def get_distances(self): + """Distance corresponding to individual neighbors of query atom + + For every queried atom ``i``, a list of all the distances + from its neighboring atoms can be obtained from ``get_distances()[i]``. + Every ``distance[i][j]`` will correspond + to the distance between atoms ``atom[i]`` from the query + atoms and ``atom[indices[j]]`` from the initialized + set of coordinates, where ``indices`` can be obtained + by ``get_indices()`` + + Returns + ------- + distances : np.ndarray + Every element i.e. ``distances[i]`` will be an array of + shape ``m`` where m is the number of neighbours of + query atom[i]. + + .. code-block:: python + + results = NSResults() + distances = results.get_distances() + + + atoms of ``atom[i]`` and query atoms ``atom``. + ``indices[i][j]`` will give the atom-id of initial coordinates + such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]`` + + See Also + -------- + MDAnalysis.lib.nsgrid.NSResults.get_indices + + """ + + if self.distances_buffer.empty(): + self.create_buffers() + return list(self.distances_buffer) + +cdef class NSGrid(object): + """Constructs a uniform cuboidal grid for a brick-shaped box + + This class uses :class:`PBCBox` to define the brick shaped box + It is essential to initialize the box with :class:`PBCBox` + inorder to form the grid. + + The domain is subdivided into number of cells based on the desired search + radius. Ideally cellsize should be equal to the search radius, but small + search radius leads to large cell-list data strucutres. + An optimization of cutoff is imposed to limit the size of data + structure such that the cellsize is always greater than or + equal to cutoff distance. + + Note + ---- + This class assumes that all the coordinates are already + inside the brick shaped box. Care must be taken to ensure + all the particles are within the brick shaped box as + defined by :class:`PBCBox`. This can be ensured by using + :func:`~MDAnalysis.lib.nsgrid.PBCBox.fast_put_atoms_in_bbox` + + .. warning:: + This class is not meant to be used by end users. + + """ + + cdef readonly real cutoff # cutoff + cdef ns_int size # total cells + cdef ns_int ncoords # number of coordinates + cdef ns_int[DIM] ncells # individual cells in every dimension + cdef ns_int[DIM] cell_offsets # Cell Multipliers + cdef real[DIM] cellsize # cell size in every dimension + cdef ns_int nbeads_per_cell # maximum beads + cdef ns_int *nbeads # size (Number of beads in every cell) + cdef ns_int *beadids # size * nbeads_per_cell (Beadids in every cell) + cdef ns_int *cellids # ncoords (Cell occupation id for every atom) + cdef bint force # To negate the effects of optimized cutoff + + def __init__(self, ncoords, cutoff, PBCBox box, max_size, force=False): + """ + Parameters + ---------- + ncoords : int + Number of coordinates to fill inside the brick shaped box + cutoff : float + Desired cutoff radius + box : PBCBox + Instance of :class:`PBCBox` + max_size : int + Maximum total number of cells + force : boolean + Optimizes cutoff if set to ``False`` [False] + """ + + cdef ns_int i + cdef ns_int ncellx, ncelly, ncellz, size, nbeadspercell + cdef ns_int xi, yi, zi + cdef real bbox_vol + + self.ncoords = ncoords + + # Calculate best cutoff + self.cutoff = cutoff + if not force: + bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + size = bbox_vol/cutoff**3 + nbeadspercell = ncoords/size + while bbox_vol/self.cutoff**3 > max_size: + self.cutoff *= 1.2 + + for i in range(DIM): + self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) + self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] + self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] + + self.cell_offsets[XX] = 0 + self.cell_offsets[YY] = self.ncells[XX] + self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] + + # Allocate memory + self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) + if not self.nbeads: + raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) + self.beadids = NULL + self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) + if not self.cellids: + raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) + self.nbeads_per_cell = 0 + + for i in range(self.size): + self.nbeads[i] = 0 + + def __dealloc__(self): + PyMem_Free(self.nbeads) + PyMem_Free(self.beadids) + PyMem_Free(self.cellids) + + cdef ns_int coord2cellid(self, rvec coord) nogil: + """Finds the cell-id for the given coordinate inside the brick shaped box + + Note + ---- + Assumes the coordinate is already inside the brick shaped box. + Return wrong cell-id if this is not the case + """ + return (coord[ZZ] / self.cellsize[ZZ]) * (self.cell_offsets[ZZ]) +\ + (coord[YY] / self.cellsize[YY]) * self.cell_offsets[YY] + \ + (coord[XX] / self.cellsize[XX]) + + cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: + """Finds actual cell position `(x, y, z)` from a cell-id + """ + + if cellid < 0: + return False + if cellid >= self.size: + return False + + cellxyz[ZZ] = (cellid / self.cell_offsets[ZZ]) + cellid -= cellxyz[ZZ] * self.cell_offsets[ZZ] + + cellxyz[YY] = (cellid / self.cell_offsets[YY]) + cellxyz[XX] = cellid - cellxyz[YY] * self.cell_offsets[YY] + + return True + + cdef fill_grid(self, real[:, ::1] coords): + """Sorts atoms into cells based on their position in the brick shaped box + + Every atom inside the brick shaped box is assigned a + cell-id based on its position. Another list ``beadids`` + sort the atom-ids in each cell. + + Note + ---- + The method fails if any coordinate is outside the brick shaped box. + + """ + + cdef ns_int i, cellindex = -1 + cdef ns_int ncoords = coords.shape[0] + cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) + + with nogil: + # Initialize buffers + for i in range(self.size): + beadcounts[i] = 0 + + # First loop: find cellindex for each bead + for i in range(ncoords): + cellindex = self.coord2cellid(&coords[i, 0]) + + self.nbeads[cellindex] += 1 + self.cellids[i] = cellindex + + if self.nbeads[cellindex] > self.nbeads_per_cell: + self.nbeads_per_cell = self.nbeads[cellindex] + + # Allocate memory + self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) # np.empty((self.size, nbeads_max), dtype=np.int) + if not self.beadids: + raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + + with nogil: + # Second loop: fill grid + for i in range(ncoords): + + # Add bead to grid cell + cellindex = self.cellids[i] + self.beadids[cellindex * self.nbeads_per_cell + beadcounts[cellindex]] = i + beadcounts[cellindex] += 1 + + +cdef class FastNS(object): + """Grid based search between two group of atoms + + Instantiates a class object which uses :class:`PBCBox` and + :class:`NSGrid` to construct a cuboidal + grid in an orthogonal brick shaped box. + + Minimum image convention is used for distance evaluations + if box dimensions are provided. + """ + cdef PBCBox box + cdef real[:, ::1] coords + cdef real[:, ::1] coords_bbox + cdef readonly real cutoff + cdef NSGrid grid + cdef ns_int max_gridsize + cdef bint periodic + + def __init__(self, cutoff, coords, box=None, max_gridsize=5000): + """ + Initialize the grid and sort the coordinates in respective + cells by shifting the coordinates in a brick shaped box. + The brick shaped box is defined by :class:`PBCBox` + and cuboidal grid is initialize by :class:`NSGrid`. + If box is supplied, periodic shifts along box vectors are used + to contain all the coordinates inside the brick shaped box. + If box is not supplied, the range of coordinates i.e. + ``[xmax, ymax, zmax] - [xmin, ymin, zmin]`` is used to construct + a pseudo box. Subsequently, the origin is also shifted + to the ``[xmin, ymin, zmin]``. + + Parameters + ---------- + cutoff : float + Desired cutoff distance + coords : numpy.ndarray + atom coordinates of shape ``(N, 3)`` for ``N`` atoms. + ``dtype=numpy.float32`` + box : numpy.ndarray + Box dimension of shape (6, ). The dimensions must be + provided in the same format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx, ly, lz, alpha, beta, gamma]`` (dtype = numpy.float32) + [None] + max_gridsize : int + maximum number of cells in the grid + + Note + ---- + box=``None`` and ``[0., 0., 0., 90., 90., 90]`` + both are used for Non-PBC aware calculations + + """ + + import MDAnalysis as mda + from MDAnalysis.lib.mdamath import triclinic_vectors + + + cdef real[:] pseudobox = np.zeros(6, dtype=np.float32) + cdef real[DIM] bmax, bmin + cdef ns_int i, j, ncoords + + _check_array(coords, 'coords') + + self.periodic = True + self.coords = coords.copy() + ncoords = len(self.coords) + + if (box is None) or (np.allclose(box[:3], 0.) and box.shape[0] == 6): + if len(coords) == 1: + raise ValueError("Need atleast two coordinates to search using" + " NSGrid without PBC") + + bmax = np.max(self.coords, axis=0) + bmin = np.min(self.coords, axis=0) + for i in range(DIM): + pseudobox[i] = 1.1*(bmax[i] - bmin[i]) + pseudobox[DIM + i] = 90. + box = pseudobox + # shift the origin + for i in range(ncoords): + for j in range(DIM): + self.coords[i][j] -= bmin[j] + self.periodic = False + + if box.shape != (3, 3): + box = triclinic_vectors(box) + + self.box = PBCBox(box, self.periodic) + + if cutoff < 0: + raise ValueError("Cutoff must be positive!") + if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: + raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") + + self.coords_bbox = self.box.fast_put_atoms_in_bbox(self.coords) + + self.cutoff = cutoff + self.max_gridsize = max_gridsize + # Note that self.cutoff might be different from self.grid.cutoff + self.grid = NSGrid(self.coords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) + + self.grid.fill_grid(self.coords_bbox) + + def search(self, search_coords): + """Search a group of atoms against initialized coordinates + + Creates a new grid with the query atoms and searches + against the initialized coordinates. The search is exclusive + i.e. only the pairs ``(i, j)`` such that ``atom[i]`` from query atoms + and ``atom[j]`` from the initialized set of coordinates is stored as + neighbors. + + PBC-aware/non PBC-aware calculations are automatically enabled during + the instantiation of :class:FastNS. + + Parameters + ---------- + search_coords : numpy.ndarray + Query coordinates of shape ``(N, 3)`` where + ``N`` is the number of queries + + Returns + ------- + results : NSResults object + The object from :class:NSResults + contains ``get_indices``, ``get_distances``. + ``get_pairs``, ``get_pair_distances`` + + Note + ---- + For non-PBC aware calculations, the current implementation doesn't work + if any of the query coordinates is beyond the specified range of + initialized coordinates in :func:`MDAnalysis.lib.nsgrid.FastNS`. + + See Also + -------- + MDAnalysis.lib.nsgrid.NSResults + + """ + + cdef ns_int i, j, size_search + cdef ns_int d, m + cdef ns_int current_beadid, bid + cdef ns_int cellindex, cellindex_probe + cdef ns_int xi, yi, zi + + cdef NSResults results + + cdef real d2 + cdef rvec probe + + cdef real[:, ::1] searchcoords + cdef real[:, ::1] searchcoords_bbox + cdef NSGrid searchgrid + cdef bint check + + cdef real cutoff2 = self.cutoff * self.cutoff + cdef ns_int npairs = 0 + _check_array(search_coords, 'search_coords') + + # Generate another grid to search + searchcoords = np.ascontiguousarray(search_coords, dtype=np.float32) + searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) + searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) + searchgrid.fill_grid(searchcoords_bbox) + + size_search = searchcoords.shape[0] + + results = NSResults(self.cutoff, self.coords, searchcoords) + + with nogil: + for i in range(size_search): + # Start with first search coordinate + current_beadid = i + # find the cellindex of the coordinate + cellindex = searchgrid.cellids[current_beadid] + for xi in range(DIM): + for yi in range(DIM): + for zi in range(DIM): + check = True + #Probe the search coordinates in a brick shaped box + probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] + probe[YY] = searchcoords_bbox[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] + probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] + # Make sure the probe coordinates is inside the brick-shaped box + if self.periodic: + for m in range(DIM - 1, -1, -1): + while probe[m] < 0: + for d in range(m+1): + probe[d] += self.box.c_pbcbox.box[m][d] + while probe[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + probe[d] -= self.box.c_pbcbox.box[m][d] + else: + for m in range(DIM -1, -1, -1): + if probe[m] < 0: + check = False + break + if probe[m] > self.box.c_pbcbox.box[m][m]: + check = False + break + if not check: + continue + # Get the cell index corresponding to the probe + cellindex_probe = self.grid.coord2cellid(probe) + # for this cellindex search in grid + for j in range(self.grid.nbeads[cellindex_probe]): + bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + # find distance between search coords[i] and coords[bid] + d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + if d2 < cutoff2: + results.add_neighbors(current_beadid, bid, d2) + npairs += 1 + return results + + def self_search(self): + """Searches all the pairs within the initialized coordinates + + All the pairs among the initialized coordinates are registered + in hald the time. Although the algorithm is still the same, but + the distance checks can be reduced to half in this particular case + as every pair need not be evaluated twice. + + Returns + ------- + results : NSResults object + The object from :class:NSResults + contains ``get_indices``, ``get_distances``. + ``get_pairs``, ``get_pair_distances`` + + See Also + -------- + MDAnalysis.lib.nsgrid.NSResults + + """ + + cdef ns_int i, j, size_search + cdef ns_int d, m + cdef ns_int current_beadid, bid + cdef ns_int cellindex, cellindex_probe + cdef ns_int xi, yi, zi + + cdef NSResults results + cdef real d2 + cdef rvec probe + + cdef real cutoff2 = self.cutoff * self.cutoff + cdef ns_int npairs = 0 + cdef bint check + + size_search = self.coords.shape[0] + + results = NSResults(self.cutoff, self.coords, self.coords) + + with nogil: + for i in range(size_search): + # Start with first search coordinate + current_beadid = i + # find the cellindex of the coordinate + cellindex = self.grid.cellids[current_beadid] + for xi in range(DIM): + for yi in range(DIM): + for zi in range(DIM): + check = True + # Calculate and/or reinitialize shifted coordinates + #Probe the search coordinates in a brick shaped box + probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] + probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[XX] + probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[XX] + # Make sure the shifted coordinates is inside the brick-shaped box + if self.periodic: + for m in range(DIM - 1, -1, -1): + while probe[m] < 0: + for d in range(m+1): + probe[d] += self.box.c_pbcbox.box[m][d] + while probe[m] >= self.box.c_pbcbox.box[m][m]: + for d in range(m+1): + probe[d] -= self.box.c_pbcbox.box[m][d] + else: + for m in range(DIM -1, -1, -1): + if probe[m] < 0: + check = False + break + elif probe[m] > self.box.c_pbcbox.box[m][m]: + check = False + break + if not check: + continue + # Get the cell index corresponding to the probe + cellindex_probe = self.grid.coord2cellid(probe) + # for this cellindex search in grid + for j in range(self.grid.nbeads[cellindex_probe]): + bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + if bid < current_beadid: + continue + # find distance between search coords[i] and coords[bid] + d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + if d2 < cutoff2 and d2 > EPSILON: + results.add_neighbors(current_beadid, bid, d2) + results.add_neighbors(bid, current_beadid, d2) + npairs += 1 + return results diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index d748808bb28..0a5e5aa6126 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -77,17 +77,18 @@ def test_ns_grid_noneighbor(universe): results_grid = run_grid_search(universe, ref_id, cutoff) - assert len(results_grid.get_distances()[0]) == 0 - assert len(results_grid.get_indices()[0]) == 0 - assert len(results_grid.get_pairs()) == 0 - assert len(results_grid.get_pair_distances()) == 0 + # same indices will be selected as neighbour here + assert len(results_grid.get_distances()[0]) == 1 + assert len(results_grid.get_indices()[0]) == 1 + assert len(results_grid.get_pairs()) == 1 + assert len(results_grid.get_pair_distances()) == 1 def test_nsgrid_PBC_rect(): """Check that nsgrid works with rect boxes and PBC""" ref_id = 191 - results = np.array([191, 672, 682, 683, 684, 995, 996, 2060, 2808, 3300, 3791, + results = np.array([191, 192, 672, 682, 683, 684, 995, 996, 2060, 2808, 3300, 3791, 3792]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! universe = mda.Universe(Martini_membrane_gro) @@ -110,7 +111,7 @@ def test_nsgrid_PBC(universe): """Check that grid search works when PBC is needed""" ref_id = 13937 - results = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, + results = np.array([4398, 4401, 13938, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! results_grid = run_grid_search(universe, ref_id).get_indices()[0] @@ -122,7 +123,7 @@ def test_nsgrid_pairs(universe): """Check that grid search returns the proper pairs""" ref_id = 13937 - neighbors = np.array([4398, 4401, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, + neighbors = np.array([4398, 4401, 13938, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! results = [] @@ -137,7 +138,7 @@ def test_nsgrid_pair_distances(universe): """Check that grid search returns the proper pair distances""" ref_id = 13937 - results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, + results = np.array([0.0, 0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm results_grid = run_grid_search(universe, ref_id).get_pair_distances() @@ -151,7 +152,7 @@ def test_nsgrid_distances(universe): """Check that grid search returns the proper distances""" ref_id = 13937 - results = np.array([0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, + results = np.array([0.0, 0.270, 0.285, 0.096, 0.096, 0.015, 0.278, 0.268, 0.179, 0.259, 0.290, 0.270]) * 10 # These distances where obtained by gmx distance so they are in nm results_grid = run_grid_search(universe, ref_id).get_distances()[0] @@ -169,7 +170,7 @@ def test_nsgrid_search(box, results): points = (np.random.uniform(low=0, high=1.0, size=(100, 3))*(10.)).astype(np.float32) cutoff = 2.0 - query = np.array([1., 1., 1.]).reshape((1,3)) + query = np.array([1., 1., 1.], dtype=np.float32).reshape((1,3)) searcher = nsgrid.FastNS(cutoff, points, box=box) searchresults = searcher.search(query) indices = searchresults.get_indices()[0] @@ -189,4 +190,11 @@ def test_nsgrid_selfsearch(box, result): searcher = nsgrid.FastNS(cutoff, points, box=box) searchresults = searcher.self_search() pairs = searchresults.get_pairs() - assert_equal(len(pairs)//2, result) \ No newline at end of file + assert_equal(len(pairs)//2, result) + +def test_gridfail(): + points = np.array([[1., 1., 1.]], dtype=np.float32) + cutoff = 0.3 + match = "Need atleast two coordinates to search using NSGrid without PBC" + with pytest.raises(ValueError, match=match): + searcher = nsgrid.FastNS(cutoff, points) \ No newline at end of file From 76c81cf3660309ab7ab3760c5c2a1001669d9d21 Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 6 Aug 2018 02:05:31 -0700 Subject: [PATCH 369/455] Added self_capped for nsgrid, moved no pbc box handling outside nsgrid and modified tests --- package/MDAnalysis/lib/__init__.py | 2 +- package/MDAnalysis/lib/distances.py | 124 +++++++++++++++--- package/MDAnalysis/lib/nsgrid.pyx | 107 ++++++++------- .../MDAnalysisTests/lib/test_distances.py | 27 ++-- testsuite/MDAnalysisTests/lib/test_nsgrid.py | 66 ++++++---- 5 files changed, 218 insertions(+), 108 deletions(-) diff --git a/package/MDAnalysis/lib/__init__.py b/package/MDAnalysis/lib/__init__.py index d5a583f9aea..37ebc2f811c 100644 --- a/package/MDAnalysis/lib/__init__.py +++ b/package/MDAnalysis/lib/__init__.py @@ -29,7 +29,7 @@ from __future__ import absolute_import __all__ = ['log', 'transformations', 'util', 'mdamath', 'distances', - 'NeighborSearch', 'formats', 'pkdtree', 'grid'] + 'NeighborSearch', 'formats', 'pkdtree', 'nsgrid'] from . import log from . import transformations diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 729ebb1e3ba..71608a72fca 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -462,7 +462,8 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, Currently only supports brute force and Periodic KDtree .. SeeAlso:: :func:'MDAnalysis.lib.distances.distance_array' - .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree' + .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree.search' + .. SeeAlso:: :class:'MDAnalysis.lib.nsgrid.FastNS.search' """ if box is not None: if box.shape[0] != 6: @@ -517,11 +518,12 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, Currently implemented methods are present in the ``methods`` dictionary bruteforce : returns ``_bruteforce_capped`` PKDtree : return ``_pkdtree_capped` + NSGrid : return ``_nsgrid_capped` """ methods = {'bruteforce': _bruteforce_capped, - 'pkdtree': _pkdtree_capped, - 'nsgrid': _nsgrid_capped} + 'pkdtree': _pkdtree_capped, + 'nsgrid': _nsgrid_capped} if method is not None: return methods[method] @@ -569,7 +571,6 @@ def _bruteforce_capped(reference, configuration, max_cutoff, """ pairs, distance = [], [] - reference = np.asarray(reference, dtype=np.float32) configuration = np.asarray(configuration, dtype=np.float32) @@ -644,12 +645,13 @@ def _pkdtree_capped(reference, configuration, max_cutoff, distances.append(dist[num]) return pairs, distances + def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None): - """Search all the pairs in *reference* and *configuration* within + """Search all the pairs in *reference* and *configuration* within a specified distance using Grid Search - + Parameters ----------- reference : array @@ -662,16 +664,12 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, Maximum cutoff distance between the reference and configuration min_cutoff : (optional) float Minimum cutoff distance between reference and configuration [None] - box : array + box : array The dimensions, if provided, must be provided in the same The unitcell dimesions for this system format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention - is applied if the box is provided - - Note - ---- - Non Periodic Boundary conditions can-not be handled currently + is applied if the box is provided """ from .nsgrid import FastNS @@ -679,11 +677,40 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, reference = reference[None, :] if configuration.shape == (3, ): configuration = configuration[None, :] - gridsearch = FastNS(max_cutoff, configuration, box=box) - results = gridsearch.search(reference) + + if box is None: + # create a pseudobox + # define the max range + # and supply the pseudobox + # along with only one set of coordinates + pseudobox = np.zeros(6, dtype=np.float32) + all_coords = np.concatenate([reference, configuration]) + lmax = all_coords.max(axis=0) + lmin = all_coords.min(axis=0) + # Using maximum dimension as the box size + boxsize = (lmax-lmin).max() + # to avoid failures of very close particles + # but with larger cutoff + if boxsize < 2*max_cutoff: + # just enough box size so that NSGrid doesnot fails + sizefactor = 2.2*max_cutoff/boxsize + else: + sizefactor = 1.2 + pseudobox[:3] = sizefactor*boxsize + pseudobox[3:] = 90. + shiftref, shiftconf = reference.copy(), configuration.copy() + # Extra padding near the origin + shiftref -= lmin - 0.1*boxsize + shiftconf -= lmin - 0.1*boxsize + gridsearch = FastNS(max_cutoff, shiftconf, box=pseudobox, pbc=False) + results = gridsearch.search(shiftref) + else: + gridsearch = FastNS(max_cutoff, configuration, box=box) + results = gridsearch.search(reference) + pairs = results.get_pairs() pair_distance = results.get_pair_distances() - + if min_cutoff is not None: idx = pair_distance > min_cutoff pairs, pair_distance = pairs[idx], pair_distance[idx] @@ -741,10 +768,11 @@ def self_capped_distance(reference, max_cutoff, min_cutoff=None, Note ----- - Currently only supports brute force and Periodic KDtree + Currently only supports brute force, Periodic KDtree and Grid Search .. SeeAlso:: :func:'MDAnalysis.lib.distances.self_distance_array' - .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree' + .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree.search' + .. SeeAlso:: :func:'MDAnalysis.lib.nsgrid.FastNS.self_search' """ if box is not None: if box.shape[0] != 6: @@ -796,10 +824,12 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, Currently implemented methods are present in the ``methods`` dictionary bruteforce : returns ``_bruteforce_capped_self`` PKDtree : return ``_pkdtree_capped_self`` + NSGrid : return ``_nsgrid_capped_self`` """ methods = {'bruteforce': _bruteforce_capped_self, - 'pkdtree': _pkdtree_capped_self} + 'pkdtree': _pkdtree_capped_self, + 'nsgrid': _nsgrid_capped_self} if method is not None: return methods[method] @@ -904,6 +934,64 @@ def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, return np.asarray(pairs), np.asarray(distance) +def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, + box=None): + """Finds all the pairs among the *reference* coordinates within + a fixed distance using gridsearch + + Returns + ------- + pairs : array + Arrray of ``[i, j]`` pairs such that atom-index ``i`` + and ``j`` from reference array are within a fixed distance + distance: array + Distance between ``reference[i]`` and ``reference[j]`` + atom coordinate + + """ + from .nsgrid import FastNS + + reference = np.asarray(reference, dtype=np.float32) + if reference.shape == (3, ) or len(reference) == 1: + return [], [] + + if box is None: + # create a pseudobox + # define the max range + # and supply the pseudobox + # along with only one set of coordinates + pseudobox = np.zeros(6, dtype=np.float32) + lmax = reference.max(axis=0) + lmin = reference.min(axis=0) + # Using maximum dimension as the box size + boxsize = (lmax-lmin).max() + # to avoid failures of very close particles + # but with larger cutoff + if boxsize < 2*max_cutoff: + # just enough box size so that NSGrid doesnot fails + sizefactor = 2.2*max_cutoff/boxsize + else: + sizefactor = 1.2 + pseudobox[:3] = sizefactor*boxsize + pseudobox[3:] = 90. + shiftref = reference.copy() + # Extra padding near the origin + shiftref -= lmin - 0.1*boxsize + gridsearch = FastNS(max_cutoff, shiftref, box=pseudobox, pbc=False) + results = gridsearch.self_search() + else: + gridsearch = FastNS(max_cutoff, reference, box=box) + results = gridsearch.self_search() + + pairs = results.get_pairs()[::2, :] + pair_distance = results.get_pair_distances()[::2] + + if min_cutoff is not None: + idx = pair_distance > min_cutoff + pairs, pair_distance = pairs[idx], pair_distance[idx] + return pairs, pair_distance + + def transform_RtoS(inputcoords, box, backend="serial"): """Transform an array of coordinates from real space to S space (aka lambda space) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 96ee469efde..97222e2d9aa 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -58,7 +58,7 @@ Appendix F, Page 552 of ``Understanding Molecular Dynamics: From Algorithm to Applications`` by Frenkel and Smit. In brief, the algorithm divides the domain into smaller subdomains called `cells` -and distributes every particle to these cells based on its position. Subsequently, +and distributes every particle to these cells based on their positions. Subsequently, any distance based query first identifies the corresponding cell position in the domain followed by distance evaluations within the identified cell and neighboring cells only. Care must be taken to ensure that `cellsize` is @@ -130,8 +130,10 @@ cdef class PBCBox(object): This class is not meant to be used by end users. .. warning:: - Even if MD triclinic boxes can be handled by this class, internal optimization is made based on the - assumption that particles are inside a brick-shaped box. When this is not the case, calculated distances are not + Even if MD triclinic boxes can be handled by this class, + internal optimization is made based on the assumption that + particles are inside a brick-shaped box. When this is not + the case, calculated distances are not warranted to be exact. """ @@ -299,6 +301,7 @@ cdef class PBCBox(object): bbox_coords[i, m] += self.c_pbcbox.box[m][m] while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: bbox_coords[i, m] -= self.c_pbcbox.box[m][m] + return bbox_coords ######################### @@ -351,8 +354,9 @@ cdef class NSResults(object): The buffers populated using this method are used by other methods of this class. This is the - primary function used by :class:`FastNS` to save the pair of atoms, - which can be considered as neighbors. + primary function used by :class:`FastNS` to save all + the pair of atoms, + which are considered as neighbors. """ self.pairs_buffer.push_back(beadid_i) @@ -585,10 +589,12 @@ cdef class NSGrid(object): self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] # Allocate memory + # Number of beads in every cell self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) if not self.nbeads: raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) self.beadids = NULL + # Cellindex of every bead self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) if not self.cellids: raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) @@ -686,7 +692,7 @@ cdef class FastNS(object): grid in an orthogonal brick shaped box. Minimum image convention is used for distance evaluations - if box dimensions are provided. + if pbc is set to ``True``. """ cdef PBCBox box cdef real[:, ::1] coords @@ -696,7 +702,7 @@ cdef class FastNS(object): cdef ns_int max_gridsize cdef bint periodic - def __init__(self, cutoff, coords, box=None, max_gridsize=5000): + def __init__(self, cutoff, coords, box, max_gridsize=5000, pbc=True): """ Initialize the grid and sort the coordinates in respective cells by shifting the coordinates in a brick shaped box. @@ -705,9 +711,10 @@ cdef class FastNS(object): If box is supplied, periodic shifts along box vectors are used to contain all the coordinates inside the brick shaped box. If box is not supplied, the range of coordinates i.e. - ``[xmax, ymax, zmax] - [xmin, ymin, zmin]`` is used to construct - a pseudo box. Subsequently, the origin is also shifted - to the ``[xmin, ymin, zmin]``. + ``[xmax, ymax, zmax] - [xmin, ymin, zmin]`` should be used + to construct a pseudo box. Subsequently, the origin should also be + shifted to ``[xmin, ymin, zmin]``. These arguments must be provided + to the function. Parameters ---------- @@ -715,53 +722,58 @@ cdef class FastNS(object): Desired cutoff distance coords : numpy.ndarray atom coordinates of shape ``(N, 3)`` for ``N`` atoms. - ``dtype=numpy.float32`` + ``dtype=numpy.float32``. For Non-PBC calculations, + all the coords must be within the bounding box specified + by ``box`` box : numpy.ndarray Box dimension of shape (6, ). The dimensions must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx, ly, lz, alpha, beta, gamma]`` (dtype = numpy.float32) - [None] + ``[lx, ly, lz, alpha, beta, gamma]``. For non-PBC + evaluations, provide an orthogonal bounding box + (dtype = numpy.float32) max_gridsize : int - maximum number of cells in the grid + maximum number of cells in the grid. This parameter + can be tuned for superior performance. + pbc : boolean + Handle to switch periodic boundary conditions on/off [True] Note ---- - box=``None`` and ``[0., 0., 0., 90., 90., 90]`` - both are used for Non-PBC aware calculations + * ``pbc=False`` Only works for orthogonal boxes. + * Care must be taken such that all particles are inside + the bounding box as defined by the box argument for non-PBC + calculations. + * In case of Non-PBC calculations, a bounding box must be provided + to encompass all the coordinates as well as the search coordinates. + The dimension should be similar to ``box`` argument but for + an orthogonal box. For instance, one valid set of argument + for ``box`` for the case of no PBC could be + ``[10, 10, 10, 90, 90, 90]`` + * Following operations are advisable for non-PBC calculations + + ..code-block:: python + + lmax = all_coords.max(axis=0) + lmin = all_coords.min(axis=0) + pseudobox[:3] = 1.1*(lmax - lmin) + pseudobox[3:] = 90. + shift = all_coords.copy() + shift -= lmin + gridsearch = FastNS(max_cutoff, shift, box=pseudobox, pbc=False) """ - import MDAnalysis as mda from MDAnalysis.lib.mdamath import triclinic_vectors - - cdef real[:] pseudobox = np.zeros(6, dtype=np.float32) - cdef real[DIM] bmax, bmin - cdef ns_int i, j, ncoords _check_array(coords, 'coords') - self.periodic = True + if np.allclose(box[:3], 0.0): + raise ValueError("Any of the box dimensions cannot be 0") + + self.periodic = pbc self.coords = coords.copy() - ncoords = len(self.coords) - - if (box is None) or (np.allclose(box[:3], 0.) and box.shape[0] == 6): - if len(coords) == 1: - raise ValueError("Need atleast two coordinates to search using" - " NSGrid without PBC") - - bmax = np.max(self.coords, axis=0) - bmin = np.min(self.coords, axis=0) - for i in range(DIM): - pseudobox[i] = 1.1*(bmax[i] - bmin[i]) - pseudobox[DIM + i] = 90. - box = pseudobox - # shift the origin - for i in range(ncoords): - for j in range(DIM): - self.coords[i][j] -= bmin[j] - self.periodic = False if box.shape != (3, 3): box = triclinic_vectors(box) @@ -778,6 +790,7 @@ cdef class FastNS(object): self.cutoff = cutoff self.max_gridsize = max_gridsize # Note that self.cutoff might be different from self.grid.cutoff + # due to optimization self.grid = NSGrid(self.coords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) self.grid.fill_grid(self.coords_bbox) @@ -810,8 +823,8 @@ cdef class FastNS(object): Note ---- For non-PBC aware calculations, the current implementation doesn't work - if any of the query coordinates is beyond the specified range of - initialized coordinates in :func:`MDAnalysis.lib.nsgrid.FastNS`. + if any of the query coordinates is beyond the range specified in + ``box`` in :func:`MDAnalysis.lib.nsgrid.FastNS`. See Also -------- @@ -944,10 +957,10 @@ cdef class FastNS(object): for zi in range(DIM): check = True # Calculate and/or reinitialize shifted coordinates - #Probe the search coordinates in a brick shaped box + # Probe the search coordinates in a brick shaped box probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] - probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[XX] - probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[XX] + probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] + probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] # Make sure the shifted coordinates is inside the brick-shaped box if self.periodic: for m in range(DIM - 1, -1, -1): @@ -962,7 +975,7 @@ cdef class FastNS(object): if probe[m] < 0: check = False break - elif probe[m] > self.box.c_pbcbox.box[m][m]: + elif probe[m] >= self.box.c_pbcbox.box[m][m]: check = False break if not check: @@ -979,5 +992,5 @@ cdef class FastNS(object): if d2 < cutoff2 and d2 > EPSILON: results.add_neighbors(current_beadid, bid, d2) results.add_neighbors(bid, current_beadid, d2) - npairs += 1 + npairs += 2 return results diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index d83d8903e93..38ae57384c8 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -25,12 +25,8 @@ import numpy as np from numpy.testing import assert_equal, assert_almost_equal -import itertools - import MDAnalysis as mda -from MDAnalysis.lib.mdamath import triclinic_vectors, triclinic_box - @pytest.mark.parametrize('coord_dtype', (np.float32, np.float64)) def test_transform_StoR_pass(coord_dtype): box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) @@ -77,10 +73,6 @@ def test_capped_distance_noresults(): @pytest.mark.parametrize('method', method_1) @pytest.mark.parametrize('min_cutoff', min_cutoff_1) def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): - if method == 'nsgrid' and box is None: - pytest.skip('Not implemented yet') - - np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(npoints, 3))*(boxes_1[0][:3])).astype(np.float32) @@ -119,7 +111,7 @@ def test_self_capped_distance(npoints, box, method, min_cutoff): np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(npoints, 3))*(boxes_1[0][:3])).astype(np.float32) - max_cutoff = 0.1 + max_cutoff = 0.2 pairs, distance = mda.lib.distances.self_capped_distance(points, max_cutoff, min_cutoff=min_cutoff, @@ -131,16 +123,17 @@ def test_self_capped_distance(npoints, box, method, min_cutoff): points[i+1:], box=box) if min_cutoff is not None: - idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[0] + idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[1] else: - idx = np.where((dist < max_cutoff))[0] + idx = np.where((dist < max_cutoff))[1] for other_idx in idx: j = other_idx + 1 + i found_pairs.append((i, j)) - found_distance.append(dist[other_idx]) + found_distance.append(dist[0, other_idx]) assert_equal(len(pairs), len(found_pairs)) -@pytest.mark.parametrize('box', (None, + +@pytest.mark.parametrize('box', (None, np.array([1, 1, 1, 90, 90, 90], dtype=np.float32), np.array([1, 1, 1, 60, 75, 80], dtype=np.float32))) @pytest.mark.parametrize('npoints,cutoff,meth', @@ -158,7 +151,7 @@ def test_method_selfselection(box, npoints, cutoff, meth): assert_equal(method.__name__, meth) -@pytest.mark.parametrize('box', (None, +@pytest.mark.parametrize('box', (None, np.array([1, 1, 1, 90, 90, 90], dtype=np.float32), np.array([1, 1, 1, 60, 75, 80], dtype=np.float32))) @pytest.mark.parametrize('npoints,cutoff,meth', @@ -178,9 +171,9 @@ def test_method_selection(box, npoints, cutoff, meth): # different boxlengths to shift a coordinate shifts = [ - ((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)), # no shifting - ((1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 0)), # single box lengths - ((-1, 0, 1), (0, -1, 0), (1, 0, 1), (-1, -1, -1)), # negative single + ((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)), # no shifting + ((1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 0)), # single box lengths + ((-1, 0, 1), (0, -1, 0), (1, 0, 1), (-1, -1, -1)), # negative single ((4, 3, -2), (-2, 2, 2), (-5, 2, 2), (0, 2, 2)), # multiple boxlengths ] diff --git a/testsuite/MDAnalysisTests/lib/test_nsgrid.py b/testsuite/MDAnalysisTests/lib/test_nsgrid.py index 0a5e5aa6126..03b3e24c7d3 100644 --- a/testsuite/MDAnalysisTests/lib/test_nsgrid.py +++ b/testsuite/MDAnalysisTests/lib/test_nsgrid.py @@ -24,7 +24,7 @@ import pytest -from numpy.testing import assert_equal, assert_allclose, assert_array_equal +from numpy.testing import assert_equal, assert_allclose import numpy as np import MDAnalysis as mda @@ -37,8 +37,6 @@ def universe(): u = mda.Universe(GRO) return u - - def run_grid_search(u, ref_id, cutoff=3): coords = u.atoms.positions searchcoords = u.atoms.positions[ref_id] @@ -84,7 +82,6 @@ def test_ns_grid_noneighbor(universe): assert len(results_grid.get_pair_distances()) == 1 - def test_nsgrid_PBC_rect(): """Check that nsgrid works with rect boxes and PBC""" ref_id = 191 @@ -97,9 +94,9 @@ def test_nsgrid_PBC_rect(): # FastNS is called differently to max coverage searcher = nsgrid.FastNS(cutoff, universe.atoms.positions, box=universe.dimensions) - results_grid = searcher.search(universe.atoms.positions[ref_id][None, :]).get_indices()[0] + results_grid = searcher.search(universe.atoms.positions[ref_id][None, :]).get_indices()[0] - results_grid2 = searcher.search(universe.atoms.positions).get_indices() # call without specifying any ids, should do NS for all beads + results_grid2 = searcher.search(universe.atoms.positions).get_indices() # call without specifying any ids, should do NS for all beads assert_equal(np.sort(results), np.sort(results_grid)) assert_equal(len(universe.atoms), len(results_grid2)) @@ -126,7 +123,7 @@ def test_nsgrid_pairs(universe): neighbors = np.array([4398, 4401, 13938, 13939, 13940, 13941, 17987, 23518, 23519, 23521, 23734, 47451]) - 1 # Atomid are from gmx select so there start from 1 and not 0. hence -1! results = [] - + results = np.array(results) results_grid = run_grid_search(universe, ref_id).get_pairs() @@ -146,8 +143,6 @@ def test_nsgrid_pair_distances(universe): assert_allclose(np.sort(results), np.sort(results_grid), atol=1e-2) - - def test_nsgrid_distances(universe): """Check that grid search returns the proper distances""" @@ -161,8 +156,7 @@ def test_nsgrid_distances(universe): @pytest.mark.parametrize('box, results', - ((None, [3, 13, 24]), - (np.array([0., 0., 0., 90., 90., 90.]), [3, 13, 24]), + ((None, [3, 13, 24]), (np.array([10., 10., 10., 90., 90., 90.]), [3, 13, 24, 39, 67]), (np.array([10., 10., 10., 60., 75., 90.]), [3, 13, 24, 39, 60, 79]))) def test_nsgrid_search(box, results): @@ -170,16 +164,30 @@ def test_nsgrid_search(box, results): points = (np.random.uniform(low=0, high=1.0, size=(100, 3))*(10.)).astype(np.float32) cutoff = 2.0 - query = np.array([1., 1., 1.], dtype=np.float32).reshape((1,3)) - searcher = nsgrid.FastNS(cutoff, points, box=box) - searchresults = searcher.search(query) + query = np.array([1., 1., 1.], dtype=np.float32).reshape((1, 3)) + + if box is None: + pseudobox = np.zeros(6, dtype=np.float32) + all_coords = np.concatenate([points, query]) + lmax = all_coords.max(axis=0) + lmin = all_coords.min(axis=0) + pseudobox[:3] = 1.1*(lmax - lmin) + pseudobox[3:] = 90. + shiftpoints, shiftquery = points.copy(), query.copy() + shiftpoints -= lmin + shiftquery -= lmin + searcher = nsgrid.FastNS(cutoff, shiftpoints, box=pseudobox, pbc=False) + searchresults = searcher.search(shiftquery) + else: + searcher = nsgrid.FastNS(cutoff, points, box) + searchresults = searcher.search(query) indices = searchresults.get_indices()[0] assert_equal(np.sort(indices), results) -@pytest.mark.parametrize('box, result', +@pytest.mark.parametrize('box, result', ((None, 21), - (np.array([0., 0., 0., 90., 90., 90.]), 21), + (np.array([0., 0., 0., 90., 90., 90.]), 21), (np.array([10., 10., 10., 90., 90., 90.]), 26), (np.array([10., 10., 10., 60., 75., 90.]), 33))) def test_nsgrid_selfsearch(box, result): @@ -187,14 +195,22 @@ def test_nsgrid_selfsearch(box, result): points = (np.random.uniform(low=0, high=1.0, size=(100, 3))*(10.)).astype(np.float32) cutoff = 1.0 - searcher = nsgrid.FastNS(cutoff, points, box=box) - searchresults = searcher.self_search() + if box is None or np.allclose(box[:3], 0): + # create a pseudobox + # define the max range + # and supply the pseudobox + # along with only one set of coordinates + pseudobox = np.zeros(6, dtype=np.float32) + lmax = points.max(axis=0) + lmin = points.min(axis=0) + pseudobox[:3] = 1.1*(lmax - lmin) + pseudobox[3:] = 90. + shiftref = points.copy() + shiftref -= lmin + searcher = nsgrid.FastNS(cutoff, shiftref, box=pseudobox, pbc=False) + searchresults = searcher.self_search() + else: + searcher = nsgrid.FastNS(cutoff, points, box=box) + searchresults = searcher.self_search() pairs = searchresults.get_pairs() assert_equal(len(pairs)//2, result) - -def test_gridfail(): - points = np.array([[1., 1., 1.]], dtype=np.float32) - cutoff = 0.3 - match = "Need atleast two coordinates to search using NSGrid without PBC" - with pytest.raises(ValueError, match=match): - searcher = nsgrid.FastNS(cutoff, points) \ No newline at end of file From bf03cd4571dab9ab16d95348dd6805de9ffd24f3 Mon Sep 17 00:00:00 2001 From: Micaela Matta <31009265+micaela-matta@users.noreply.github.com> Date: Mon, 6 Aug 2018 08:25:20 -0500 Subject: [PATCH 370/455] fixed Issue #2001 - support for Tinker periodic boundary box (#2011) * fixes Issue #2001 - support for Tinker periodic boundary box --- package/.pylintrc | 1 - package/CHANGELOG | 3 ++- package/MDAnalysis/coordinates/TXYZ.py | 21 ++++++++++++---- package/MDAnalysis/topology/TXYZParser.py | 20 ++++++++++++++-- .../MDAnalysisTests/coordinates/test_txyz.py | 24 +++++++++++++++++-- .../data/coordinates/new_hexane.arc | 24 +++++++++++++++++++ testsuite/MDAnalysisTests/datafiles.py | 3 ++- 7 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 testsuite/MDAnalysisTests/data/coordinates/new_hexane.arc diff --git a/package/.pylintrc b/package/.pylintrc index ab966147016..da780ce8ac3 100644 --- a/package/.pylintrc +++ b/package/.pylintrc @@ -200,7 +200,6 @@ enable=abstract-class-instantiated, xrange-builtin, zip-builtin-not-iterating, map-builtin-not-iterating, - range-builtin-not-iterating, # Things we'd like to try. # Procedure: diff --git a/package/CHANGELOG b/package/CHANGELOG index 93524527cd4..1fb8fee83a1 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,7 +14,7 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, - VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull + VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull, micaela-matta * 0.18.1 @@ -75,6 +75,7 @@ Fixes * PDBWriter now properly sets start value * Zero length TopologyGroup now return proper shape array via to_indices (Issue #1974) + * Added periodic boundary box support to the Tinker file reader (Issue #2001) Changes * TopologyAttrs are now statically typed (Issue #1876) diff --git a/package/MDAnalysis/coordinates/TXYZ.py b/package/MDAnalysis/coordinates/TXYZ.py index 260d11d6ead..aa604b96ad0 100644 --- a/package/MDAnalysis/coordinates/TXYZ.py +++ b/package/MDAnalysis/coordinates/TXYZ.py @@ -74,12 +74,19 @@ def __init__(self, filename, **kwargs): root, ext = os.path.splitext(self.filename) self.xyzfile = util.anyopen(self.filename) self._cache = dict() - + # Check if file has box information saved + with util.openany(self.filename) as inp: + inp.readline() + line = inp.readline() + # If second line has float at second position, we have box info + try: + float(line.split()[1]) + except ValueError: + self.periodic = False + else: + self.periodic = True self.ts = self._Timestep(self.n_atoms, **self._ts_kwargs) - # Haven't quite figured out where to start with all the self._reopen() - # etc. - # (Also cannot just use seek() or reset() because that would break - # with urllib2.urlopen() streams) + self._read_next_timestep() @property @@ -103,6 +110,8 @@ def _read_xyz_n_frames(self): # the number of lines in the XYZ file will be 1 greater than the # number of atoms linesPerFrame = self.n_atoms + 1 + if self.periodic: + linesPerFrame += 1 counter = 0 offsets = [] @@ -134,6 +143,8 @@ def _read_next_timestep(self, ts=None): try: # we assume that there is only one header line per frame f.readline() + if self.periodic: + ts.dimensions = f.readline().split() # convert all entries at the end once for optimal speed tmp_buf = [] for i in range(self.n_atoms): diff --git a/package/MDAnalysis/topology/TXYZParser.py b/package/MDAnalysis/topology/TXYZParser.py index 63698602d06..74bfdce4513 100644 --- a/package/MDAnalysis/topology/TXYZParser.py +++ b/package/MDAnalysis/topology/TXYZParser.py @@ -43,7 +43,10 @@ """ from __future__ import absolute_import + +import itertools import numpy as np +from six.moves import zip from . import guessers from ..lib.util import openany @@ -88,9 +91,22 @@ def parse(self, **kwargs): names = np.zeros(natoms, dtype=object) types = np.zeros(natoms, dtype=np.int) bonds = [] + # Find first atom line, maybe there's box information + fline = inf.readline() + try: + # If a box second value will be a float + # If an atom, second value will be a string + float(fline.split()[1]) + except ValueError: + # If float conversion failed, we have first atom line + pass + else: + # If previous try succeeded it was a box + # so read another line to find the first atom line + fline = inf.readline() # Can't infinitely read as XYZ files can be multiframe - for i in range(natoms): - line = inf.readline().split() + for i, line in zip(range(natoms), itertools.chain([fline], inf)): + line = line.split() atomids[i]= line[0] names[i] = line[1] types[i] = line[5] diff --git a/testsuite/MDAnalysisTests/coordinates/test_txyz.py b/testsuite/MDAnalysisTests/coordinates/test_txyz.py index 6334352645d..8dd49ac8d7a 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_txyz.py +++ b/testsuite/MDAnalysisTests/coordinates/test_txyz.py @@ -23,8 +23,9 @@ import pytest from numpy.testing import assert_almost_equal +from six.moves import zip -from MDAnalysisTests.datafiles import TXYZ, ARC +from MDAnalysisTests.datafiles import TXYZ, ARC, ARC_PBC import MDAnalysis as mda @@ -39,6 +40,11 @@ def ARC_U(): return mda.Universe(ARC) +@pytest.fixture +def ARC_PBC_U(): + return mda.Universe(ARC_PBC) + + def test_txyz_positions(TXYZ_U): assert_almost_equal(TXYZ_U.atoms.positions[0], [-6.553398, -1.854369, 0.000000]) @@ -56,5 +62,19 @@ def test_arc_positions_frame_2(ARC_U): [-0.231579, -0.350841, -0.037475]) -def test_arc_traj_legnth(ARC_U): +def test_arc_traj_length(ARC_U): assert len(ARC_U.trajectory) == 2 + + +def test_arcpbc_traj_length(ARC_PBC_U): + assert len(ARC_PBC_U.trajectory) == 3 + + +def test_pbc_boxsize(ARC_PBC_U): + ref_dimensions=[[ 38.860761, 38.860761, 38.860761, 90.000000, 90.000000, 90.000000], + [ 39.860761, 39.860761, 39.860761, 90.000000, 90.000000, 90.000000], + [ 40.860761, 40.860761, 40.860761, 90.000000, 90.000000, 90.000000]] + + for ref_box, ts in zip(ref_dimensions, ARC_PBC_U.trajectory): + assert_almost_equal(ref_box, ts.dimensions, decimal=5) + diff --git a/testsuite/MDAnalysisTests/data/coordinates/new_hexane.arc b/testsuite/MDAnalysisTests/data/coordinates/new_hexane.arc new file mode 100644 index 00000000000..6705ae636a9 --- /dev/null +++ b/testsuite/MDAnalysisTests/data/coordinates/new_hexane.arc @@ -0,0 +1,24 @@ + 6 Hexane (267 OPLS-UA in 38.8 Ang Box; JPC, 100, 14511 '96) + 38.860761 38.860761 38.860761 90.000000 90.000000 90.000000 + 1 CH3 -0.533809 8.893843 -17.718901 83 2 + 2 CH2 -0.492066 8.734009 -16.201869 86 1 3 + 3 CH2 0.609320 7.723360 -15.894925 86 2 4 + 4 CH2 0.723163 7.301395 -14.432851 86 3 5 + 5 CH2 1.923300 6.401842 -14.151512 86 4 6 + 6 CH3 1.576645 4.928146 -14.343148 83 5 + 6 Hexane (test file for MDA) + 39.860761 39.860761 39.860761 90.000000 90.000000 90.000000 + 1 CH3 0.039519 9.187867 -17.899888 83 2 + 2 CH2 -0.171280 8.486514 -16.561104 86 1 3 + 3 CH2 0.988507 7.632303 -16.057222 86 2 4 + 4 CH2 0.630146 7.086837 -14.677831 86 3 5 + 5 CH2 1.729866 6.240985 -14.042356 86 4 6 + 6 CH3 2.065117 4.899261 -14.687383 83 5 + 6 Hexane + 40.860761 40.860761 40.860761 90.000000 90.000000 90.000000 + 1 CH3 -0.533809 8.893843 -17.718901 83 2 + 2 CH2 -0.492066 8.734009 -16.201869 86 1 3 + 3 CH2 0.609320 7.723360 -15.894925 86 2 4 + 4 CH2 0.723163 7.301395 -14.432851 86 3 5 + 5 CH2 1.923300 6.401842 -14.151512 86 4 6 + 6 CH3 1.576645 4.928146 -14.343148 83 5 diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 3109f100527..afc51555d0e 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -85,7 +85,7 @@ "XTC_sub_sol", "XYZ", "XYZ_psf", "XYZ_bz2", "XYZ_mini", "XYZ_five", # 3 and 5 atoms xyzs for an easy topology - "TXYZ", "ARC", # Tinker files + "TXYZ", "ARC", "ARC_PBC", # Tinker files "PRM", "TRJ", "TRJ_bz2", # Amber (no periodic box) "INPCRD", "PRMpbc", "TRJpbc_bz2", # Amber (periodic box) @@ -294,6 +294,7 @@ XYZ_five = resource_filename(__name__, 'data/five.xyz') TXYZ = resource_filename(__name__, 'data/coordinates/test.txyz') ARC = resource_filename(__name__, 'data/coordinates/test.arc') +ARC_PBC = resource_filename(__name__, 'data/coordinates/new_hexane.arc') PRM = resource_filename(__name__, 'data/Amber/ache.prmtop') TRJ = resource_filename(__name__, 'data/Amber/ache.mdcrd') From e90dfd2445f2927a40a9f8e8b0317f485875e267 Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Mon, 6 Aug 2018 13:22:51 -0700 Subject: [PATCH 371/455] TST: Windows tests now xfail where needed (#2027) * all unit tests that currently fail or error on Windows (Appveyor) will now strictly xfail * Appveyor test suite failure is no longer allowed in CI--this prevents regressions in Windows compatibility progress; the objective now is to reduce xfails instead of actual failures --- .appveyor.yml | 7 ------- .../MDAnalysisTests/analysis/test_encore.py | 4 ++++ .../MDAnalysisTests/coordinates/test_pdb.py | 8 ++++++++ .../core/test_atomselections.py | 4 ++++ .../MDAnalysisTests/utils/test_modelling.py | 19 +++++++++++++++++++ 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index b21008db6c9..7669c2e4009 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,13 +7,6 @@ max_jobs: 100 cache: - '%LOCALAPPDATA%\pip\Cache' -matrix: - # FIXME: allow all Windows builds - # to fail for now; remove this - # when we have full Windows compatibility - allow_failures: - - PYTHON_ARCH: 64 - image: - Visual Studio 2015 diff --git a/testsuite/MDAnalysisTests/analysis/test_encore.py b/testsuite/MDAnalysisTests/analysis/test_encore.py index 1d0d6c23a48..2dfa26361b0 100644 --- a/testsuite/MDAnalysisTests/analysis/test_encore.py +++ b/testsuite/MDAnalysisTests/analysis/test_encore.py @@ -28,6 +28,7 @@ import tempfile import numpy as np import sys +import os import warnings import pytest @@ -114,6 +115,9 @@ def test_triangular_matrix(self): err_msg="Error in TriangularMatrix: multiplication by scalar gave\ inconsistent results") + @pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Not yet supported on Windows.") def test_parallel_calculation(self): def function(x): diff --git a/testsuite/MDAnalysisTests/coordinates/test_pdb.py b/testsuite/MDAnalysisTests/coordinates/test_pdb.py index 6a9201dd52a..0cd1ca4d953 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_pdb.py +++ b/testsuite/MDAnalysisTests/coordinates/test_pdb.py @@ -333,6 +333,10 @@ def get_MODEL_lines(filename): assert int(line[10:14]) == model % 10000 +@pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="PDB multiframe reading not yet supported " + "on Windows.") class TestMultiPDBReader(TestCase): def setUp(self): self.multiverse = mda.Universe(PDB_multiframe, @@ -479,6 +483,10 @@ def test_conect_bonds_all(tmpdir): # assert_equal(len([b for b in conect.bonds if not b.is_guessed]), 1922) +@pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="PDB multiframe reading not yet supported " + "on Windows.") class TestMultiPDBWriter(TestCase): def setUp(self): self.universe = mda.Universe(PSF, PDB_small) diff --git a/testsuite/MDAnalysisTests/core/test_atomselections.py b/testsuite/MDAnalysisTests/core/test_atomselections.py index 89c64d18765..33178097ca0 100644 --- a/testsuite/MDAnalysisTests/core/test_atomselections.py +++ b/testsuite/MDAnalysisTests/core/test_atomselections.py @@ -23,6 +23,7 @@ from six.moves import range +import os import itertools import numpy as np from numpy.testing import( @@ -343,6 +344,9 @@ def test_type(self, universe): assert_equal(sel.names, ['HH31', 'HH32', 'HH33', 'HB1', 'HB2', 'HB3']) +@pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Not supported on Windows yet.") class TestSelectionsNAMD(object): @pytest.fixture() def universe(self): diff --git a/testsuite/MDAnalysisTests/utils/test_modelling.py b/testsuite/MDAnalysisTests/utils/test_modelling.py index 376e1baa473..5dcdd2bcfca 100644 --- a/testsuite/MDAnalysisTests/utils/test_modelling.py +++ b/testsuite/MDAnalysisTests/utils/test_modelling.py @@ -21,6 +21,7 @@ # from __future__ import absolute_import, print_function +import os import MDAnalysis import pytest from MDAnalysis.tests.datafiles import ( @@ -140,6 +141,9 @@ def u_water(): class TestMerge(object): + @pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Setup fixtures fail on Windows.") def test_merge(self, u_protein, u_ligand, u_water, tmpdir): ids_before = [a.index for u in [u_protein, u_ligand, u_water] for a in u.atoms] # Do the merge @@ -178,17 +182,26 @@ def test_merge(self, u_protein, u_ligand, u_water, tmpdir): ids_new2 = [a.index for a in u.atoms] assert_equal(ids_new, ids_new2) + @pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Setup fixtures fail on Windows.") def test_merge_same_universe(self, u_protein): u0 = MDAnalysis.Merge(u_protein.atoms, u_protein.atoms, u_protein.atoms) assert_equal(len(u0.atoms), 3 * len(u_protein.atoms)) assert_equal(len(u0.residues), 3 * len(u_protein.residues)) assert_equal(len(u0.segments), 3 * len(u_protein.segments)) + @pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Setup fixtures fail on Windows.") def test_residue_references(self, u_protein, u_ligand): m = Merge(u_protein.atoms, u_ligand.atoms) assert_equal(m.atoms.residues[0].universe, m, "wrong universe reference for residues after Merge()") + @pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Setup fixtures fail on Windows.") def test_segment_references(self, u_protein, u_ligand): m = Merge(u_protein.atoms, u_ligand.atoms) assert_equal(m.atoms.segments[0].universe, m, @@ -202,6 +215,9 @@ def test_nonsense_TypeError(self): with pytest.raises(TypeError): Merge(['1', 2]) + @pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Setup fixtures fail on Windows.") def test_emptyAG_ValueError(self, u_protein): a = AtomGroup([], u_protein) b = AtomGroup([], u_protein) @@ -235,6 +251,9 @@ def test_merge_with_topology(self, u): # One of these bonds isn't in the merged Universe assert(len(ag2[0].bonds) - 1 == len(u_merge.atoms[20].bonds)) + @pytest.mark.xfail(os.name == 'nt', + strict=True, + reason="Setup fixtures fail on Windows.") def test_merge_with_topology_from_different_universes(self, u, u_ligand): u_merge = MDAnalysis.Merge(u.atoms[:110], u_ligand.atoms) From 2a0b01f8863c24abacb24db522ad23c065a9c491 Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 6 Aug 2018 17:31:25 -0700 Subject: [PATCH 372/455] updated CHANGELOG --- package/CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package/CHANGELOG b/package/CHANGELOG index 93524527cd4..18373bae4ad 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,6 +20,11 @@ The rules for this file: Enhancements + * Added a wrapper of lib.nsgrid in lib.distances.self_capped_distance + and lib.distances.capped_distanceto automatically chose the fastest + method for distance based calculations. (PR #2008) + * Added Grid search functionality in lib.nsgrid for faster distance based + calculations. (PR #2008) * Modified around selections to work with KDTree and periodic boundary conditions. Should reduce memory usage (#974 PR #2022) * Modified topology.guessers.guess_bonds to automatically select the From 0cde1ded98b600d4b5c3e07ef0c8637f8c1785e7 Mon Sep 17 00:00:00 2001 From: ayush Date: Mon, 6 Aug 2018 18:30:29 -0700 Subject: [PATCH 373/455] added sebastien to authors --- package/CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 18373bae4ad..021e9a8f484 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -14,7 +14,7 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, - VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull + VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull, sebastien.buchoux * 0.18.1 From 8dc6894a6f2d10f83d942edaf121f428f2ebc3ad Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Sat, 4 Aug 2018 17:20:01 +0200 Subject: [PATCH 374/455] Assigning positions on memory reader is persistent Fixes #2018 Assigning an array to ts.positions with the memory reader does not break the link to trajectory.coordinate_array anymore. That link needs to be reset when switching to a new frame. This is done with the new method ts.replace_position_array. --- package/CHANGELOG | 8 +++-- package/MDAnalysis/coordinates/memory.py | 31 +++++++++++-------- .../coordinates/test_memory.py | 9 +++++- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 1fb8fee83a1..c778b311540 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -27,9 +27,9 @@ Enhancements lib.distance.self_capped_distance (PR # 2006) * Added lib.distances.self_capped_distance to internally select the optimized method for distance evaluations of coordinates with itself. (PR # 2006) - * Added augment functionality to create relevant images of particles + * Added augment functionality to create relevant images of particles in the vicinity of central cell to handle periodic boundary - conditions (PR #1977) + conditions (PR #1977) * Added lib.distances.capped_distance function to quickly calculate all distances up to a given maximum distance (PR #1941) * Added a rotation coordinate transformation (PR #1937) @@ -58,7 +58,7 @@ Enhancements generated with gromacs -noappend (PR #1728) * MDAnalysis.lib.mdamath now supports triclinic boxes and rewrote in Cython (PR #1965) * AtomGroup.write can write a trajectory of selected frames (Issue #1037) - * Added dihedrals.py with Ramachandran class to analysis module + * Added analysis.dihedrals with Ramachandran class to analysis module (PR #1997) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) @@ -76,6 +76,8 @@ Fixes * Zero length TopologyGroup now return proper shape array via to_indices (Issue #1974) * Added periodic boundary box support to the Tinker file reader (Issue #2001) + * Modifying coordinates by assignation is consistently persistent when using + the memory reader (Issue #2018) Changes * TopologyAttrs are now statically typed (Issue #1876) diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index ca02ee805c5..f91c0a688fe 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -196,20 +196,25 @@ class Timestep(base.Timestep): """ Timestep for the :class:`MemoryReader` - Overrides the positions property in - :class:`MDAnalysis.coordinates.base.Timestep` to use avoid - duplication of the array. - + Compared to the base :class:`base.Timestep`, this version has an additional + :meth:`replace_positions_array` method. This property replaces the array of + positions, while the :attr:`positions` property replaces the content of the + array. """ - - @property - def positions(self): - return base.Timestep.positions.fget(self) - - @positions.setter - def positions(self, new): + def replace_positions_array(self, new): + """Replace the array of positions + + Replaces the array of positions by an other array. This is different + from the bahavior of the :attr:`position` property that replaces the + **content** of the array. The :meth:`replace_positions_array` method + should only be used to set the positions to a different frame; there, + the memory reader sets the positions to a view to the correct frame. + Modifying the positions for a given frames should be done with the + :attr:`positions` attribute that do not break the link between the + array of positions in the time step and the + :attr:`MemoryReader.coordinate_array`. + """ self.has_positions = True - # Use reference to original rather than a copy self._pos = new @@ -464,7 +469,7 @@ def _read_next_timestep(self, ts=None): basic_slice = ([slice(None)]*(f_index) + [self.ts.frame] + [slice(None)]*(2-f_index)) - ts.positions = self.coordinate_array[basic_slice] + ts.replace_positions_array(self.coordinate_array[basic_slice]) ts.time = self.ts.frame*self.dt return ts diff --git a/testsuite/MDAnalysisTests/coordinates/test_memory.py b/testsuite/MDAnalysisTests/coordinates/test_memory.py index 49da54ae12c..8188c688101 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_memory.py +++ b/testsuite/MDAnalysisTests/coordinates/test_memory.py @@ -29,7 +29,7 @@ from MDAnalysisTests.coordinates.base import (BaseReference, MultiframeReaderTest) from MDAnalysis.coordinates.memory import Timestep -from numpy.testing import assert_equal +from numpy.testing import assert_equal, assert_almost_equal class MemoryReference(BaseReference): @@ -193,3 +193,10 @@ def test_float32(self, ref): coordinates = np.random.uniform(size=(100, ref.universe.atoms.n_atoms, 3)).cumsum(0) universe = mda.Universe(ref.universe.filename, coordinates, format=MemoryReader) assert_equal(universe.trajectory.get_array().dtype, np.dtype('float32')) + + def test_position_assignation(self, reader): + # When coordinates are assigned to a timestep, is the change persistent? + new_positions = np.ones_like(reader.ts.positions, dtype=np.float32) + reader.ts.positions = new_positions + reader[0] + assert_almost_equal(reader.ts.positions, new_positions) From cca00f746f63f9b94fc35a3b8abc2a1b7ab09482 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Tue, 7 Aug 2018 10:09:52 -0700 Subject: [PATCH 375/455] doc updates/fixes for MemoryReader and Timestep --- package/MDAnalysis/coordinates/base.py | 76 ++++++++++++------------ package/MDAnalysis/coordinates/memory.py | 67 ++++++++++++--------- 2 files changed, 78 insertions(+), 65 deletions(-) diff --git a/package/MDAnalysis/coordinates/base.py b/package/MDAnalysis/coordinates/base.py index 8ab1a84e511..8d9fa216bfd 100644 --- a/package/MDAnalysis/coordinates/base.py +++ b/package/MDAnalysis/coordinates/base.py @@ -278,7 +278,7 @@ def __init__(self, n_atoms, **kwargs): # set up aux namespace for adding auxiliary data self.aux = Namespace() - + @classmethod def from_timestep(cls, other, **kwargs): @@ -589,7 +589,7 @@ def positions(self): .. versionchanged:: 0.11.0 - Now can raise :exc`NoDataError` when no position data present + Now can raise :exc:`NoDataError` when no position data present """ if self.has_positions: return self._pos @@ -932,7 +932,7 @@ def __len__(self): else: # The range is empty. return 0 - + def __iter__(self): for i in range(self.start, self.stop, self.step): yield self.trajectory[i] @@ -960,7 +960,7 @@ def __getitem__(self, frame): start = max(0, start) else: stop = max(0, stop) - + new_slice = slice(start, stop, step) return FrameIteratorSliced(self.trajectory, new_slice) else: @@ -1402,9 +1402,9 @@ def next(self): else: for auxname in self.aux_list: ts = self._auxs[auxname].update_ts(ts) - + ts = self._apply_transformations(ts) - + return ts def __next__(self): @@ -1561,9 +1561,9 @@ def _read_frame_with_aux(self, frame): ts = self._read_frame(frame) # pylint: disable=assignment-from-no-return for aux in self.aux_list: ts = self._auxs[aux].update_ts(ts) - + ts = self._apply_transformations(ts) - + return ts def _sliced_iter(self, start, stop, step): @@ -1945,67 +1945,67 @@ def get_aux_descriptions(self, auxnames=None): auxnames = self.aux_list descriptions = [self._auxs[aux].get_description() for aux in auxnames] return descriptions - + @property def transformations(self): """ Returns the list of transformations""" return self._transformations - + @transformations.setter def transformations(self, transformations): if not self._transformations: self._transformations = transformations else: raise ValueError("Transformations are already set") - + def add_transformations(self, *transformations): """ Add all transformations to be applied to the trajectory. - + This function take as list of transformations as an argument. These transformations are functions that will be called by the Reader and given a :class:`Timestep` object as argument, which will be transformed and returned to the Reader. - The transformations can be part of the :mod:`~MDAnalysis.transformations` - module, or created by the user, and are stored as a list `transformations`. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. This list can only be modified once, and further calls of this function will raise an exception. - + .. code-block:: python - + u = MDAnalysis.Universe(topology, coordinates) workflow = [some_transform, another_transform, this_transform] u.trajectory.add_transformations(*workflow) - + Parameters ---------- transform_list : list list of all the transformations that will be applied to the coordinates - + See Also -------- :mod:`MDAnalysis.transformations` """ - + try: self.transformations = transformations except ValueError: - raise ValueError("Can't add transformations again. Please create new Universe object") + raise ValueError("Can't add transformations again. Please create new Universe object") else: self.ts = self._apply_transformations(self.ts) - - + + # call reader here to apply the newly added transformation on the # current loaded frame? - + def _apply_transformations(self, ts): """Applies all the transformations given by the user """ - + for transform in self.transformations: ts = transform(ts) - + return ts - - + + class ReaderBase(ProtoReader): """Base class for trajectory readers that extends :class:`ProtoReader` with a @@ -2245,7 +2245,7 @@ def copy(self): # since the transformations have already been applied to the frame # simply copy the property new.transformations = self.transformations - + return new def _read_first_frame(self): # pragma: no cover @@ -2279,30 +2279,30 @@ def close(self): # self.filename. Explicitly setting it to the null action in case # the IOBase.close method is ever changed from that. pass - + def add_transformations(self, *transformations): """ Add all transformations to be applied to the trajectory. - + This function take as list of transformations as an argument. These transformations are functions that will be called by the Reader and given a :class:`Timestep` object as argument, which will be transformed and returned to the Reader. - The transformations can be part of the :mod:`~MDAnalysis.transformations` - module, or created by the user, and are stored as a list `transformations`. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. This list can only be modified once, and further calls of this function will raise an exception. - + .. code-block:: python - + u = MDAnalysis.Universe(topology, coordinates) workflow = [some_transform, another_transform, this_transform] u.trajectory.add_transformations(*workflow) - + Parameters ---------- transform_list : list list of all the transformations that will be applied to the coordinates - + See Also -------- :mod:`MDAnalysis.transformations` @@ -2311,7 +2311,7 @@ def add_transformations(self, *transformations): #to avoid unintended behaviour where the coordinates of each frame are transformed #multiple times when iterating over the trajectory. #In this method, the trajectory is modified all at once and once only. - + super(SingleFrameReaderBase, self).add_transformations(*transformations) for transform in self.transformations: self.ts = transform(self.ts) @@ -2320,5 +2320,5 @@ def _apply_transformations(self, ts): """ Applies the transformations to the timestep.""" # Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` # to avoid applying the same transformations multiple times on each frame - + return ts diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index f91c0a688fe..b6a0d16a95a 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -193,26 +193,35 @@ class Timestep(base.Timestep): - """ - Timestep for the :class:`MemoryReader` + """Timestep for the :class:`MemoryReader` - Compared to the base :class:`base.Timestep`, this version has an additional - :meth:`replace_positions_array` method. This property replaces the array of - positions, while the :attr:`positions` property replaces the content of the + Compared to the base :class:`base.Timestep`, this version + (:class:`memory.Timestep`) has an additional + :meth:`replace_positions_array` method, which replaces the array of + positions while the :attr:`positions` property replaces the content of the array. + """ def replace_positions_array(self, new): """Replace the array of positions - Replaces the array of positions by an other array. This is different - from the bahavior of the :attr:`position` property that replaces the - **content** of the array. The :meth:`replace_positions_array` method - should only be used to set the positions to a different frame; there, - the memory reader sets the positions to a view to the correct frame. - Modifying the positions for a given frames should be done with the - :attr:`positions` attribute that do not break the link between the - array of positions in the time step and the - :attr:`MemoryReader.coordinate_array`. + Replaces the array of positions by another array. + + + Note + ---- + The behavior of :meth:`replace_positions_array` is different from the + behavior of the :attr:`position` property that replaces the **content** + of the array. The :meth:`replace_positions_array` method should only be + used to set the positions to a different frame in + :meth:`MemoryReader._read_next_timestep`; there, the memory reader sets + the positions to a view to the correct frame. Modifying the positions + for a given frames should be done with the :attr:`positions` attribute + that does not break the link between the array of positions in the time + step and the :attr:`MemoryReader.coordinate_array`. + + + .. versionadded:: 0.19.0 """ self.has_positions = True self._pos = new @@ -267,6 +276,7 @@ def __init__(self, coordinate_array, order='fac', At the moment, only a fixed `dimension` is supported, i.e., the same unit cell for all frames in `coordinate_array`. See issue `#1041`_. + .. _`#1041`: https://github.com/MDAnalysis/mdanalysis/issues/1041 .. versionchanged:: 0.18.1 @@ -278,13 +288,16 @@ def __init__(self, coordinate_array, order='fac', self.filename = filename self.stored_order = order - # See Issue #1685. The block below checks if the coordinate array passed is of shape (N, 3) and if it is, the coordiante array is reshaped to (1, N, 3) + # See Issue #1685. The block below checks if the coordinate array + # passed is of shape (N, 3) and if it is, the coordiante array is + # reshaped to (1, N, 3) try: if len(coordinate_array.shape) == 2 and coordinate_array.shape[1] == 3: coordinate_array = coordinate_array[np.newaxis, :, :] except AttributeError as e: - raise TypeError("The input has to be a numpy.ndarray that corresponds to the layout specified by the 'order' keyword." - ) + raise TypeError("The input has to be a numpy.ndarray that " + "corresponds to the layout specified by the " + "'order' keyword.") self.set_array(coordinate_array, order) self.n_frames = \ @@ -488,30 +501,30 @@ def __repr__(self): nframes=self.n_frames, natoms=self.n_atoms )) - + def add_transformations(self, *transformations): """ Add all transformations to be applied to the trajectory. - + This function take as list of transformations as an argument. These transformations are functions that will be called by the Reader and given a :class:`Timestep` object as argument, which will be transformed and returned to the Reader. - The transformations can be part of the :mod:`~MDAnalysis.transformations` - module, or created by the user, and are stored as a list `transformations`. + The transformations can be part of the :mod:`~MDAnalysis.transformations` + module, or created by the user, and are stored as a list `transformations`. This list can only be modified once, and further calls of this function will raise an exception. - + .. code-block:: python - + u = MDAnalysis.Universe(topology, coordinates) workflow = [some_transform, another_transform, this_transform] u.trajectory.add_transformations(*workflow) - + Parameters ---------- transform_list : list list of all the transformations that will be applied to the coordinates - + See Also -------- :mod:`MDAnalysis.transformations` @@ -520,7 +533,7 @@ def add_transformations(self, *transformations): #to avoid unintended behaviour where the coordinates of each frame are transformed #multiple times when iterating over the trajectory. #In this method, the trajectory is modified all at once and once only. - + super(MemoryReader, self).add_transformations(*transformations) for i, ts in enumerate(self): for transform in self.transformations: @@ -530,5 +543,5 @@ def _apply_transformations(self, ts): """ Applies the transformations to the timestep.""" # Overrides :meth:`~MDAnalysis.coordinates.base.ProtoReader.add_transformations` # to avoid applying the same transformations multiple times on each frame - + return ts From 0f18f489ff4d413f97bce9bab077d895751372a9 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Tue, 7 Aug 2018 14:44:03 -0700 Subject: [PATCH 376/455] updated selection.rst to match groups.py docstring --- .../source/documentation_pages/selections.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/package/doc/sphinx/source/documentation_pages/selections.rst b/package/doc/sphinx/source/documentation_pages/selections.rst index a3ed79c98d8..6868acee19c 100644 --- a/package/doc/sphinx/source/documentation_pages/selections.rst +++ b/package/doc/sphinx/source/documentation_pages/selections.rst @@ -92,6 +92,16 @@ atom *seg-name* *residue-number* *atom-name* e.g. ``DMPC 1 C2`` selects the C2 carbon of the first residue of the DMPC segment +altloc *alternative-location* + a selection for atoms where alternative locations are available, which is + often the case with high-resolution crystal structures + e.g. `resid 4 and resname ALA and altloc B` selects only the atoms of ALA-4 + that have an altloc B record. + +moltype *molecule-type* + select by molecule type, e.g. ``moltype Protein_A``. At the moment, only + the TPR format defines the molecule type. + Boolean ------- @@ -189,6 +199,11 @@ byres *selection* e.g. specify the subselection after the byres keyword. ``byres`` is a shortcut to ``same residue as`` +bonded *selection* + selects all atoms that are bonded to selection + eg: ``select name H and bonded name O`` selects only hydrogens bonded to + oxygens + Index ----- From 0f24b89c56086948ff61c485766d3fb1517a6c32 Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Wed, 8 Aug 2018 15:42:27 +0200 Subject: [PATCH 377/455] Fixed some typos in coordinates.memory --- package/MDAnalysis/coordinates/memory.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index b6a0d16a95a..2a0dda8de02 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -33,8 +33,8 @@ .. versionadded:: 0.16.0 The module contains a trajectory reader that operates on an array in -memory, rather than reading from file. This makes it possible to use -operate on raw coordinate using existing MDAnalysis tools. In +memory, rather than reading from file. This makes it possible to +operate on raw coordinates using existing MDAnalysis tools. In addition, it allows the user to make changes to the coordinates in a trajectory (e.g. through :attr:`MDAnalysis.core.groups.AtomGroup.positions`) without having @@ -215,8 +215,8 @@ def replace_positions_array(self, new): of the array. The :meth:`replace_positions_array` method should only be used to set the positions to a different frame in :meth:`MemoryReader._read_next_timestep`; there, the memory reader sets - the positions to a view to the correct frame. Modifying the positions - for a given frames should be done with the :attr:`positions` attribute + the positions to a view of the correct frame. Modifying the positions + for a given frame should be done with the :attr:`positions` attribute that does not break the link between the array of positions in the time step and the :attr:`MemoryReader.coordinate_array`. From 15fa3b3ec2a1d4748b45edc4fa452c45dd6d5541 Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Wed, 8 Aug 2018 17:08:24 +0200 Subject: [PATCH 378/455] added leading underscore to internal-only method `memory.Timestep._replace_positions_array()` --- package/MDAnalysis/coordinates/memory.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index 2a0dda8de02..617d4095f40 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -197,12 +197,12 @@ class Timestep(base.Timestep): Compared to the base :class:`base.Timestep`, this version (:class:`memory.Timestep`) has an additional - :meth:`replace_positions_array` method, which replaces the array of + :meth:`_replace_positions_array` method, which replaces the array of positions while the :attr:`positions` property replaces the content of the array. """ - def replace_positions_array(self, new): + def _replace_positions_array(self, new): """Replace the array of positions Replaces the array of positions by another array. @@ -210,9 +210,9 @@ def replace_positions_array(self, new): Note ---- - The behavior of :meth:`replace_positions_array` is different from the + The behavior of :meth:`_replace_positions_array` is different from the behavior of the :attr:`position` property that replaces the **content** - of the array. The :meth:`replace_positions_array` method should only be + of the array. The :meth:`_replace_positions_array` method should only be used to set the positions to a different frame in :meth:`MemoryReader._read_next_timestep`; there, the memory reader sets the positions to a view of the correct frame. Modifying the positions @@ -482,7 +482,7 @@ def _read_next_timestep(self, ts=None): basic_slice = ([slice(None)]*(f_index) + [self.ts.frame] + [slice(None)]*(2-f_index)) - ts.replace_positions_array(self.coordinate_array[basic_slice]) + ts._replace_positions_array(self.coordinate_array[basic_slice]) ts.time = self.ts.frame*self.dt return ts From dbad72cfdc0ceb2d16e0f91c978acf8615b6e8dd Mon Sep 17 00:00:00 2001 From: Andrew McCluskey Date: Fri, 10 Aug 2018 17:58:55 +0100 Subject: [PATCH 379/455] Allow read in of VERY large pdb files (#1978) Adds support for hybrid36 values in pdb ids --- package/AUTHORS | 2 +- package/CHANGELOG | 3 +- package/MDAnalysis/topology/PDBParser.py | 71 +++++++++++++++++-- testsuite/CHANGELOG | 4 +- .../MDAnalysisTests/topology/test_pdb.py | 45 ++++++++++++ 5 files changed, 117 insertions(+), 8 deletions(-) diff --git a/package/AUTHORS b/package/AUTHORS index 1015e5bce8e..d97c5debb04 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -103,9 +103,9 @@ Chronological list of authors - Ayush Suhane - Davide Cruz - Shujie Fan + - Andrew R. McCluskey - Henry Mull - External code ------------- diff --git a/package/CHANGELOG b/package/CHANGELOG index 590af904242..c6d51787290 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -15,7 +15,7 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull, micaela-matta, - sebastien.buchoux + sebastien.buchoux, arm61 * 0.18.1 @@ -79,6 +79,7 @@ Fixes pack_into_box() (Issue #1911) * Fixed format of MODEL number in PDB file writing (Issue #1950) * PDBWriter now properly sets start value + * Introduced compatibility for pbd files hybrid36 format encoding (Issue #1897) * Zero length TopologyGroup now return proper shape array via to_indices (Issue #1974) * Added periodic boundary box support to the Tinker file reader (Issue #2001) diff --git a/package/MDAnalysis/topology/PDBParser.py b/package/MDAnalysis/topology/PDBParser.py index a3ac2d5905f..5a1391285b1 100644 --- a/package/MDAnalysis/topology/PDBParser.py +++ b/package/MDAnalysis/topology/PDBParser.py @@ -59,6 +59,7 @@ import numpy as np import warnings +from six.moves import range from .guessers import guess_masses, guess_types from ..lib import util from .base import TopologyReaderBase, change_squash @@ -87,6 +88,63 @@ def float_or_default(val, default): except ValueError: return default +DIGITS_UPPER = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" +DIGITS_LOWER = DIGITS_UPPER.lower() +DIGITS_UPPER_VALUES = dict([pair for pair in zip(DIGITS_UPPER, range(36))]) +DIGITS_LOWER_VALUES = dict([pair for pair in zip(DIGITS_LOWER, range(36))]) + +def decode_pure(digits_values, s): + """Decodes the string s using the digit, value associations for each + character. + + Parameters + ---------- + digits_values: dict + A dictionary containing the base-10 numbers that each hexadecimal + number corresponds to. + s: str + The contents of the pdb index columns. + + Returns + ------- + The integer in base-10 corresponding to traditional base-36. + """ + result = 0 + n = len(digits_values) + for c in s: + result *= n + result += digits_values[c] + return result + + +def hy36decode(width, s): + """ + Decodes base-10/upper-case base-36/lower-case base-36 hybrid. + + Parameters + ---------- + width: int + The number of columns in the pdb file store atom index. + s: str + The contents of the pdb index columns. + + Returns + ------- + int + Base-10 integer corresponding to hybrid36. + """ + if (len(s) == width): + f = s[0] + if (f == "-" or f == " " or f.isdigit()): + return int(s) + elif (f in DIGITS_UPPER_VALUES): + return decode_pure(digits_values=DIGITS_UPPER_VALUES, + s=s) - 10 * 36 ** (width - 1) + 10 ** width + elif (f in DIGITS_LOWER_VALUES): + return decode_pure(digits_values=DIGITS_LOWER_VALUES, + s=s) + 16 * 36 ** (width - 1) + 10 ** width + raise ValueError("invalid number literal.") + class PDBParser(TopologyReaderBase): """Parser that obtains a list of atoms from a standard PDB file. @@ -167,11 +225,14 @@ def _parseatoms(self): record_types.append(line[:6].strip()) try: serial = int(line[6:11]) - except ValueError: - # serial can become '***' when they get too high - self._wrapped_serials = True - serial = last_wrapped_serial - last_wrapped_serial += 1 + except: + try: + serial = hy36decode(5, line[6:11]) + except ValueError: + # serial can become '***' when they get too high + self._wrapped_serials = True + serial = last_wrapped_serial + last_wrapped_serial += 1 finally: serials.append(serial) diff --git a/testsuite/CHANGELOG b/testsuite/CHANGELOG index 5cc462da11b..2005a6397b7 100644 --- a/testsuite/CHANGELOG +++ b/testsuite/CHANGELOG @@ -13,10 +13,12 @@ Also see https://github.com/MDAnalysis/mdanalysis/wiki/MDAnalysisTests and https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests ------------------------------------------------------------------------------ -mm/dd/18 orbeckst +mm/dd/18 orbeckst, arm61 * 0.18.1 - skip tests for duecredit when duecredit is not installed (#1906) - updated meta data for PyPi and updated README and INSTALL + - added test for fix to issue #1897 + 04/15/18 tylerjereddy, zemanj * 0.18.0 diff --git a/testsuite/MDAnalysisTests/topology/test_pdb.py b/testsuite/MDAnalysisTests/topology/test_pdb.py index 74950921365..2182671280d 100644 --- a/testsuite/MDAnalysisTests/topology/test_pdb.py +++ b/testsuite/MDAnalysisTests/topology/test_pdb.py @@ -42,6 +42,29 @@ _PDBPARSER = mda.topology.PDBParser.PDBParser +hybrid36 = [ + ("A0000", 100000), + ("MEGAN", 20929695), + ("J0NNY", 15247214), + ("DREW6", 6417862), + ("ST3V3", 31691119), + ("ADA8M", 719798), + ("a0000", 43770016), + ("megan", 64599711), + ("j0nny", 58917230), + ("drew6", 50087878), + ("st3v3", 75361135), + ("ada8m", 44389814), + (" 6", 6), + (" 24", 24), + (" 645", 645), + (" 4951", 4951), + ("10267", 10267) +] + +@pytest.mark.parametrize('hybrid, integer', hybrid36) +def test_hy36decode(hybrid, integer): + assert mda.topology.PDBParser.hy36decode(5, hybrid) == integer class TestPDBParser(ParserBase): """This one has neither chainids or segids""" @@ -183,3 +206,25 @@ def test_PDB_no_resid(): assert len(u.residues) == 1 # should have default resid of 1 assert u.residues[0].resid == 1 + +PDB_hex = """\ +REMARK For testing reading of hex atom numbers +REMARK This has MODELs then hex atom numbers entries +CRYST1 80.000 80.017 80.017 90.00 90.00 90.00 P 1 1 +MODEL 1 +HETATM 1 H 2 L 400 20.168 00.034 40.428 +HETATMA0000 H 2 L 400 40.168 50.034 40.428 +HETATMA0001 H 2 L 400 30.453 60.495 50.132 +HETATMA0002 H 2 L 400 20.576 40.354 60.483 +HETATMA0003 H 2 L 400 10.208 30.067 70.045 +END +""" + +def test_PDB_hex(): + u = mda.Universe(StringIO(PDB_hex), format='PDB') + assert len(u.atoms) == 5 + assert u.atoms[0].id == 1 + assert u.atoms[1].id == 100000 + assert u.atoms[2].id == 100001 + assert u.atoms[3].id == 100002 + assert u.atoms[4].id == 100003 From 388346d38370d833b48152f61405a18942d25251 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Fri, 10 Aug 2018 13:26:10 -0700 Subject: [PATCH 380/455] additional PSA tests (#2036) * addition PSA tests - test functions that require seaborn (skip if cannot be imported) - updated warning for plot_nearest_neighbors() to use run_pairs_analysis(neighbors=True) --- package/MDAnalysis/analysis/psa.py | 2 +- .../MDAnalysisTests/analysis/test_psa.py | 51 ++++++++++++++----- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/package/MDAnalysis/analysis/psa.py b/package/MDAnalysis/analysis/psa.py index 05c2e1dd75a..ace947639b7 100644 --- a/package/MDAnalysis/analysis/psa.py +++ b/package/MDAnalysis/analysis/psa.py @@ -1983,7 +1983,7 @@ def plot_nearest_neighbors(self, filename=None, idx=0, \ if self._NN is None: raise ValueError("No nearest neighbor data; run " - "'PSAnalysis.run_nearest_neighbors()' first.") + "'PSAnalysis.run_pairs_analysis(neighbors=True)' first.") sns.set_style('whitegrid') diff --git a/testsuite/MDAnalysisTests/analysis/test_psa.py b/testsuite/MDAnalysisTests/analysis/test_psa.py index 8dab6d498c6..79b03dd0226 100644 --- a/testsuite/MDAnalysisTests/analysis/test_psa.py +++ b/testsuite/MDAnalysisTests/analysis/test_psa.py @@ -28,11 +28,11 @@ import MDAnalysis.analysis.psa as PSA from numpy.testing import (assert_array_less, - assert_array_almost_equal, assert_almost_equal, assert_equal) import numpy as np import scipy import scipy.spatial +import matplotlib from MDAnalysisTests.datafiles import PSF, DCD, DCD2 @@ -73,10 +73,29 @@ def frech_dists(self, frech_matrix): return frech_matrix[self.iu1] @pytest.fixture() - def plot_data(self, psa): + def plot_data(self, psa, tmpdir): psa.run(metric='hausdorff') psa.run(metric='discrete_frechet') - return psa.plot() + with tmpdir.as_cwd(): + results = psa.plot(filename="distmat.png") + return results + + @pytest.fixture() + def plot_annotated_heatmap(self, psa, tmpdir): + pytest.importorskip('seaborn') + psa.run(metric='hausdorff') + with tmpdir.as_cwd(): + results = psa.plot_annotated_heatmap(filename="annotated.png") + return results + + @pytest.fixture() + def plot_nearest_neighbors(self, psa, tmpdir): + pytest.importorskip('seaborn') + psa.run(metric='hausdorff') + psa.run_pairs_analysis(neighbors=True) + with tmpdir.as_cwd(): + results = psa.plot_nearest_neighbors(filename="nn.png") + return results @pytest.fixture() def hausd_pairs_dists(self, psa): @@ -106,9 +125,9 @@ def test_explicit_metric(self, psa, hausd_dists): def test_reversal_hausdorff(self, hausd_matrix): """Test whether Hausdorff distances are invariant to path reversal""" err_msg = "Hausdorff distances changed after path reversal" - assert_array_almost_equal(hausd_matrix[1,2], - hausd_matrix[0,1], - decimal=3, err_msg=err_msg) + assert_almost_equal(hausd_matrix[1,2], + hausd_matrix[0,1], + decimal=3, err_msg=err_msg) def test_reversal_frechet(self, frech_matrix): """Test whether Frechet distances are same/larger after path reversal""" @@ -120,6 +139,14 @@ def test_dendrogram_produced(self, plot_data): err_msg = "Dendrogram dictionary object was not produced" assert isinstance(plot_data[1], dict), err_msg + def test_dendrogram_produced_annotated(self, plot_annotated_heatmap): + """Test whether Dendrogram dictionary object was produced""" + err_msg = "Dendrogram dictionary object was not produced" + assert isinstance(plot_annotated_heatmap[1], dict), err_msg + + def test_plot_nearest_neighbors(self, plot_nearest_neighbors): + assert isinstance(plot_nearest_neighbors, matplotlib.axes.Axes) + def test_dist_mat_to_vec_i_less_j(self): """Test the index of corresponding distance vector is correct if i < j""" err_msg = "dist_mat_to_vec function returning wrong values" @@ -149,8 +176,8 @@ def test_hausdorff_pairs_distances(self, hausd_dists, hausd_pairs_dists): identical to those from standard Hausdorff metric""" err_msg = ("Some Hausdorff distances from pairs analysis vary " "significantly from usual Hausdorff calculation") - assert_array_almost_equal(hausd_dists, hausd_pairs_dists, - decimal=6, err_msg=err_msg) + assert_almost_equal(hausd_dists, hausd_pairs_dists, + decimal=6, err_msg=err_msg) def test_distances_from_hausdorff_pairs_frames(self, psa): """Test whether actual distances between frames of Hausdorff @@ -161,7 +188,7 @@ def test_distances_from_hausdorff_pairs_frames(self, psa): hausd_pairs_dists2 = np.array([hausd_pairs[i]['distance'] for i in range(npairs)]) - + err_msg = ("A Hausdorff pair analysis distance when accessed " "by frame varies from expected Hausdorff distance") dists = np.zeros((psa.npaths, psa.npaths)) @@ -172,9 +199,9 @@ def test_distances_from_hausdorff_pairs_frames(self, psa): dists[i,j] = (PSA.sqnorm(psa.paths[i][p,:,:] - psa.paths[j][q,:,:]) / psa.natoms)**0.5 - assert_array_almost_equal(hausd_pairs_dists2, - dists[self.iu1], - decimal=6, err_msg=err_msg) + assert_almost_equal(hausd_pairs_dists2, + dists[self.iu1], + decimal=6, err_msg=err_msg) class TestPSAExceptions(object): '''Tests for exceptions that should be raised From 93e6017c8f076f7977293ea75c03e2f856e30028 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 1 Aug 2018 10:02:07 -0700 Subject: [PATCH 381/455] Added Janin class to dihedrals.py --- package/MDAnalysis/analysis/dihedrals.py | 93 ++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 09f0c7dce92..42cc9d17db5 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -196,3 +196,96 @@ def plot(self, ax=None, **kwargs): a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) ax.scatter(a[:,0], a[:,1], **kwargs) return ax + +class Janin(AnalysisBase): + """Calculate chi1 and chi2 dihedral angles of selected residues. + + Chi1 and chi2 angles will be calculated for each residue corresponding to + `atomgroup` for each time step in the trajectory. A :class:`ResidueGroup` + is generated from `atomgroup` which is compared to the protein to determine + if it is a legitimate selection. + + Note + ---- + If the residue selection is beyond the scope of the protein, then an error + will be raised. If the residue selection includes the residues ALA, CYS, + GLY, PRO, SER, THR, or VAL, then a warning will be raised and they will be + removed from the list of residues, but the analysis will still run. + + """ + def __init__(self, atomgroup, **kwargs): + """Parameters + ---------- + atomgroup : AtomGroup or ResidueGroup + atoms for residues for which chi1 and chi2 are calculated + + Raises + ------ + ValueError + If the selection of residues is not contained within the protein + + """ + super(Janin, self).__init__(atomgroup.universe.trajectory, **kwargs) + self.atomgroup = atomgroup + residues = self.atomgroup.residues + protein = self.atomgroup.universe.select_atoms("protein").residues + remove = residues.atoms.select_atoms("resname ALA CYS GLY PRO SER" + " THR VAL").residues + + if not residues.issubset(protein): + raise ValueError("Found atoms outside of protein. Only atoms " + "inside of a 'protein' selection can be used to " + "calculate dihedrals.") + elif len(remove) != 0: + warnings.warn("Cannot determine chi1 and chi2 angles for residues " + "without side chains of appropriate length.") + residues = residues.difference(remove) + + self.ag1 = residues.atoms.select_atoms("name N") + self.ag2 = residues.atoms.select_atoms("name CA") + self.ag3 = residues.atoms.select_atoms("name CB") + self.ag4 = residues.atoms.select_atoms("name CG CG1") + self.ag5 = residues.atoms.select_atoms("name CD CD1 OD1 ND1 SD") + + def _prepare(self): + self.angles = [] + + def _single_frame(self): + chi1_angle = (calc_dihedrals(self.ag1.positions, self.ag2.positions, + self.ag3.positions, self.ag4.positions, + box=self.ag1.dimensions)+2*np.pi)%(2*np.pi) + chi2_angle = (calc_dihedrals(self.ag2.positions, self.ag3.positions, + self.ag4.positions, self.ag5.positions, + box=self.ag1.dimensions)+2*np.pi)%(2*np.pi) + chi1_chi2 = [(chi1, chi2) for chi1, chi2 in zip(chi1_angle, chi2_angle)] + self.angles.append(chi1_chi2) + + def _conclude(self): + self.angles = np.rad2deg(np.array(self.angles)) + + def plot(self, ax=None, **kwargs): + """Plots data into standard Janin plot. Each time step in + :attr:`Janin.angles` is plotted onto the same graph. + + Parameters + ---------- + ax : :class:`matplotlib.axes.Axes` + If no `ax` is supplied or set to ``None`` then the plot will + be added to the current active axes. + + Returns + ------- + ax : :class:`matplotlib.axes.Axes` + Axes with the plot, either `ax` or the current axes. + + """ + if ax is None: + ax = plt.gca() + ax.axis([0, 360, 0, 360]) + ax.axhline(180, color='k', lw=1) + ax.axvline(180, color='k', lw=1) + ax.set(xticks=range(0,361,60), yticks=range(0,361,60), + xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") + a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) + ax.scatter(a[:,0], a[:,1], **kwargs) + return ax From e03fd0d8f0aeeea6019af0a7ec52596ec7001371 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 1 Aug 2018 14:17:42 -0700 Subject: [PATCH 382/455] updated test_dihedrals for Janin class, added test data to datafiles.py --- .../analysis/test_dihedrals.py | 55 ++++++++++++++++-- ..._dihedrals.npy => adk_oplsaa_GLY_rama.npy} | Bin .../data/adk_oplsaa_LYS_janin.npy | Bin 0 -> 3008 bytes .../MDAnalysisTests/data/adk_oplsaa_janin.npy | Bin 0 -> 20768 bytes ...lsaa_dihedrals.npy => adk_oplsaa_rama.npy} | Bin testsuite/MDAnalysisTests/datafiles.py | 8 ++- 6 files changed, 54 insertions(+), 9 deletions(-) rename testsuite/MDAnalysisTests/data/{adk_oplsaa_GLY_dihedrals.npy => adk_oplsaa_GLY_rama.npy} (100%) create mode 100644 testsuite/MDAnalysisTests/data/adk_oplsaa_LYS_janin.npy create mode 100644 testsuite/MDAnalysisTests/data/adk_oplsaa_janin.npy rename testsuite/MDAnalysisTests/data/{adk_oplsaa_dihedrals.npy => adk_oplsaa_rama.npy} (100%) diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 07e4b89e1d7..b9aa9ce0291 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -27,9 +27,9 @@ import pytest import MDAnalysis as mda -from MDAnalysisTests.datafiles import (GRO, XTC, DihedralsArray, - GLYDihedralsArray) -from MDAnalysis.analysis.dihedrals import Ramachandran +from MDAnalysisTests.datafiles import (GRO, XTC, RamaArray, GLYRamaArray, + JaninArray, LYSJaninArray) +from MDAnalysis.analysis.dihedrals import Ramachandran, Janin class TestRamachandran(object): @@ -40,7 +40,7 @@ def universe(self): def test_ramachandran(self, universe): rama = Ramachandran(universe.select_atoms("protein")).run() - test_rama = np.load(DihedralsArray) + test_rama = np.load(RamaArray) assert_almost_equal(rama.angles, test_rama, 5, err_msg="error: dihedral angles should " @@ -49,7 +49,7 @@ def test_ramachandran(self, universe): def test_ramachandran_single_frame(self, universe): rama = Ramachandran(universe.select_atoms("protein"), start=5, stop=6).run() - test_rama = [np.load(DihedralsArray)[5]] + test_rama = [np.load(RamaArray)[5]] assert_almost_equal(rama.angles, test_rama, 5, err_msg="error: dihedral angles should " @@ -57,7 +57,7 @@ def test_ramachandran_single_frame(self, universe): def test_ramachandran_residue_selections(self, universe): rama = Ramachandran(universe.select_atoms("resname GLY")).run() - test_rama = np.load(GLYDihedralsArray) + test_rama = np.load(GLYRamaArray) assert_almost_equal(rama.angles, test_rama, 5, err_msg="error: dihedral angles should " @@ -75,3 +75,46 @@ def test_plot(self, universe): ax = Ramachandran(universe.select_atoms("resid 5-10")).run().plot() assert isinstance(ax, matplotlib.axes.Axes), \ "Ramachandran.plot() did not return and Axes instance" + +class TestJanin(object): + + @pytest.fixture() + def universe(self): + return mda.Universe(GRO, XTC) + + def test_janin(self, universe): + janin = Janin(universe.select_atoms("protein")).run() + test_janin = np.load(JaninArray) + + assert_almost_equal(janin.angles, test_janin, 5, + err_msg="error: dihedral angles should " + "match test values") + + def test_janin_single_frame(self, universe): + janin = Janin(universe.select_atoms("protein"), start=5, stop=6).run() + test_janin = [np.load(JaninArray)[5]] + + assert_almost_equal(janin.angles, test_janin, 5, + err_msg="error: dihedral angles should " + "match test values") + + def test_janin_residue_selections(self, universe): + janin = Janin(universe.select_atoms("resname LYS")).run() + test_janin = np.load(LYSJaninArray) + + assert_almost_equal(janin.angles, test_janin, 5, + err_msg="error: dihedral angles should " + "match test values") + + def test_outside_protein_length(self, universe): + with pytest.raises(ValueError): + janin = Janin(universe.select_atoms("resid 220")).run() + + def test_remove_residues(self, universe): + with pytest.warns(UserWarning): + janin = Janin(universe.select_atoms("protein")).run() + + def test_plot(self, universe): + ax = Janin(universe.select_atoms("resid 5-10")).run().plot() + assert isinstance(ax, matplotlib.axes.Axes), \ + "Ramachandran.plot() did not return and Axes instance" diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_dihedrals.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_rama.npy similarity index 100% rename from testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_dihedrals.npy rename to testsuite/MDAnalysisTests/data/adk_oplsaa_GLY_rama.npy diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_LYS_janin.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_LYS_janin.npy new file mode 100644 index 0000000000000000000000000000000000000000..3117bca7f0bbf13db563bde137f7c37b1b43f802 GIT binary patch literal 3008 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 literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_dihedrals.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_rama.npy similarity index 100% rename from testsuite/MDAnalysisTests/data/adk_oplsaa_dihedrals.npy rename to testsuite/MDAnalysisTests/data/adk_oplsaa_rama.npy diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index afc51555d0e..e3625d65127 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -156,7 +156,7 @@ "legacy_DCD_c36_coords", # frames 1 and 4 read in for tip125_tric_C36.dcd using legacy DCD reader "GSD", "GRO_MEMPROT", "XTC_MEMPROT", # YiiP transporter in POPE:POPG lipids with Na+, Cl-, Zn2+ dummy model without water - "DihedralsArray", "GLYDihedralsArray" # phi and psi angles for testing Ramachandran class + "RamaArray", "GLYRamaArray", "JaninArray", "LYSJaninArray" # Time series of various dihedral angles for testing dihedrals.py ] from pkg_resources import resource_filename @@ -417,8 +417,10 @@ GSD = resource_filename(__name__, 'data/example.gsd') -DihedralsArray = resource_filename(__name__, 'data/adk_oplsaa_dihedrals.npy') -GLYDihedralsArray = resource_filename(__name__, 'data/adk_oplsaa_GLY_dihedrals.npy') +RamaArray = resource_filename(__name__, 'data/adk_oplsaa_rama.npy') +GLYRamaArray = resource_filename(__name__, 'data/adk_oplsaa_GLY_rama.npy') +JaninArray = resource_filename(__name__, 'data/adk_oplsaa_janin.npy') +LYSJaninArray = resource_filename(__name__, 'data/adk_oplsaa_LYS_janin.npy') # This should be the last line: clean up namespace del resource_filename From c8f5d82df7fafc7a6a91a6b3c2faef408b7a6f73 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 1 Aug 2018 14:18:44 -0700 Subject: [PATCH 383/455] cleaned up janin class --- package/MDAnalysis/analysis/dihedrals.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 42cc9d17db5..bf982b59197 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -251,17 +251,17 @@ def _prepare(self): self.angles = [] def _single_frame(self): - chi1_angle = (calc_dihedrals(self.ag1.positions, self.ag2.positions, + chi1_angle = calc_dihedrals(self.ag1.positions, self.ag2.positions, self.ag3.positions, self.ag4.positions, - box=self.ag1.dimensions)+2*np.pi)%(2*np.pi) - chi2_angle = (calc_dihedrals(self.ag2.positions, self.ag3.positions, + box=self.ag1.dimensions) + chi2_angle = calc_dihedrals(self.ag2.positions, self.ag3.positions, self.ag4.positions, self.ag5.positions, - box=self.ag1.dimensions)+2*np.pi)%(2*np.pi) + box=self.ag1.dimensions) chi1_chi2 = [(chi1, chi2) for chi1, chi2 in zip(chi1_angle, chi2_angle)] self.angles.append(chi1_chi2) def _conclude(self): - self.angles = np.rad2deg(np.array(self.angles)) + self.angles = (np.rad2deg(np.array(self.angles)) + 360) % 360 def plot(self, ax=None, **kwargs): """Plots data into standard Janin plot. Each time step in From 8eadbe8a00aa3d8661c079f826003b064f390aa9 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 1 Aug 2018 14:40:23 -0700 Subject: [PATCH 384/455] Made Janin class a subclass of Ramachandran --- package/MDAnalysis/analysis/dihedrals.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index bf982b59197..8ecb020d079 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -197,7 +197,7 @@ def plot(self, ax=None, **kwargs): ax.scatter(a[:,0], a[:,1], **kwargs) return ax -class Janin(AnalysisBase): +class Janin(Ramachandran): """Calculate chi1 and chi2 dihedral angles of selected residues. Chi1 and chi2 angles will be calculated for each residue corresponding to @@ -225,7 +225,7 @@ def __init__(self, atomgroup, **kwargs): If the selection of residues is not contained within the protein """ - super(Janin, self).__init__(atomgroup.universe.trajectory, **kwargs) + super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) self.atomgroup = atomgroup residues = self.atomgroup.residues protein = self.atomgroup.universe.select_atoms("protein").residues @@ -247,19 +247,6 @@ def __init__(self, atomgroup, **kwargs): self.ag4 = residues.atoms.select_atoms("name CG CG1") self.ag5 = residues.atoms.select_atoms("name CD CD1 OD1 ND1 SD") - def _prepare(self): - self.angles = [] - - def _single_frame(self): - chi1_angle = calc_dihedrals(self.ag1.positions, self.ag2.positions, - self.ag3.positions, self.ag4.positions, - box=self.ag1.dimensions) - chi2_angle = calc_dihedrals(self.ag2.positions, self.ag3.positions, - self.ag4.positions, self.ag5.positions, - box=self.ag1.dimensions) - chi1_chi2 = [(chi1, chi2) for chi1, chi2 in zip(chi1_angle, chi2_angle)] - self.angles.append(chi1_chi2) - def _conclude(self): self.angles = (np.rad2deg(np.array(self.angles)) + 360) % 360 From 8c873c862bafc3cb679fbdadb434f398a387bf03 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 1 Aug 2018 17:15:52 -0700 Subject: [PATCH 385/455] Added general Dihedral class, with tests and test data --- package/MDAnalysis/analysis/dihedrals.py | 25 ++++++++++ .../analysis/test_dihedrals.py | 44 ++++++++++++++++-- .../data/adk_oplsaa_dihedral.npy | Bin 0 -> 208 bytes .../data/adk_oplsaa_dihedral_list.npy | Bin 0 -> 288 bytes testsuite/MDAnalysisTests/datafiles.py | 6 ++- 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 testsuite/MDAnalysisTests/data/adk_oplsaa_dihedral.npy create mode 100644 testsuite/MDAnalysisTests/data/adk_oplsaa_dihedral_list.npy diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 8ecb020d079..5625a556d78 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -103,6 +103,31 @@ from MDAnalysis.lib.distances import calc_dihedrals +class Dihedral(AnalysisBase): + def __init__(self, atomgroups, **kwargs): + super(Dihedral, self).__init__(atomgroups[0].universe.trajectory, **kwargs) + self.atomgroups = atomgroups + + if any([len(ag) != 4 for ag in atomgroups]): + raise ValueError("All AtomGroups must contain 4 atoms") + + self.ag1 = mda.AtomGroup([ag[0] for ag in atomgroups]) + self.ag2 = mda.AtomGroup([ag[1] for ag in atomgroups]) + self.ag3 = mda.AtomGroup([ag[2] for ag in atomgroups]) + self.ag4 = mda.AtomGroup([ag[3] for ag in atomgroups]) + + def _prepare(self): + self.angles = [] + + def _single_frame(self): + angle = calc_dihedrals(self.ag1.positions, self.ag2.positions, + self.ag3.positions, self.ag4.positions, + box=self.ag1.dimensions) + self.angles.append(angle) + + def _conclude(self): + self.angles = np.rad2deg(np.array(self.angles)) + class Ramachandran(AnalysisBase): """Calculate phi and psi dihedral angles of selected residues. diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index b9aa9ce0291..245f80fb6e3 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -27,11 +27,49 @@ import pytest import MDAnalysis as mda -from MDAnalysisTests.datafiles import (GRO, XTC, RamaArray, GLYRamaArray, - JaninArray, LYSJaninArray) -from MDAnalysis.analysis.dihedrals import Ramachandran, Janin +from MDAnalysisTests.datafiles import (GRO, XTC, DihedralArray, DihedralsArray, + RamaArray, GLYRamaArray, JaninArray, + LYSJaninArray) +from MDAnalysis.analysis.dihedrals import Dihedral, Ramachandran, Janin +class TestDihedral(object): + + @pytest.fixture() + def atomgroup(self): + u = mda.Universe(GRO, XTC) + ag = u.select_atoms("(resid 4 and name N CA C) or (resid 5 and name N)") + return ag + + + def test_dihedral(self, atomgroup): + dihedral = Dihedral([atomgroup]).run() + test_dihedral = np.load(DihedralArray) + + assert_almost_equal(dihedral.angles, test_dihedral, 5, + err_msg="error: dihedral angles should " + "match test values") + + def test_dihedral_single_frame(self, atomgroup): + dihedral = Dihedral([atomgroup], start=5, stop=6).run() + test_dihedral = [np.load(DihedralArray)[5]] + + assert_almost_equal(dihedral.angles, test_dihedral, 5, + err_msg="error: dihedral angles should " + "match test vales") + + def test_atomgroup_list(self, atomgroup): + dihedral = Dihedral([atomgroup, atomgroup]).run() + test_dihedral = np.load(DihedralsArray) + + assert_almost_equal(dihedral.angles, test_dihedral, 5, + err_msg="error: dihedral angles should " + "match test values") + + def test_enough_atoms(self, atomgroup): + with pytest.raises(ValueError): + dihedral = Dihedral([atomgroup[:2]]).run() + class TestRamachandran(object): @pytest.fixture() diff --git a/testsuite/MDAnalysisTests/data/adk_oplsaa_dihedral.npy b/testsuite/MDAnalysisTests/data/adk_oplsaa_dihedral.npy new file mode 100644 index 0000000000000000000000000000000000000000..aba09266b8edf63bcb6e248274260c5c260ef54d GIT binary patch literal 208 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-2099cnmP)#3giN=0s&S}!RADVh@WQVPeNlI<~mADaXpyeU|k-rY*v`) zu#%u)pnJhB^ Date: Tue, 7 Aug 2018 13:49:34 -0700 Subject: [PATCH 386/455] fixed selections returning none in the middle of a protein --- package/MDAnalysis/analysis/dihedrals.py | 138 +++++++++++++++++------ 1 file changed, 103 insertions(+), 35 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 5625a556d78..997b0d17d1f 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -20,7 +20,7 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # """ -Dihedral and Ramachandran analysis --- :mod:`MDAnalysis.analysis.dihedrals` +Dihedral angles analysis --- :mod:`MDAnalysis.analysis.dihedrals` =========================================================================== :Author: Henry Mull @@ -29,14 +29,14 @@ .. versionadded:: 0.18.1 -This module calculates the dihedral angles phi and psi in degrees for a given -list of residues (or atoms corresponding to the residues). This can be done for -selected frames or whole trajectories. +This module contains classes for calculating dihedral angles for a given set of +atoms or residues. This can be done for selected frames or whole trajectories. -A list of time steps that contain phi and psi angles for each residue is -generated, and a basic Ramachandran plot can be generated using the method -:meth:`Ramachandran.plot()`. This plot is best used as a reference, but it also -allows for user customization. +A list of time steps that contain angles of interest is generated and can be +easily plotted if desired. For the :class:`~MDAnalysis.analysis.dihedrals.Ramachandran` +and :class:`~MDAnalysis.analysis.dihedrals.Janin` classes, basic plots can be +generated using the method :meth:`Ramachandran.plot()` or :meth:`Janin.plot()`. +These plots are best used as references, but they also allow for user customization. See Also @@ -45,40 +45,63 @@ function to calculate dihedral angles from atom positions -Example application -------------------- -This example will show how to calculate the phi and psi angles of adenylate -kinase (AdK) and generate a basic Ramachandran plot. The trajectory is included -within the test data files:: +Example applications +-------------------- + +General dihedral analysis +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The :class:`~MDAnalysis.analysis.dihedrals.Dihedral` class is useful for calculating +angles for many dihedrals of interest. For example, we can find the phi angles +for residues 5-10 of adenylate kinase (AdK). The trajectory is included within +the test data files:: import MDAnalysis as mda from MDAnalysisTests.datafiles import GRO, XTC u = mda.Universe(GRO, XTC) - r = u.select_atoms("protein") # selection of residues - from MDAnalysis.analysis.dihedrals import Ramachandran + # selection of atomgroups + ags = [res.phi_selection() for res in u.residues[4:9]] + + from MDAnalysis.analysis.dihedrals import Dihedral + R = Dihedral(ags).run() + +The angles can then be accessed with :attr:`Dihedral.angles`. + +Ramachandran analysis +~~~~~~~~~~~~~~~~~~~~~ + +The :class:`~MDAnalysis.analysis.dihedrals.Ramachandran` class allows for the +quick calculation of phi and psi angles. Unlike the :class:`~MDanalysis.analysis.dihedrals.Dihedral` +class which takes a list of `atomgroups`, this class only needs a list of +residues or atoms from those residues. The previous example can repeated with:: + + u = mda.Universe(GRO, XTC) + r = u.select_atoms("resid 5-10") + R = Ramachandran(r).run() +Then it can be plotted using the built-in plotting method :meth:`Ramachandran.plot()`:: + import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=plt.figaspect(1)) - ax.set_title("Ramachandran Plot (AdK)") R.plot(ax=ax, color='k', marker='s') -Alternatively, if you wanted to plot the data yourself, the angles themselves -can be accessed using :attr:`Ramachandran.angles`:: - - fig, ax = plt.subplots(figsize=plt.figaspect(1)) - ax.axis([-180,180,-180,180]) - ax.axhline(0, color='k', lw=1) - ax.axvline(0, color='k', lw=1) - ax.set(xticks=range(-180,181,60), yticks=range(-180,181,60), - xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") - for ts in R.angles: - ax.scatter(ts[:,0], ts[:,1], color='k', marker='s') +The Janin class works in the same way, only needing a list of residues. Analysis Class -------------- +.. autoclass:: Dihedral + :members: + :inherited-members: + + .. attribute:: angles + + Contains the time steps of the angles for each atomgroup in the list as + an n_frames×len(atomgroups) :class:`numpy.ndarray` with content + ``[[angle 1, angle 2, ...], [time step 2], ...]``. + .. autoclass:: Ramachandran :members: :inherited-members: @@ -89,6 +112,16 @@ an n_frames×n_residues×2 :class:`numpy.ndarray` with content ``[[[phi, psi], [residue 2], ...], [time step 2], ...]``. +.. autoclass:: Janin + :members: + :inherited-members: + + .. attribute:: angles + + Contains the time steps of the phi and psi angles for each residue as + an n_frames×n_residues×2 :class:`numpy.ndarray` with content + ``[[[chi1, chi2], [residue 2], ...], [time step 2], ...]``. + """ from __future__ import absolute_import from six.moves import zip, range @@ -104,7 +137,31 @@ class Dihedral(AnalysisBase): + """Calculate dihedral angles for specified atomgroups. + + Dihedral angles will be calculated for each atomgroup that is given for + each step in the trajectory. Each :class:`~MDAnalysis.core.groups.AtomGroup` + must contain 4 atoms. + + Note + ---- + This class takes a list as an input and is most useful for a large + selection of atomgroups. If there is only one atomgroup of interest, then + it must be given as a list of one atomgroup. + + """ def __init__(self, atomgroups, **kwargs): + """Parameters + ---------- + atomgroups : list + a list of atomgroups for which the dihedral angles are calculated + + Raises + ------ + ValueError + If any atomgroups do not contain 4 atoms + + """ super(Dihedral, self).__init__(atomgroups[0].universe.trajectory, **kwargs) self.atomgroups = atomgroups @@ -132,7 +189,7 @@ class Ramachandran(AnalysisBase): """Calculate phi and psi dihedral angles of selected residues. Phi and psi angles will be calculated for each residue corresponding to - `atomgroup` for each time step in the trajectory. A :class:`ResidueGroup` + `atomgroup` for each time step in the trajectory. A :class:`~MDAnalysis.ResidueGroup` is generated from `atomgroup` which is compared to the protein to determine if it is a legitimate selection. @@ -153,7 +210,7 @@ def __init__(self, atomgroup, **kwargs): Raises ------ ValueError - If the selection of residues is not contained within the protein + If the selection of residues is not contained within the protein """ super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) @@ -172,6 +229,16 @@ def __init__(self, atomgroup, **kwargs): phi_sel = [res.phi_selection() for res in residues] psi_sel = [res.psi_selection() for res in residues] + if any(sel is None for sel in phi_sel): + warnings.warn("Some residues in selection do not have phi selections") + remove = [i for i, sel in enumerate(phi_sel) if sel is None] + phi_sel = [sel for i, sel in enumerate(phi_sel) if i not in remove] + psi_sel = [sel for i, sel in enumerate(psi_sel) if i not in remove] + if any(sel is None for sel in psi_sel): + warnings.warn("Some residues in selection do not have psi selections") + remove = [i for i, sel in enumerate(psi_sel) if sel is None] + phi_sel = [sel for i, sel in enumerate(phi_sel) if i not in remove] + psi_sel = [sel for i, sel in enumerate(psi_sel) if i not in remove] self.ag1 = mda.AtomGroup([atoms[0] for atoms in phi_sel]) self.ag2 = mda.AtomGroup([atoms[1] for atoms in phi_sel]) self.ag3 = mda.AtomGroup([atoms[2] for atoms in phi_sel]) @@ -226,7 +293,7 @@ class Janin(Ramachandran): """Calculate chi1 and chi2 dihedral angles of selected residues. Chi1 and chi2 angles will be calculated for each residue corresponding to - `atomgroup` for each time step in the trajectory. A :class:`ResidueGroup` + `atomgroup` for each time step in the trajectory. A :class:`~MDAnalysis.ResidueGroup` is generated from `atomgroup` which is compared to the protein to determine if it is a legitimate selection. @@ -266,11 +333,12 @@ def __init__(self, atomgroup, **kwargs): "without side chains of appropriate length.") residues = residues.difference(remove) - self.ag1 = residues.atoms.select_atoms("name N") - self.ag2 = residues.atoms.select_atoms("name CA") - self.ag3 = residues.atoms.select_atoms("name CB") - self.ag4 = residues.atoms.select_atoms("name CG CG1") - self.ag5 = residues.atoms.select_atoms("name CD CD1 OD1 ND1 SD") + self.ag1 = residues.atoms.select_atoms("name N and not altloc B") + self.ag2 = residues.atoms.select_atoms("name CA and not altloc B") + self.ag3 = residues.atoms.select_atoms("name CB and not altloc B") + self.ag4 = residues.atoms.select_atoms("name CG CG1 and not altloc B") + self.ag5 = residues.atoms.select_atoms("name CD CD1 OD1 ND1 SD and not" + "altloc B") def _conclude(self): self.angles = (np.rad2deg(np.array(self.angles)) + 360) % 360 From 5efef65da7439fcde1c4f2fc710dc276b273f5fa Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 8 Aug 2018 15:19:52 -0700 Subject: [PATCH 387/455] updated to deal with selection failures --- package/MDAnalysis/analysis/dihedrals.py | 32 ++++++++++++++++-------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 997b0d17d1f..9ff025513f0 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -302,7 +302,9 @@ class Janin(Ramachandran): If the residue selection is beyond the scope of the protein, then an error will be raised. If the residue selection includes the residues ALA, CYS, GLY, PRO, SER, THR, or VAL, then a warning will be raised and they will be - removed from the list of residues, but the analysis will still run. + removed from the list of residues, but the analysis will still run. Some + topologies have altloc attribues which can add duplicate atoms to the + selection and must be removed. """ def __init__(self, atomgroup, **kwargs): @@ -316,11 +318,15 @@ def __init__(self, atomgroup, **kwargs): ValueError If the selection of residues is not contained within the protein + ValueError + If not enough or too many atoms are found for a residue in the + selection, usually due to missing atoms or alternative locations + """ super(Ramachandran, self).__init__(atomgroup.universe.trajectory, **kwargs) self.atomgroup = atomgroup - residues = self.atomgroup.residues - protein = self.atomgroup.universe.select_atoms("protein").residues + residues = atomgroup.residues + protein = atomgroup.universe.select_atoms("protein").residues remove = residues.atoms.select_atoms("resname ALA CYS GLY PRO SER" " THR VAL").residues @@ -329,16 +335,20 @@ def __init__(self, atomgroup, **kwargs): "inside of a 'protein' selection can be used to " "calculate dihedrals.") elif len(remove) != 0: - warnings.warn("Cannot determine chi1 and chi2 angles for residues " - "without side chains of appropriate length.") + warnings.warn("All ALA, CYS, GLY, PRO, SER, THR, and VAL residues" + " have been removed from the selection.") residues = residues.difference(remove) - self.ag1 = residues.atoms.select_atoms("name N and not altloc B") - self.ag2 = residues.atoms.select_atoms("name CA and not altloc B") - self.ag3 = residues.atoms.select_atoms("name CB and not altloc B") - self.ag4 = residues.atoms.select_atoms("name CG CG1 and not altloc B") - self.ag5 = residues.atoms.select_atoms("name CD CD1 OD1 ND1 SD and not" - "altloc B") + self.ag1 = atomgroup.atoms.select_atoms("name N") + self.ag2 = atomgroup.atoms.select_atoms("name CA") + self.ag3 = atomgroup.atoms.select_atoms("name CB") + self.ag4 = atomgroup.atoms.select_atoms("name CG CG1") + self.ag5 = atomgroup.atoms.select_atoms("name CD CD1 OD1 ND1 SD") + + if any(len(self.ag1) != len(ag) for ag in [self.ag2, self.ag3, + self.ag4, self.ag5]): + raise ValueError("Too many or too few atoms selected. Check for " + "missing or duplicate atoms in topology.") def _conclude(self): self.angles = (np.rad2deg(np.array(self.angles)) + 360) % 360 From 92c99b7beef1af8e375cd1ad9e5b2e9feb5632e4 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 8 Aug 2018 15:57:13 -0700 Subject: [PATCH 388/455] Updated test_dihedrals.py for new features --- package/MDAnalysis/analysis/dihedrals.py | 10 +++++----- testsuite/MDAnalysisTests/analysis/test_dihedrals.py | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 9ff025513f0..8534636a741 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -339,11 +339,11 @@ def __init__(self, atomgroup, **kwargs): " have been removed from the selection.") residues = residues.difference(remove) - self.ag1 = atomgroup.atoms.select_atoms("name N") - self.ag2 = atomgroup.atoms.select_atoms("name CA") - self.ag3 = atomgroup.atoms.select_atoms("name CB") - self.ag4 = atomgroup.atoms.select_atoms("name CG CG1") - self.ag5 = atomgroup.atoms.select_atoms("name CD CD1 OD1 ND1 SD") + self.ag1 = residues.atoms.select_atoms("name N") + self.ag2 = residues.atoms.select_atoms("name CA") + self.ag3 = residues.atoms.select_atoms("name CB") + self.ag4 = residues.atoms.select_atoms("name CG CG1") + self.ag5 = residues.atoms.select_atoms("name CD CD1 OD1 ND1 SD") if any(len(self.ag1) != len(ag) for ag in [self.ag2, self.ag3, self.ag4, self.ag5]): diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 245f80fb6e3..5d3c65c9690 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -109,6 +109,11 @@ def test_protein_ends(self, universe): with pytest.warns(UserWarning): rama = Ramachandran(universe.select_atoms("protein")).run() + def test_None_removal(self): + with pytest.warns(UserWarning): + u = mda.coordinates.MMTF.fetch_mmtf('19hc') + rama = Ramachandran(u.select_atoms("protein").residues[1:-1]) + def test_plot(self, universe): ax = Ramachandran(universe.select_atoms("resid 5-10")).run().plot() assert isinstance(ax, matplotlib.axes.Axes), \ @@ -152,6 +157,12 @@ def test_remove_residues(self, universe): with pytest.warns(UserWarning): janin = Janin(universe.select_atoms("protein")).run() + def test_atom_selection(self): + with pytest.raises(ValueError): + u = mda.coordinates.MMTF.fetch_mmtf('1a28') + janin = Janin(u.select_atoms("protein and not resname ALA CYS GLY " + "PRO SER THR VAL")) + def test_plot(self, universe): ax = Janin(universe.select_atoms("resid 5-10")).run().plot() assert isinstance(ax, matplotlib.axes.Axes), \ From b72815becbf3449444ea0c3c9ced9ea428bcd36c Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 8 Aug 2018 16:27:21 -0700 Subject: [PATCH 389/455] updated docstring for dihedrals.py --- package/MDAnalysis/analysis/dihedrals.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 8534636a741..75c61918939 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -89,8 +89,13 @@ class which takes a list of `atomgroups`, this class only needs a list of The Janin class works in the same way, only needing a list of residues. -Analysis Class --------------- +These classes are prone to errors if the topology contains duplicate or missing +atoms (e.g. atoms with `altloc` or incomplete residues). If the topology has as +an `altloc` attribute, you must specify only one `altloc` for the atoms with +more than one (``"protein and not altloc B"``). + +Analysis Classes +---------------- .. autoclass:: Dihedral :members: @@ -198,7 +203,8 @@ class Ramachandran(AnalysisBase): If the residue selection is beyond the scope of the protein, then an error will be raised. If the residue selection includes the first or last residue, then a warning will be raised and they will be removed from the list of - residues, but the analysis will still run. + residues, but the analysis will still run. If a phi or psi selection cannot + be made, that residue will be removed from the analysis. """ def __init__(self, atomgroup, **kwargs): From 6a6ec1b8877363d2d1b4778fdcdeed78d10bea92 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Wed, 8 Aug 2018 16:32:55 -0700 Subject: [PATCH 390/455] updated CHANGELOG --- package/CHANGELOG | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index c6d51787290..4cfb8ea1f8e 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -23,9 +23,9 @@ Enhancements * Added a wrapper of lib.nsgrid in lib.distances.self_capped_distance and lib.distances.capped_distanceto automatically chose the fastest - method for distance based calculations. (PR #2008) + method for distance based calculations. (PR #2008) * Added Grid search functionality in lib.nsgrid for faster distance based - calculations. (PR #2008) + calculations. (PR #2008) * Modified around selections to work with KDTree and periodic boundary conditions. Should reduce memory usage (#974 PR #2022) * Modified topology.guessers.guess_bonds to automatically select the @@ -64,7 +64,8 @@ Enhancements generated with gromacs -noappend (PR #1728) * MDAnalysis.lib.mdamath now supports triclinic boxes and rewrote in Cython (PR #1965) * AtomGroup.write can write a trajectory of selected frames (Issue #1037) - * Added analysis.dihedrals with Ramachandran class to analysis module (PR #1997) + * Added dihedrals.py with Dihedral, Ramachandran, and Janin classes to + analysis module (PR #1997, PR #2033) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) From 2dd296fc1b8a5c5118aea2dd2d9d603ba9bfff41 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 9 Aug 2018 11:47:58 -0700 Subject: [PATCH 391/455] Added reference plots for Ramachandran and Janin classes --- package/MDAnalysis/analysis/dihedrals.py | 33 ++++++++++++++++-- .../MDAnalysisTests/data/janin_ref_data.npy | Bin 0 -> 28928 bytes .../MDAnalysisTests/data/rama_ref_data.npy | Bin 0 -> 64928 bytes testsuite/MDAnalysisTests/datafiles.py | 6 +++- 4 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 testsuite/MDAnalysisTests/data/janin_ref_data.npy create mode 100644 testsuite/MDAnalysisTests/data/rama_ref_data.npy diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 75c61918939..67df979e261 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -89,6 +89,13 @@ class which takes a list of `atomgroups`, this class only needs a list of The Janin class works in the same way, only needing a list of residues. +Reference plots can be added to the axes for both the Ramachandran and Janin +classes using the kwarg ``ref=True``. These were made using data obtained from +a large selection of pdb files, and were analyzed using these classes. The +allowed and marginally allowed regions of the Ramachandran reference plt have +cutoffs set to include 90% and 99% of the data points, and the Janin reference +plot has cutoffs for 90% and 98% of the data points. + These classes are prone to errors if the topology contains duplicate or missing atoms (e.g. atoms with `altloc` or incomplete residues). If the topology has as an `altloc` attribute, you must specify only one `altloc` for the atoms with @@ -139,6 +146,7 @@ class which takes a list of `atomgroups`, this class only needs a list of import MDAnalysis as mda from MDAnalysis.analysis.base import AnalysisBase from MDAnalysis.lib.distances import calc_dihedrals +from MDAnalysisTests.datafiles import Rama_ref, Janin_ref class Dihedral(AnalysisBase): @@ -268,7 +276,7 @@ def _conclude(self): self.angles = np.rad2deg(np.array(self.angles)) - def plot(self, ax=None, **kwargs): + def plot(self, ax=None, ref=False, **kwargs): """Plots data into standard ramachandran plot. Each time step in :attr:`Ramachandran.angles` is plotted onto the same graph. @@ -278,6 +286,10 @@ def plot(self, ax=None, **kwargs): If no `ax` is supplied or set to ``None`` then the plot will be added to the current active axes. + ref : bool, optional + Adds a general Ramachandran plot which shows allowed and + marginally allowed regions + Returns ------- ax : :class:`matplotlib.axes.Axes` @@ -291,6 +303,11 @@ def plot(self, ax=None, **kwargs): ax.axvline(0, color='k', lw=1) ax.set(xticks=range(-180,181,60), yticks=range(-180,181,60), xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") + if ref == True: + X, Y = np.meshgrid(np.arange(-180, 180, 4), np.arange(-180, 180, 4)) + levels = [1, 17, 15000] + colors = ['#A1D4FF', '#35A1FF'] + ax.contourf(X, Y, Rama_ref, levels=levels, colors=colors) a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) ax.scatter(a[:,0], a[:,1], **kwargs) return ax @@ -359,7 +376,7 @@ def __init__(self, atomgroup, **kwargs): def _conclude(self): self.angles = (np.rad2deg(np.array(self.angles)) + 360) % 360 - def plot(self, ax=None, **kwargs): + def plot(self, ax=None, ref=False, **kwargs): """Plots data into standard Janin plot. Each time step in :attr:`Janin.angles` is plotted onto the same graph. @@ -369,6 +386,10 @@ def plot(self, ax=None, **kwargs): If no `ax` is supplied or set to ``None`` then the plot will be added to the current active axes. + ref : bool, optional + Adds a general Janin plot which shows allowed and marginally + allowed regions + Returns ------- ax : :class:`matplotlib.axes.Axes` @@ -381,7 +402,13 @@ def plot(self, ax=None, **kwargs): ax.axhline(180, color='k', lw=1) ax.axvline(180, color='k', lw=1) ax.set(xticks=range(0,361,60), yticks=range(0,361,60), - xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") + xlabel=r"$\chi1$ (deg)", ylabel=r"$\chi2$ (deg)") + if ref == True: + if ref == True: + X, Y = np.meshgrid(np.arange(0, 360, 6), np.arange(0, 360, 6)) + levels = [1, 6, 600] + colors = ['#A1D4FF', '#35A1FF'] + ax.contourf(X, Y, Rama_ref, levels=levels, colors=colors) a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) ax.scatter(a[:,0], a[:,1], **kwargs) return ax diff --git a/testsuite/MDAnalysisTests/data/janin_ref_data.npy b/testsuite/MDAnalysisTests/data/janin_ref_data.npy new file mode 100644 index 0000000000000000000000000000000000000000..ea55d2a48f5707138eda411d87d5fbf2dd095e64 GIT binary patch literal 28928 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 literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/data/rama_ref_data.npy b/testsuite/MDAnalysisTests/data/rama_ref_data.npy new file mode 100644 index 0000000000000000000000000000000000000000..f1ef85f1aec5948796d6a3f2e030104ac2dcc157 GIT binary patch literal 64928 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 literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 1d6d49be36c..e772d3b93ea 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -158,7 +158,8 @@ "GRO_MEMPROT", "XTC_MEMPROT", # YiiP transporter in POPE:POPG lipids with Na+, Cl-, Zn2+ dummy model without water "DihedralArray", "DihedralsArray", # time series of single dihedral "RamaArray", "GLYRamaArray", # time series of phi/psi angles - "JaninArray", "LYSJaninArray" # time series of chi1/chi2 angles + "JaninArray", "LYSJaninArray", # time series of chi1/chi2 angles + "Rama_ref", "Janin_ref" # data for allowed and marginally allowed regions ] from pkg_resources import resource_filename @@ -426,5 +427,8 @@ JaninArray = resource_filename(__name__, 'data/adk_oplsaa_janin.npy') LYSJaninArray = resource_filename(__name__, 'data/adk_oplsaa_LYS_janin.npy') +Rama_ref = resource_filename(__name__, 'data/rama_ref_data.npy') +Janin_ref = resource_filename(__name__, 'data/janin_ref_data.npy') + # This should be the last line: clean up namespace del resource_filename From 556cf414d9e738305fc805ccd33a77be2f0229bd Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 9 Aug 2018 12:07:01 -0700 Subject: [PATCH 392/455] changed test_janin to check fewer decimals --- testsuite/MDAnalysisTests/analysis/test_dihedrals.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 5d3c65c9690..eb1c01fa866 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -129,7 +129,7 @@ def test_janin(self, universe): janin = Janin(universe.select_atoms("protein")).run() test_janin = np.load(JaninArray) - assert_almost_equal(janin.angles, test_janin, 5, + assert_almost_equal(janin.angles, test_janin, 4, err_msg="error: dihedral angles should " "match test values") @@ -137,7 +137,7 @@ def test_janin_single_frame(self, universe): janin = Janin(universe.select_atoms("protein"), start=5, stop=6).run() test_janin = [np.load(JaninArray)[5]] - assert_almost_equal(janin.angles, test_janin, 5, + assert_almost_equal(janin.angles, test_janin, 4, err_msg="error: dihedral angles should " "match test values") @@ -145,7 +145,7 @@ def test_janin_residue_selections(self, universe): janin = Janin(universe.select_atoms("resname LYS")).run() test_janin = np.load(LYSJaninArray) - assert_almost_equal(janin.angles, test_janin, 5, + assert_almost_equal(janin.angles, test_janin, 4, err_msg="error: dihedral angles should " "match test values") From 4a52cc2fa5fe39ec309d1eaedef22f818b35f583 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 9 Aug 2018 13:21:20 -0700 Subject: [PATCH 393/455] Fixed Janin plot method --- package/MDAnalysis/analysis/dihedrals.py | 1 - 1 file changed, 1 deletion(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 67df979e261..98c14cdbbfc 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -404,7 +404,6 @@ def plot(self, ax=None, ref=False, **kwargs): ax.set(xticks=range(0,361,60), yticks=range(0,361,60), xlabel=r"$\chi1$ (deg)", ylabel=r"$\chi2$ (deg)") if ref == True: - if ref == True: X, Y = np.meshgrid(np.arange(0, 360, 6), np.arange(0, 360, 6)) levels = [1, 6, 600] colors = ['#A1D4FF', '#35A1FF'] From 44d48add2878477402e3fdb3bc7a647100851352 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Thu, 9 Aug 2018 16:03:28 -0700 Subject: [PATCH 394/455] moved ref plot data to new analysis/data directory, updated setup.py --- package/MDAnalysis/analysis/data/filenames.py | 35 ++++++++++++++++++ .../analysis}/data/janin_ref_data.npy | Bin .../analysis}/data/rama_ref_data.npy | Bin package/MDAnalysis/analysis/dihedrals.py | 10 ++--- package/setup.py | 4 ++ .../analysis/test_dihedrals.py | 29 +++++++++------ testsuite/MDAnalysisTests/data/19hc.pdb.gz | Bin 0 -> 200523 bytes testsuite/MDAnalysisTests/data/1a28.pdb.gz | Bin 0 -> 92868 bytes testsuite/MDAnalysisTests/datafiles.py | 9 ++--- 9 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 package/MDAnalysis/analysis/data/filenames.py rename {testsuite/MDAnalysisTests => package/MDAnalysis/analysis}/data/janin_ref_data.npy (100%) rename {testsuite/MDAnalysisTests => package/MDAnalysis/analysis}/data/rama_ref_data.npy (100%) create mode 100644 testsuite/MDAnalysisTests/data/19hc.pdb.gz create mode 100644 testsuite/MDAnalysisTests/data/1a28.pdb.gz diff --git a/package/MDAnalysis/analysis/data/filenames.py b/package/MDAnalysis/analysis/data/filenames.py new file mode 100644 index 00000000000..2af9c298322 --- /dev/null +++ b/package/MDAnalysis/analysis/data/filenames.py @@ -0,0 +1,35 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# + +from __future__ import absolute_import + +__all__ = [ + "Rama_ref", "Janin_ref" # reference plots for Ramachandran and Janin classes +] + +from pkg_resources import resource_filename + +Rama_ref = resource_filename(__name__, 'rama_ref_data.npy') +Janin_ref = resource_filename(__name__, 'janin_ref_data.npy') + +# This should be the last line: clean up namespace +del resource_filename diff --git a/testsuite/MDAnalysisTests/data/janin_ref_data.npy b/package/MDAnalysis/analysis/data/janin_ref_data.npy similarity index 100% rename from testsuite/MDAnalysisTests/data/janin_ref_data.npy rename to package/MDAnalysis/analysis/data/janin_ref_data.npy diff --git a/testsuite/MDAnalysisTests/data/rama_ref_data.npy b/package/MDAnalysis/analysis/data/rama_ref_data.npy similarity index 100% rename from testsuite/MDAnalysisTests/data/rama_ref_data.npy rename to package/MDAnalysis/analysis/data/rama_ref_data.npy diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 98c14cdbbfc..6a4b71d5269 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -146,7 +146,7 @@ class which takes a list of `atomgroups`, this class only needs a list of import MDAnalysis as mda from MDAnalysis.analysis.base import AnalysisBase from MDAnalysis.lib.distances import calc_dihedrals -from MDAnalysisTests.datafiles import Rama_ref, Janin_ref +from MDAnalysis.analysis.data.filenames import Rama_ref, Janin_ref class Dihedral(AnalysisBase): @@ -301,13 +301,13 @@ def plot(self, ax=None, ref=False, **kwargs): ax.axis([-180,180,-180,180]) ax.axhline(0, color='k', lw=1) ax.axvline(0, color='k', lw=1) - ax.set(xticks=range(-180,181,60), yticks=range(-180,181,60), + ax.set(xticks=range(-180, 181, 60), yticks=range(-180, 181, 60), xlabel=r"$\phi$ (deg)", ylabel=r"$\psi$ (deg)") if ref == True: X, Y = np.meshgrid(np.arange(-180, 180, 4), np.arange(-180, 180, 4)) levels = [1, 17, 15000] colors = ['#A1D4FF', '#35A1FF'] - ax.contourf(X, Y, Rama_ref, levels=levels, colors=colors) + ax.contourf(X, Y, np.load(Rama_ref), levels=levels, colors=colors) a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) ax.scatter(a[:,0], a[:,1], **kwargs) return ax @@ -401,13 +401,13 @@ def plot(self, ax=None, ref=False, **kwargs): ax.axis([0, 360, 0, 360]) ax.axhline(180, color='k', lw=1) ax.axvline(180, color='k', lw=1) - ax.set(xticks=range(0,361,60), yticks=range(0,361,60), + ax.set(xticks=range(0, 361, 60), yticks=range(0, 361, 60), xlabel=r"$\chi1$ (deg)", ylabel=r"$\chi2$ (deg)") if ref == True: X, Y = np.meshgrid(np.arange(0, 360, 6), np.arange(0, 360, 6)) levels = [1, 6, 600] colors = ['#A1D4FF', '#35A1FF'] - ax.contourf(X, Y, Rama_ref, levels=levels, colors=colors) + ax.contourf(X, Y, np.load(Janin_ref), levels=levels, colors=colors) a = self.angles.reshape(np.prod(self.angles.shape[:2]), 2) ax.scatter(a[:,0], a[:,1], **kwargs) return ax diff --git a/package/setup.py b/package/setup.py index 9343ac793b0..b43edc3a94b 100755 --- a/package/setup.py +++ b/package/setup.py @@ -532,6 +532,10 @@ def dynamic_author_list(): classifiers=CLASSIFIERS, provides=['MDAnalysis'], packages=find_packages(), + package_data={'MDAnalysis': + ['analysis/data/*.npy', + ], + }, ext_modules=exts, requires=['numpy (>=1.10.4)', 'biopython (>= 1.71)', 'mmtf (>=1.0.0)', 'networkx (>=1.0)', 'GridDataFormats (>=0.3.2)', 'joblib', diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index eb1c01fa866..b6914c01fa8 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -29,7 +29,7 @@ import MDAnalysis as mda from MDAnalysisTests.datafiles import (GRO, XTC, DihedralArray, DihedralsArray, RamaArray, GLYRamaArray, JaninArray, - LYSJaninArray) + LYSJaninArray, PDB_rama, PDB_janin) from MDAnalysis.analysis.dihedrals import Dihedral, Ramachandran, Janin @@ -76,20 +76,22 @@ class TestRamachandran(object): def universe(self): return mda.Universe(GRO, XTC) + @pytest.fixture() + def rama_ref_array(self): + return np.load(RamaArray) + def test_ramachandran(self, universe): rama = Ramachandran(universe.select_atoms("protein")).run() - test_rama = np.load(RamaArray) - assert_almost_equal(rama.angles, test_rama, 5, + assert_almost_equal(rama.angles, rama_ref_array, 5, err_msg="error: dihedral angles should " "match test values") def test_ramachandran_single_frame(self, universe): rama = Ramachandran(universe.select_atoms("protein"), start=5, stop=6).run() - test_rama = [np.load(RamaArray)[5]] - assert_almost_equal(rama.angles, test_rama, 5, + assert_almost_equal(rama.angles, [rama_ref_array[5]], 5, err_msg="error: dihedral angles should " "match test values") @@ -111,7 +113,7 @@ def test_protein_ends(self, universe): def test_None_removal(self): with pytest.warns(UserWarning): - u = mda.coordinates.MMTF.fetch_mmtf('19hc') + u = mda.Universe(PDB_rama) rama = Ramachandran(u.select_atoms("protein").residues[1:-1]) def test_plot(self, universe): @@ -125,19 +127,22 @@ class TestJanin(object): def universe(self): return mda.Universe(GRO, XTC) + @pytest.fixture() + def janin_ref_array(self): + return np.load(JaninArray) + def test_janin(self, universe): janin = Janin(universe.select_atoms("protein")).run() - test_janin = np.load(JaninArray) - assert_almost_equal(janin.angles, test_janin, 4, + # Test precision lowered to account for platform differences with osx + assert_almost_equal(janin.angles, janin_ref_array, 3, err_msg="error: dihedral angles should " "match test values") def test_janin_single_frame(self, universe): janin = Janin(universe.select_atoms("protein"), start=5, stop=6).run() - test_janin = [np.load(JaninArray)[5]] - assert_almost_equal(janin.angles, test_janin, 4, + assert_almost_equal(janin.angles, janin_ref_array[5], 3, err_msg="error: dihedral angles should " "match test values") @@ -145,7 +150,7 @@ def test_janin_residue_selections(self, universe): janin = Janin(universe.select_atoms("resname LYS")).run() test_janin = np.load(LYSJaninArray) - assert_almost_equal(janin.angles, test_janin, 4, + assert_almost_equal(janin.angles, test_janin, 3, err_msg="error: dihedral angles should " "match test values") @@ -159,7 +164,7 @@ def test_remove_residues(self, universe): def test_atom_selection(self): with pytest.raises(ValueError): - u = mda.coordinates.MMTF.fetch_mmtf('1a28') + u = mda.Universe(PDB_janin) janin = Janin(u.select_atoms("protein and not resname ALA CYS GLY " "PRO SER THR VAL")) diff --git a/testsuite/MDAnalysisTests/data/19hc.pdb.gz b/testsuite/MDAnalysisTests/data/19hc.pdb.gz new file mode 100644 index 0000000000000000000000000000000000000000..e95e242d26436614833c68f9bc9288bd21eb910a GIT binary patch literal 200523 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 QoHh78L(2cfYe>WX4P$@E1poj5 literal 0 HcmV?d00001 diff --git a/testsuite/MDAnalysisTests/data/1a28.pdb.gz b/testsuite/MDAnalysisTests/data/1a28.pdb.gz new file mode 100644 index 0000000000000000000000000000000000000000..abf5f3e60bb1afa4d05364a3b8ab6e2a9dab2db9 GIT binary patch literal 92868 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

3tl6 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 Date: Thu, 9 Aug 2018 17:24:32 -0700 Subject: [PATCH 395/455] updated docstring and added comments --- package/MDAnalysis/analysis/dihedrals.py | 66 +++++++++++++++--------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 6a4b71d5269..98603022e5c 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -87,14 +87,17 @@ class which takes a list of `atomgroups`, this class only needs a list of fig, ax = plt.subplots(figsize=plt.figaspect(1)) R.plot(ax=ax, color='k', marker='s') -The Janin class works in the same way, only needing a list of residues. +The Janin class works in the same way, only needing a list of residues. To plot +the data yourself, the angles can be accessed using :attr:`Ramachandran.angles`. Reference plots can be added to the axes for both the Ramachandran and Janin classes using the kwarg ``ref=True``. These were made using data obtained from a large selection of pdb files, and were analyzed using these classes. The allowed and marginally allowed regions of the Ramachandran reference plt have cutoffs set to include 90% and 99% of the data points, and the Janin reference -plot has cutoffs for 90% and 98% of the data points. +plot has cutoffs for 90% and 98% of the data points. The list of PDB files used +for the referece plots was taken from [Lovell2003]_ and information about general +Janin regions was taken from [Janin1978]_. These classes are prone to errors if the topology contains duplicate or missing atoms (e.g. atoms with `altloc` or incomplete residues). If the topology has as @@ -111,7 +114,7 @@ class which takes a list of `atomgroups`, this class only needs a list of .. attribute:: angles Contains the time steps of the angles for each atomgroup in the list as - an n_frames×len(atomgroups) :class:`numpy.ndarray` with content + an ``n_frames×len(atomgroups)`` :class:`numpy.ndarray` with content ``[[angle 1, angle 2, ...], [time step 2], ...]``. .. autoclass:: Ramachandran @@ -120,9 +123,9 @@ class which takes a list of `atomgroups`, this class only needs a list of .. attribute:: angles - Contains the time steps of the phi and psi angles for each residue as - an n_frames×n_residues×2 :class:`numpy.ndarray` with content - ``[[[phi, psi], [residue 2], ...], [time step 2], ...]``. + Contains the time steps of the :math:`\phi` and :math:`\psi` angles for + each residue as an ``n_frames×n_residues×2`` :class:`numpy.ndarray` with + content ``[[[phi, psi], [residue 2], ...], [time step 2], ...]``. .. autoclass:: Janin :members: @@ -130,9 +133,18 @@ class which takes a list of `atomgroups`, this class only needs a list of .. attribute:: angles - Contains the time steps of the phi and psi angles for each residue as - an n_frames×n_residues×2 :class:`numpy.ndarray` with content - ``[[[chi1, chi2], [residue 2], ...], [time step 2], ...]``. + Contains the time steps of the :math:`\chi_1` and :math:`\chi_2` angles + for each residue as an ``n_frames×n_residues×2`` :class:`numpy.ndarray` + with content ``[[[chi1, chi2], [residue 2], ...], [time step 2], ...]``. + +References +---------- +.. [Lovell2003] Lovell, Simon C., et al (2003). "Structure validation by + :math:`C\\alpha` geometry: :math:`\phi`, :math:`\psi`, and :math:`C\\beta` + deviation". Proteins 50(3): 437-450. + +.. [Janin1978] Janin, Joel, et al. (1978). "Conformation of amnio acid + side-chains in proteins". Journal of Molecular Biology 125(3): 357-386. """ from __future__ import absolute_import @@ -199,27 +211,28 @@ def _conclude(self): self.angles = np.rad2deg(np.array(self.angles)) class Ramachandran(AnalysisBase): - """Calculate phi and psi dihedral angles of selected residues. + """Calculate :math:`\phi` and :math:`\psi` dihedral angles of selected residues. - Phi and psi angles will be calculated for each residue corresponding to - `atomgroup` for each time step in the trajectory. A :class:`~MDAnalysis.ResidueGroup` - is generated from `atomgroup` which is compared to the protein to determine - if it is a legitimate selection. + :math:`\phi` and :math:`\psi` angles will be calculated for each residue \ + corresponding to `atomgroup` for each time step in the trajectory. A + :class:`~MDAnalysis.ResidueGroup` is generated from `atomgroup` which is + compared to the protein to determine if it is a legitimate selection. Note ---- If the residue selection is beyond the scope of the protein, then an error will be raised. If the residue selection includes the first or last residue, then a warning will be raised and they will be removed from the list of - residues, but the analysis will still run. If a phi or psi selection cannot - be made, that residue will be removed from the analysis. + residues, but the analysis will still run. If a :math:`\phi` or :math:`\psi` + selection cannot be made, that residue will be removed from the analysis. """ def __init__(self, atomgroup, **kwargs): """Parameters ---------- atomgroup : AtomGroup or ResidueGroup - atoms for residues for which phi and psi are calculated + atoms for residues for which :math:`\phi` and :math:`\psi` are + calculated Raises ------ @@ -243,6 +256,9 @@ def __init__(self, atomgroup, **kwargs): phi_sel = [res.phi_selection() for res in residues] psi_sel = [res.psi_selection() for res in residues] + # phi_selection() and psi_selection() currently can't handle topologies + # with an altloc attribute so this removes any residues that have either + # angle return none instead of a value if any(sel is None for sel in phi_sel): warnings.warn("Some residues in selection do not have phi selections") remove = [i for i, sel in enumerate(phi_sel) if sel is None] @@ -313,12 +329,12 @@ def plot(self, ax=None, ref=False, **kwargs): return ax class Janin(Ramachandran): - """Calculate chi1 and chi2 dihedral angles of selected residues. + """Calculate :math:`\chi_1` and :math:`\chi_2` dihedral angles of selected residues. - Chi1 and chi2 angles will be calculated for each residue corresponding to - `atomgroup` for each time step in the trajectory. A :class:`~MDAnalysis.ResidueGroup` - is generated from `atomgroup` which is compared to the protein to determine - if it is a legitimate selection. + :math:`\chi_1` and :math:`\chi_2` angles will be calculated for each residue + corresponding to `atomgroup` for each time step in the trajectory. A + :class:`~MDAnalysis.ResidueGroup` is generated from `atomgroup` which is + compared to the protein to determine if it is a legitimate selection. Note ---- @@ -334,7 +350,8 @@ def __init__(self, atomgroup, **kwargs): """Parameters ---------- atomgroup : AtomGroup or ResidueGroup - atoms for residues for which chi1 and chi2 are calculated + atoms for residues for which :math:`\chi_1` and :math:`\chi_2` are + calculated Raises ------ @@ -368,6 +385,9 @@ def __init__(self, atomgroup, **kwargs): self.ag4 = residues.atoms.select_atoms("name CG CG1") self.ag5 = residues.atoms.select_atoms("name CD CD1 OD1 ND1 SD") + # if there is an altloc attribute, too many atoms will be selected which + # must be removed before using the class, or the file is missing atoms + # for some residues which must also be removed if any(len(self.ag1) != len(ag) for ag in [self.ag2, self.ag3, self.ag4, self.ag5]): raise ValueError("Too many or too few atoms selected. Check for " From f887f76c7095ee0a53e8693234c5b441906b88b0 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 10 Aug 2018 13:59:03 -0700 Subject: [PATCH 396/455] Fixed test_dihedrals, made analysis.data module --- package/MDAnalysis/analysis/data/__init__.py | 0 package/MDAnalysis/analysis/dihedrals.py | 2 +- testsuite/MDAnalysisTests/analysis/test_dihedrals.py | 12 ++++++------ 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 package/MDAnalysis/analysis/data/__init__.py diff --git a/package/MDAnalysis/analysis/data/__init__.py b/package/MDAnalysis/analysis/data/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 98603022e5c..900d1eb2219 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -213,7 +213,7 @@ def _conclude(self): class Ramachandran(AnalysisBase): """Calculate :math:`\phi` and :math:`\psi` dihedral angles of selected residues. - :math:`\phi` and :math:`\psi` angles will be calculated for each residue \ + :math:`\phi` and :math:`\psi` angles will be calculated for each residue corresponding to `atomgroup` for each time step in the trajectory. A :class:`~MDAnalysis.ResidueGroup` is generated from `atomgroup` which is compared to the protein to determine if it is a legitimate selection. diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index b6914c01fa8..13c29b2ce6b 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -80,18 +80,18 @@ def universe(self): def rama_ref_array(self): return np.load(RamaArray) - def test_ramachandran(self, universe): + def test_ramachandran(self, universe, rama_ref_array): rama = Ramachandran(universe.select_atoms("protein")).run() assert_almost_equal(rama.angles, rama_ref_array, 5, err_msg="error: dihedral angles should " "match test values") - def test_ramachandran_single_frame(self, universe): + def test_ramachandran_single_frame(self, universe, rama_ref_array): rama = Ramachandran(universe.select_atoms("protein"), start=5, stop=6).run() - assert_almost_equal(rama.angles, [rama_ref_array[5]], 5, + assert_almost_equal(rama.angles[0], rama_ref_array[5], 5, err_msg="error: dihedral angles should " "match test values") @@ -131,7 +131,7 @@ def universe(self): def janin_ref_array(self): return np.load(JaninArray) - def test_janin(self, universe): + def test_janin(self, universe, janin_ref_array): janin = Janin(universe.select_atoms("protein")).run() # Test precision lowered to account for platform differences with osx @@ -139,10 +139,10 @@ def test_janin(self, universe): err_msg="error: dihedral angles should " "match test values") - def test_janin_single_frame(self, universe): + def test_janin_single_frame(self, universe, janin_ref_array): janin = Janin(universe.select_atoms("protein"), start=5, stop=6).run() - assert_almost_equal(janin.angles, janin_ref_array[5], 3, + assert_almost_equal(janin.angles[0], janin_ref_array[5], 3, err_msg="error: dihedral angles should " "match test values") From 3814fc5f05dea53d44c550a073e894b135ffb7b6 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 10 Aug 2018 15:45:24 -0700 Subject: [PATCH 397/455] Added docs for analysis.data --- package/MDAnalysis/analysis/data/filenames.py | 12 +++++++++++ package/MDAnalysis/analysis/dihedrals.py | 21 +++++++++++-------- .../documentation_pages/analysis/data.rst | 2 ++ .../documentation_pages/analysis_modules.rst | 8 +++++++ 4 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 package/doc/sphinx/source/documentation_pages/analysis/data.rst diff --git a/package/MDAnalysis/analysis/data/filenames.py b/package/MDAnalysis/analysis/data/filenames.py index 2af9c298322..e36e6245af3 100644 --- a/package/MDAnalysis/analysis/data/filenames.py +++ b/package/MDAnalysis/analysis/data/filenames.py @@ -19,7 +19,19 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # +""" +Analysis data files +=================== +.. data:: Rama_ref + Reference Ramachandran histogram for :class:`MDAnalysis.analysis.dihedrals.Ramachandran`. + The data were calculated on a data set of 500 PDB structures taken from [Lovell2003]_. + +.. data:: Janin_ref + Reference Ramachandran histogram for :class:`MDAnalysis.analysis.dihedrals.Ramachandran`. + The data were calculated on a data set of 500 PDB structures taken from [Lovell2003]_. + +""" from __future__ import absolute_import __all__ = [ diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 900d1eb2219..d6f914a85f2 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -88,16 +88,19 @@ class which takes a list of `atomgroups`, this class only needs a list of R.plot(ax=ax, color='k', marker='s') The Janin class works in the same way, only needing a list of residues. To plot -the data yourself, the angles can be accessed using :attr:`Ramachandran.angles`. +the data yourself, the angles can be accessed using :attr:`Ramachandran.angles` +or :attr:`Janin.angles`. Reference plots can be added to the axes for both the Ramachandran and Janin -classes using the kwarg ``ref=True``. These were made using data obtained from -a large selection of pdb files, and were analyzed using these classes. The -allowed and marginally allowed regions of the Ramachandran reference plt have -cutoffs set to include 90% and 99% of the data points, and the Janin reference -plot has cutoffs for 90% and 98% of the data points. The list of PDB files used -for the referece plots was taken from [Lovell2003]_ and information about general -Janin regions was taken from [Janin1978]_. +classes using the kwarg ``ref=True``. The Ramachandran reference data +(:data:`~MDAnalysis.analysis.data.filenames.Rama_ref`) and Janin reference data +(:data:`~MDAnalysis.analysis.data.filenames.Janin_ref`) were made using data +obtained from a large selection of pdb files, and were analyzed using these +classes. The allowed and marginally allowed regions of the Ramachandran reference +plt have cutoffs set to include 90% and 99% of the data points, and the Janin +reference plot has cutoffs for 90% and 98% of the data points. The list of PDB +files used for the referece plots was taken from [Lovell2003]_ and information +about general Janin regions was taken from [Janin1978]_. These classes are prone to errors if the topology contains duplicate or missing atoms (e.g. atoms with `altloc` or incomplete residues). If the topology has as @@ -213,7 +216,7 @@ def _conclude(self): class Ramachandran(AnalysisBase): """Calculate :math:`\phi` and :math:`\psi` dihedral angles of selected residues. - :math:`\phi` and :math:`\psi` angles will be calculated for each residue + :math:`\phi` and :math:`\psi` angles will be calculated for each residue corresponding to `atomgroup` for each time step in the trajectory. A :class:`~MDAnalysis.ResidueGroup` is generated from `atomgroup` which is compared to the protein to determine if it is a legitimate selection. diff --git a/package/doc/sphinx/source/documentation_pages/analysis/data.rst b/package/doc/sphinx/source/documentation_pages/analysis/data.rst new file mode 100644 index 00000000000..63008abaf34 --- /dev/null +++ b/package/doc/sphinx/source/documentation_pages/analysis/data.rst @@ -0,0 +1,2 @@ +.. automodule:: MDAnalysis.analysis.data.filenames + :members: diff --git a/package/doc/sphinx/source/documentation_pages/analysis_modules.rst b/package/doc/sphinx/source/documentation_pages/analysis_modules.rst index 8df5c8fc8aa..cd001450042 100644 --- a/package/doc/sphinx/source/documentation_pages/analysis_modules.rst +++ b/package/doc/sphinx/source/documentation_pages/analysis_modules.rst @@ -137,3 +137,11 @@ analysis modules. *Use with care.* :maxdepth: 1 analysis/legacy_modules + +Data +==== + +.. toctree:: + :maxdepth: 1 + + analysis/data From 8d94491ebe1174b8a73713507fcaf716d0b9888b Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 10 Aug 2018 16:04:15 -0700 Subject: [PATCH 398/455] Updated docstrings and CHANGELOG --- package/CHANGELOG | 3 ++- package/MDAnalysis/analysis/data/filenames.py | 14 +++++++++++++- package/MDAnalysis/analysis/dihedrals.py | 5 +++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 4cfb8ea1f8e..432db443ad0 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -65,7 +65,8 @@ Enhancements * MDAnalysis.lib.mdamath now supports triclinic boxes and rewrote in Cython (PR #1965) * AtomGroup.write can write a trajectory of selected frames (Issue #1037) * Added dihedrals.py with Dihedral, Ramachandran, and Janin classes to - analysis module (PR #1997, PR #2033) + analysis module (PR #1997, PR #2033) + * Added the analysis.data module for reference data used in analysis (PR #2033) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) diff --git a/package/MDAnalysis/analysis/data/filenames.py b/package/MDAnalysis/analysis/data/filenames.py index e36e6245af3..81971bb6b13 100644 --- a/package/MDAnalysis/analysis/data/filenames.py +++ b/package/MDAnalysis/analysis/data/filenames.py @@ -23,14 +23,26 @@ Analysis data files =================== +:mod:`MDAnalysis.analysis.data` contains data files that are used as part of +analysis. These can be experimental or theoretical data. Files are stored +inside the package and made accessible via variables in +:mod:`MDAnalysis.analysis.data.filenames`. These variables are documented +below, including references to the literature and where they are used +inside :mod:`MDAnalysis.analysis`. + +Data files +---------- + .. data:: Rama_ref + Reference Ramachandran histogram for :class:`MDAnalysis.analysis.dihedrals.Ramachandran`. The data were calculated on a data set of 500 PDB structures taken from [Lovell2003]_. .. data:: Janin_ref + Reference Ramachandran histogram for :class:`MDAnalysis.analysis.dihedrals.Ramachandran`. The data were calculated on a data set of 500 PDB structures taken from [Lovell2003]_. - + """ from __future__ import absolute_import diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index d6f914a85f2..c94b851de89 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -19,7 +19,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -""" +r""" Dihedral angles analysis --- :mod:`MDAnalysis.analysis.dihedrals` =========================================================================== @@ -143,7 +143,8 @@ class which takes a list of `atomgroups`, this class only needs a list of References ---------- .. [Lovell2003] Lovell, Simon C., et al (2003). "Structure validation by - :math:`C\\alpha` geometry: :math:`\phi`, :math:`\psi`, and :math:`C\\beta` + :math:`C_{\alpha}` geometry: :math:`\phi`, :math:`\psi`, and + :math:`C_{\beta}` deviation". Proteins 50(3): 437-450. .. [Janin1978] Janin, Joel, et al. (1978). "Conformation of amnio acid From 7c4a700db52924de3f624100b289727a2e0386d8 Mon Sep 17 00:00:00 2001 From: Henry Mull Date: Fri, 10 Aug 2018 16:16:12 -0700 Subject: [PATCH 399/455] Added image directory for documentation --- .../sphinx/source/images/janin_demo_plot.png | Bin 0 -> 187009 bytes .../sphinx/source/images/rama_demo_plot.png | Bin 0 -> 155869 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 package/doc/sphinx/source/images/janin_demo_plot.png create mode 100644 package/doc/sphinx/source/images/rama_demo_plot.png diff --git a/package/doc/sphinx/source/images/janin_demo_plot.png b/package/doc/sphinx/source/images/janin_demo_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..f64cf64265d1e5cf0f7e1e63c1fe183106f50685 GIT binary patch literal 187009 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

s`pFRoB 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

d&^;)yd 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

+;` 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

G{$irpwWKtW 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≠u9>U3)kZE&%dVuW>XC2T%;RE8z~nRia=OMXFxQR?4seNtJ~Xv zRb8UJ2%G&0;T2zFJ8JdVned^227M|zGBPqDyYrk{D%|I$aOJ(--5pm7F~F^F3<=x@ zBnlWSnrwXMn+*JO>V5KhM{ohNYclwLE_Zi(KH`9~`LT7$1jug0m*%L!-`*?0`P@qQ z89|ZCC7x2fsHFCv{w5u$gRDfzP)qW~HaNws7L<8pNY8)Y5K_^?nHPU0_Q!1dhuP{b z+y`TWpS1J%bN0-lDM?N-UYVfXOSGIwP}@0>YNj5UU!HmVAuK)Dp+g^h0a1qnu02jr zxKW2ZDR%UBqv743;W?NF41fpNGdm6WCBhmLDV`&F5{O@P_)rU@p&*Ik2tt-8&JJUf zeCY~Z;kZ4T^dO?%`0vqoUaL|wCrJsVNxFm@~^WkMY7KU2?xPUy|sny zONtvol}LV-EtQBA6)vT(Khlm008-OsPWWzyQN7T0W zzmHs*(t}^ojv)18M1X`p@~>lGQ$*w058JhPD+eLY{3S!;yY%udWKAQ1(k+}9?9+Pg zd@-h4IfcVGP0WjJE50GBmhU{Fo$;*IvjuZ86-{yJ2iH=5BUN$vKad~I{G`#IVOg|J zUu_d9X4D$3v_hV(*tNtd9)UPT6wzjH?kq!Jd$w(HVrDxxGb5wr15EvVf%IT!;;gp* zTIlfDWR<)c)it{tF)pQPb&Y)ZJz6J%c;0uzA)uGGNr_R#<8r$dldHSF>Ul1_W*_Y+ z$h+^#4QNTV>z_n00udaJiUK1&{eW64vi12xnQgH{+n0o*ei1u^d0HJEaICy3Zz!at z>50`t1V_^Nr|D4}nvEqv>cXB1nJ};eb;-DO{IMVRb~hk?j?= zbpCk(N0es*5m=i!5I{R$2!h5$c3o6LXj$dNA%>+mgB`T4cgo5ys8mQirvjGnf8S)H zOY8!ms|Nxe7ecMqtJIM&>Zyy`y6e}kSI(mnVq!jZD`>pFF%SVH+EbW8MUc&dtBIPg zf!9I?V}Les`1$5ia1e3Tq4dc*d1^S0b~%Odcxy5k;?M~!(5Rh+t*xyldV3_b$l&}h zxWQr8lU(h8-5rui2<9l;ddRl;{(hZ87?>R{R@P$Qk=6<8Y zM22_QSaVwGYgZzaLrqwvD8f8ay`mGhglViKtH?KZjEn0WA+G2<^Ia~JjxE#~oxSiC zh>)L6ARi=zlM*s04RRr;9|?zoUNB;m&-6^Bm{U6~8fbuG8sxCGmE9I0rO#u#ZxL(LDO8NGzU2~Ku)GngvP0@sWM8(z)yuOv&H zJS_;hA?&qqH@1eDVrB~i=Gn2|iU4i|l`#bIja@c_D5|~?F4u3Mm3)phML&hIL{Fc4 z_XhCKsf;9B@B+?u2t7o~GOLdrJGS`!4sBhA#Z|a;b;75IQ>>sb>2U7eMooczjf3bE z$dH0L&531Y=SZU!Y(f=m%NeYXe2~vp`X3Dj6=XcDpx4~Q#5Z6W_eKnLr#bOKUvO)2 z*_aaU^m|8eP|!;#KO&?(S|rs-`WGRME4rcx+4Y>W|I!K4+XFOm3us2<7p!70XIbmO z0_Z@RtvfV?L^Kf;36hfmh}Wgk4v`fpBnL%7>ArRAmN{&7MF@W~$ui&|<=S@puwek! zMX=C7q{Wq!pq1WPX8){&V1$-@HKkX9Ef(&G=p2ZK3dya*P;x=!{S7&cz0Axu+!96= zdlVzY>&+OTVnM!=kDr@G9+tQs0;ygXQWf2h*dD!+FJ_6DrW!$X4=^-S}*c@ux`+uSk2?WV&Y#-N* zWTX$ip~uR#S$kL~KF;T|va&NPbDi;+<0y_!d~ydHNuPLnn}b zjA9H<3WG{bmM|;eR`)P6h8xj?G}=aY^aQ+NEj+n>edk6d=M#iuA{!9o8>7h3)YQ~v zL>0d%G)b2l{Sk8$ge%biIOeFjAbPh`va&#s$w(8#Llof(rHaG+xISt7GC4QrlwF$( z5}q$34axhdIh6fbV1OiFJud&mhtgf>AVo8t3nWGajpS&tu(CRUd!p{zMFK6D!C%U{ zUHwYAJ}M*ueMYT<1mLnB5G9vNlprnRnQZtipb+aUL`1+ z6ere1%j=GC;&Laq|FT^@Ibi!V8vc+*f)F4o$X{x)9<){lBuw%uP)IwV%8_x5uVjrB zXChMj}I_Z_p%hQ{5paX<_@rEWRq);Fbu0TW- zttWB^inR-o(`fET<8nuca9{y%JQsTRk;ITM=Gq4O7o-qX3fdT$mXJzsqu3pybN6MI zKU|PjsDU?0Rg_jJ;>)t-TxcUXg~r0oANEs^2?U5L*rv$6D`8RW1p)UZ$4NHK8@ zqMxZ8xrJBAwest#_iiC@D2bR`AlU~=DW;wBwYrkxBJ5d<5>nd&mE>q)F}{K; zz~bzm5{W$6Qgh&I5Fr#vkq~0I05*I3{FlZEKvB*ev0ubG0nt4-3(F~T>rfZt zyBxrC5EG`EYWM&i-8goMkU#SuP9X+B-P{>@6&&MwXwGe<_TYebOPx|1b)5Q)q_{aYYTFmWD$4Val5THF%EI=aNLB__|9%B&hqlAa;8an- zGlaCFNVy5#82ayNb?L)>5KSljzVu#^@inwfFa!NTm;%rFu8pW?AbcudKJ;LlH*Zz} ztI5K`Qis}Qaz;VNRgPKXc|7;l--IcOzh2%~-~GaC Date: Sat, 11 Aug 2018 08:47:03 -0700 Subject: [PATCH 400/455] added ref=True to tests to increase coverage --- testsuite/MDAnalysisTests/analysis/test_dihedrals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 13c29b2ce6b..92b7ebb7864 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -117,7 +117,7 @@ def test_None_removal(self): rama = Ramachandran(u.select_atoms("protein").residues[1:-1]) def test_plot(self, universe): - ax = Ramachandran(universe.select_atoms("resid 5-10")).run().plot() + ax = Ramachandran(universe.select_atoms("resid 5-10")).run().plot(ref=True) assert isinstance(ax, matplotlib.axes.Axes), \ "Ramachandran.plot() did not return and Axes instance" @@ -169,6 +169,6 @@ def test_atom_selection(self): "PRO SER THR VAL")) def test_plot(self, universe): - ax = Janin(universe.select_atoms("resid 5-10")).run().plot() + ax = Janin(universe.select_atoms("resid 5-10")).run().plot(ref=True) assert isinstance(ax, matplotlib.axes.Axes), \ "Ramachandran.plot() did not return and Axes instance" From 80533cc8b3f2aa9460a77e736da358a5de50f8e0 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Sun, 12 Aug 2018 22:05:06 -0700 Subject: [PATCH 401/455] integrate Ramachandran and Janin plots into docs and updated references --- package/MDAnalysis/analysis/dihedrals.py | 59 ++++++++++++++++++------ 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index c94b851de89..872801de604 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -19,8 +19,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -r""" -Dihedral angles analysis --- :mod:`MDAnalysis.analysis.dihedrals` +r"""Dihedral angles analysis --- :mod:`MDAnalysis.analysis.dihedrals` =========================================================================== :Author: Henry Mull @@ -87,25 +86,51 @@ class which takes a list of `atomgroups`, this class only needs a list of fig, ax = plt.subplots(figsize=plt.figaspect(1)) R.plot(ax=ax, color='k', marker='s') -The Janin class works in the same way, only needing a list of residues. To plot -the data yourself, the angles can be accessed using :attr:`Ramachandran.angles` -or :attr:`Janin.angles`. +as shown in the example :ref:`Ramachandran plot figure `. + +.. _figure-ramachandran: + +.. figure:: /images/rama_demo_plot.png + :scale: 50 % + :alt: Ramachandran plot + + Ramachandran plot for residues 5 to 10 of AdK, sampled from the AdK test + trajectory (XTC). The contours in the background are the "allowed region" + and the "marginally allowed" regions. + +The Janin class works in the same way, only needing a list of residues; see the +:ref:`Janin plot figure ` as an example. To plot the data +yourself, the angles can be accessed using :attr:`Ramachandran.angles` or +:attr:`Janin.angles`. Reference plots can be added to the axes for both the Ramachandran and Janin classes using the kwarg ``ref=True``. The Ramachandran reference data (:data:`~MDAnalysis.analysis.data.filenames.Rama_ref`) and Janin reference data (:data:`~MDAnalysis.analysis.data.filenames.Janin_ref`) were made using data -obtained from a large selection of pdb files, and were analyzed using these +obtained from a large selection of 500 PDB files, and were analyzed using these classes. The allowed and marginally allowed regions of the Ramachandran reference plt have cutoffs set to include 90% and 99% of the data points, and the Janin reference plot has cutoffs for 90% and 98% of the data points. The list of PDB files used for the referece plots was taken from [Lovell2003]_ and information about general Janin regions was taken from [Janin1978]_. -These classes are prone to errors if the topology contains duplicate or missing -atoms (e.g. atoms with `altloc` or incomplete residues). If the topology has as -an `altloc` attribute, you must specify only one `altloc` for the atoms with -more than one (``"protein and not altloc B"``). +.. Note:: + These classes are prone to errors if the topology contains duplicate or missing + atoms (e.g. atoms with `altloc` or incomplete residues). If the topology has as + an `altloc` attribute, you must specify only one `altloc` for the atoms with + more than one (``"protein and not altloc B"``). + + +.. _figure-janin: + +.. figure:: /images/janin_demo_plot.png + :scale: 50 % + :alt: Janin plot + + Janin plot for residues 5 to 10 of AdK, sampled from the AdK test trajectory + (XTC). The contours in the background are the "allowed region" and the + "marginally allowed" regions for all possible residues. + Analysis Classes ---------------- @@ -142,13 +167,17 @@ class which takes a list of `atomgroups`, this class only needs a list of References ---------- -.. [Lovell2003] Lovell, Simon C., et al (2003). "Structure validation by +.. [Lovell2003] Simon C. Lovell, Ian W. Davis, W. Bryan Arendall III, + Paul I. W. de Bakker, J. Michael Word, Michael G. Prisant, + Jane S. Richardson, and David C. Richardson (2003). "Structure validation by :math:`C_{\alpha}` geometry: :math:`\phi`, :math:`\psi`, and - :math:`C_{\beta}` - deviation". Proteins 50(3): 437-450. + :math:`C_{\beta}` deviation". *Proteins* 50(3): 437-450. doi: + `10.1002/prot.10286 `_ -.. [Janin1978] Janin, Joel, et al. (1978). "Conformation of amnio acid - side-chains in proteins". Journal of Molecular Biology 125(3): 357-386. +.. [Janin1978] Joël Janin, Shoshanna Wodak, Michael Levitt, and Bernard + Maigret. (1978). "Conformation of amino acid side-chains in + proteins". *Journal of Molecular Biology* 125(3): 357-386. doi: + `10.1016/0022-2836(78)90408-4 `_ """ from __future__ import absolute_import From 67d064a4515cc46404b9f15e0bab90c5db59a971 Mon Sep 17 00:00:00 2001 From: ayushsuhane <34154224+ayushsuhane@users.noreply.github.com> Date: Mon, 13 Aug 2018 06:42:18 -0700 Subject: [PATCH 402/455] corrected time_guess_bonds, and added individual guess function in topology (#2045) --- benchmarks/benchmarks/ag_methods.py | 7 +++++-- benchmarks/benchmarks/topology.py | 32 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 benchmarks/benchmarks/topology.py diff --git a/benchmarks/benchmarks/ag_methods.py b/benchmarks/benchmarks/ag_methods.py index 410ec5419ac..c5b81bae66e 100644 --- a/benchmarks/benchmarks/ag_methods.py +++ b/benchmarks/benchmarks/ag_methods.py @@ -24,8 +24,11 @@ def setup(self, num_atoms): self.u = MDAnalysis.Universe(GRO) self.ag = self.u.atoms[:num_atoms] self.weights = np.ones(num_atoms) - self.vdwradii = {'NA':1.0, - 'M':1.0} + self.vdwradii = {'H':1.0, + 'C':1.0, + 'N':1.0, + 'O':1.0, + 'DUMMY':1.0} self.rot_matrix = np.ones((3,3)) self.trans = np.ones((4,4)) diff --git a/benchmarks/benchmarks/topology.py b/benchmarks/benchmarks/topology.py new file mode 100644 index 00000000000..c45e6b380a5 --- /dev/null +++ b/benchmarks/benchmarks/topology.py @@ -0,0 +1,32 @@ +import MDAnalysis +import numpy as np +from MDAnalysis.topology import guessers + +try: + from MDAnalysisTests.datafiles import GRO + from MDAnalysis.exceptions import NoDataError +except: + pass + +class TopologyGuessBench(object): + """Benchmarks for individual + topology functions + """ + params = (10, 100, 1000, 10000) + param_names = ['num_atoms'] + + def setup(self, num_atoms): + self.u = MDAnalysis.Universe(GRO) + self.ag = self.u.atoms[:num_atoms] + self.vdwradii = {'H':1.0, + 'C':1.0, + 'N':1.0, + 'O':1.0, + 'DUMMY':1.0} + + def time_guessbonds(self, num_atoms): + """Benchmark for guessing bonds""" + guessers.guess_bonds(self.ag, self.ag.positions, + box=self.ag.dimensions, + vdwradii=self.vdwradii) + From d2e22ffb0cb46af5266e39b940d7f00c1ca293c1 Mon Sep 17 00:00:00 2001 From: ayushsuhane <34154224+ayushsuhane@users.noreply.github.com> Date: Mon, 13 Aug 2018 06:43:29 -0700 Subject: [PATCH 403/455] Uses faster distance evaluations in Individual methods in Capped Function (#2041) * modified capped function for faster computations, added search_tree in pkdtree, added tests, updated Changlog * updated docs, added cutoff in determine methods * safety condition added for bruteforce method --- package/CHANGELOG | 6 + package/MDAnalysis/lib/distances.py | 198 ++++++++++-------- package/MDAnalysis/lib/pkdtree.py | 63 +++++- .../MDAnalysisTests/lib/test_distances.py | 52 ++++- testsuite/MDAnalysisTests/lib/test_pkdtree.py | 25 +++ 5 files changed, 248 insertions(+), 96 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 432db443ad0..112d6d33764 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -21,6 +21,12 @@ The rules for this file: Enhancements + * Added return_distances argument in lib.distances.capped_distances + to evaluate and return distances only when required. Modified + the optimization rules in lib.distances._determine_method for + faster computations. (PR #2041) + * Added method search_tree in lib.pkdtree to find all the pairs between + two kdtrees. (PR #2041) * Added a wrapper of lib.nsgrid in lib.distances.self_capped_distance and lib.distances.capped_distanceto automatically chose the fastest method for distance based calculations. (PR #2008) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 71608a72fca..94183a014a2 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -403,7 +403,7 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, - box=None, method=None): + box=None, method=None, return_distances=True): """Calculates the pairs and distances within a specified distance If a *box* is supplied, then a minimum image convention is used @@ -436,6 +436,8 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, method : (optional) 'bruteforce' or 'pkdtree' or 'None' Keyword to override the automatic guessing of method built-in in the function [None] + return_distances : (optional) 'True'/'False' + Function returns distances if set to 'True' Returns ------- @@ -444,10 +446,11 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, distance between them is within the ``max_cutoff`` and ``min_cutoff`` pairs[i,j] contains the indices i from reference coordinates, and j from configuration - distances : array + distances : (optional) array Distances corresponding to each pair of indices. d[k] corresponding to the pairs[i,j] gives the distance between i-th and j-th coordinate in reference and configuration respectively + Returns only if ``return_distances`` is set to `True` .. code-block:: python @@ -473,10 +476,18 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, method = _determine_method(reference, configuration, max_cutoff, min_cutoff=min_cutoff, box=box, method=method) - pairs, dist = method(reference, configuration, max_cutoff, - min_cutoff=min_cutoff, box=box) - return np.asarray(pairs), np.asarray(dist) + if return_distances: + pairs, dist = method(reference, configuration, max_cutoff, + min_cutoff=min_cutoff, box=box, + return_distances=return_distances) + return np.asarray(pairs), np.asarray(dist) + else: + pairs = method(reference, configuration, max_cutoff, + min_cutoff=min_cutoff, box=box, + return_distances=return_distances) + + return np.asarray(pairs) def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, @@ -528,7 +539,13 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, if method is not None: return methods[method] - if len(reference) > 5000 and len(configuration) > 5000: + if len(reference) < 10 or len(configuration) < 10: + return methods['bruteforce'] + elif len(reference)*len(configuration) >= 1e8: + # CAUTION : for large datasets, shouldnt go into 'bruteforce' + # in any case. Arbitrary number, but can be characterized + return methods['nsgrid'] + else: if box is None: min_dim = np.array([reference.min(axis=0), configuration.min(axis=0)]) @@ -540,18 +557,14 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, else: tribox = triclinic_vectors(box) size = tribox.max(axis=0) - tribox.min(axis=0) - - if ((np.any(size < 10.0*max_cutoff) and - len(reference) > 100000 and - len(configuration) > 100000)): + if np.any(max_cutoff > 0.3*size): return methods['bruteforce'] else: - return methods['pkdtree'] - return methods['bruteforce'] + return methods['nsgrid'] def _bruteforce_capped(reference, configuration, max_cutoff, - min_cutoff=None, box=None): + min_cutoff=None, box=None, return_distances=True): """Internal method for bruteforce calculations Uses naive distance calulations and returns a list @@ -561,16 +574,16 @@ def _bruteforce_capped(reference, configuration, max_cutoff, Returns ------- - pairs : list - List of ``[(i, j)]`` pairs such that atom-index ``i`` is + pairs : array + Every ``[i, j]`` pair is such that atom-index ``i`` is from reference and ``j`` from configuration array - distance: list + distance: (optional) array Distance between ``reference[i]`` and ``configuration[j]`` - atom coordinate + atom coordinate. Only returns when ``return_distances`` + is set to ``True`` """ pairs, distance = [], [] - reference = np.asarray(reference, dtype=np.float32) configuration = np.asarray(configuration, dtype=np.float32) @@ -582,39 +595,42 @@ def _bruteforce_capped(reference, configuration, max_cutoff, _check_array(reference, 'reference') _check_array(configuration, 'configuration') - for i, coords in enumerate(reference): - dist = distance_array(coords[None, :], configuration, box=box)[0] - if min_cutoff is not None: - idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[0] - else: - idx = np.where((dist < max_cutoff))[0] - for j in idx: - pairs.append((i, j)) - distance.append(dist[j]) - return pairs, distance + distance = distance_array(reference, configuration, box=box) + if min_cutoff is not None: + mask = np.where((distance <= max_cutoff) & (distance > min_cutoff)) + else: + mask = np.where((distance <= max_cutoff)) + + if mask[0].size > 0: + pairs = np.c_[mask[0], mask[1]] + + if return_distances: + distance = distance[mask] + return pairs, distance + else: + return pairs def _pkdtree_capped(reference, configuration, max_cutoff, - min_cutoff=None, box=None): + min_cutoff=None, box=None, return_distances=True): """ Capped Distance evaluations using KDtree. Uses minimum image convention if *box* is specified Returns: -------- - pairs : list - List of atom indices which are within the specified cutoff distance. - pairs `(i, j)` corresponds to i-th particle in reference and + pairs : array + Array of atom indices which are within the specified cutoff distance. + Every pairs `(i, j)` corresponds to i-th particle in reference and j-th particle in configuration - distance : list + distance : (optional) array Distance between two atoms corresponding to the (i, j) indices - in pairs. + in pairs. Only returns when ``return_distances`` + is set to ``True`` """ from .pkdtree import PeriodicKDTree - pairs, distances = [], [] - reference = np.asarray(reference, dtype=np.float32) configuration = np.asarray(configuration, dtype=np.float32) @@ -625,29 +641,27 @@ def _pkdtree_capped(reference, configuration, max_cutoff, _check_array(reference, 'reference') _check_array(configuration, 'configuration') - kdtree = PeriodicKDTree(box=box) cut = max_cutoff if box is not None else None kdtree.set_coords(configuration, cutoff=cut) - # Search for every query point - for idx, centers in enumerate(reference): - kdtree.search(centers, max_cutoff) - indices = kdtree.get_indices() - dist = distance_array(centers.reshape((1, 3)), - configuration[indices], box=box)[0] + pairs = kdtree.search_tree(reference, max_cutoff) + if (return_distances or (min_cutoff is not None)) and pairs.size > 0: + refA, refB = pairs[:, 0], pairs[:, 1] + distance = calc_bonds(reference[refA], configuration[refB], box=box) if min_cutoff is not None: - mask = np.where(dist > min_cutoff)[0] - dist = dist[mask] - indices = [indices[mask[i]] for i in range(len(mask))] - if len(indices) != 0: - for num, j in enumerate(indices): - pairs.append((idx, j)) - distances.append(dist[num]) - return pairs, distances + mask = np.where(distance > min_cutoff) + pairs, distance = pairs[mask], distance[mask] + else: + distance = [] + + if return_distances: + return pairs, distance + else: + return pairs def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, - box=None): + box=None, return_distances=True): """Search all the pairs in *reference* and *configuration* within a specified distance using Grid Search @@ -671,6 +685,17 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention is applied if the box is provided + Returns + ------- + pairs : array + Array of atom indices which are within the specified cutoff distance. + Every pairs `(i, j)` corresponds to i-th particle in reference and + j-th particle in configuration + distance : (optional) array + Distance between two atoms corresponding to the (i, j) indices + in pairs. Only returns when ``return_distances`` + is set to ``True`` + """ from .nsgrid import FastNS if reference.shape == (3, ): @@ -709,12 +734,16 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, results = gridsearch.search(reference) pairs = results.get_pairs() - pair_distance = results.get_pair_distances() + if return_distances or (min_cutoff is not None): + pair_distance = results.get_pair_distances() + if min_cutoff is not None: + idx = pair_distance > min_cutoff + pairs, pair_distance = pairs[idx], pair_distance[idx] - if min_cutoff is not None: - idx = pair_distance > min_cutoff - pairs, pair_distance = pairs[idx], pair_distance[idx] - return pairs, pair_distance + if return_distances: + return pairs, pair_distance + else: + return pairs def self_capped_distance(reference, max_cutoff, min_cutoff=None, @@ -834,23 +863,22 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, if method is not None: return methods[method] - if len(reference) > 5000: - if box is None: + if box is None: min_dim = np.array([reference.min(axis=0)]) max_dim = np.array([reference.max(axis=0)]) size = max_dim.max(axis=0) - min_dim.min(axis=0) - elif np.allclose(box[3:], 90): + elif np.allclose(box[3:], 90): size = box[:3] - else: - tribox = triclinic_vectors(box) - size = tribox.max(axis=0) - tribox.min(axis=0) + else: + tribox = triclinic_vectors(box) + size = tribox.max(axis=0) - tribox.min(axis=0) - if ((np.any(size < 10.0*max_cutoff) and - (len(reference) > 100000))): - return methods['bruteforce'] - else: - return methods['pkdtree'] - return methods['bruteforce'] + if len(reference) < 100: + return methods['bruteforce'] + elif max_cutoff < 0.03*size.min(): + return methods['pkdtree'] + else: + return methods['nsgrid'] def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, @@ -872,27 +900,25 @@ def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, """ pairs, distance = [], [] - reference = np.asarray(reference, dtype=np.float32) if reference.shape == (3, ): reference = reference[None, :] - for i, coords in enumerate(reference): - # Each pair of atoms needs to be checked only once. - # Only calculate distance for atomA and atomB - # if atomidA < atomidB - dist = distance_array(coords[None, :], reference[i+1:], - box=box)[0] - if min_cutoff is not None: - idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[0] - else: - idx = np.where((dist < max_cutoff))[0] - for other_idx in idx: - # Actual atomid for atomB - # can be direclty obtained in this way - j = other_idx + 1 + i - pairs.append((i, j)) - distance.append(dist[other_idx]) + N = len(reference) + distvec = np.zeros((N*(N-1)//2), dtype=np.float64) + self_distance_array(reference, box=box, result=distvec) + + distance = np.ones((N, N), dtype=np.float32)*max_cutoff + distance[np.triu_indices(N, 1)] = distvec + + if min_cutoff is not None: + mask = np.where((distance < max_cutoff) & (distance > min_cutoff)) + else: + mask = np.where((distance < max_cutoff)) + + if mask[0].size > 0: + pairs = np.c_[mask[0], mask[1]] + distance = distance[mask] return np.asarray(pairs), np.asarray(distance) diff --git a/package/MDAnalysis/lib/pkdtree.py b/package/MDAnalysis/lib/pkdtree.py index 5b1b21594f2..087bd1d88cd 100644 --- a/package/MDAnalysis/lib/pkdtree.py +++ b/package/MDAnalysis/lib/pkdtree.py @@ -117,7 +117,6 @@ def set_coords(self, coords, cutoff=None): -------- MDAnalysis.lib._augment.augment_coordinates - """ # If no cutoff distance is provided but PBC aware if self.pbc and (cutoff is None): @@ -170,7 +169,6 @@ def search(self, centers, radius): if centers.shape == (self.dim, ): centers = centers.reshape((1, self.dim)) - self._indices = set() # clear previous search # Sanity check if self.pbc: if self.cutoff < radius: @@ -237,3 +235,64 @@ def search_pairs(self, radius): pairs = np.sort(pairs, axis=1) pairs = unique_rows(pairs) return pairs + + def search_tree(self, centers, radius): + """ + Searches all the pairs within radius between ``centers`` + and ``coords`` + + ``coords`` are the already initialized coordinates in the tree + during ``set_coords(coords, cutoff)``. + ``centers`` are wrapped around the primary unit cell + if PBC is desired. Minimum image convention (PBC) is + activated if ``box`` argument is provided during + class initialization + + Parameters + ---------- + centers: array_like (N,3) + coordinate array to search for neighbors + radius: float + maximum distance to search for neighbors. + + Returns + ------- + pairs : array + all the pairs between ``coords`` and ``centers`` + + Note + ---- + This method constructs another tree from the ``centers`` + and queries the previously built tree (Built in + ``PeriodicKDTree.set_coords(...)``) + """ + + if not self._built: + raise RuntimeError('Unbuilt tree. Run tree.set_coords(...)') + + centers = np.asarray(centers) + if centers.shape == (self.dim, ): + centers = centers.reshape((1, self.dim)) + + # Sanity check + if self.pbc: + if self.cutoff < radius: + raise RuntimeError('Set cutoff greater or equal to the radius.') + # Bring all query points to the central cell + wrapped_centers = apply_PBC(centers, self.box) + other_tree = cKDTree(wrapped_centers, leafsize=self.leafsize) + pairs = other_tree.query_ball_tree(self.ckdt, radius) + pairs = np.array([[i, j] for i, lst in enumerate(pairs) for j in lst], + dtype=np.int64) + if pairs.size > 0: + pairs[:, 1] = undo_augment(pairs[:, 1], + self.mapping, + len(self.coords)) + else: + other_tree = cKDTree(centers, leafsize=self.leafsize) + pairs = other_tree.query_ball_tree(self.ckdt, radius) + pairs = np.array([[i, j] for i, lst in enumerate(pairs) for j in lst], + dtype=np.int64) + if pairs.size > 0: + pairs = unique_rows(pairs) + return pairs diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 38ae57384c8..ccb96e127ec 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -103,6 +103,45 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1], axis=0)) +# for coverage +@pytest.mark.parametrize('npoints', npoints_1) +@pytest.mark.parametrize('box', boxes_1) +@pytest.mark.parametrize('query', query_1) +@pytest.mark.parametrize('method', method_1) +@pytest.mark.parametrize('min_cutoff', min_cutoff_1) +def test_capped_distance_return(npoints, box, query, method, min_cutoff): + np.random.seed(90003) + points = (np.random.uniform(low=0, high=1.0, + size=(npoints, 3))*(boxes_1[0][:3])).astype(np.float32) + max_cutoff = 0.3 + # capped distance should be able to handle array of vectors + # as well as single vectors. + pairs = mda.lib.distances.capped_distance(query, + points, + max_cutoff, + min_cutoff=min_cutoff, + box=box, + method=method, + return_distances=False) + + if pairs.shape != (0, ): + found_pairs = pairs[:, 1] + else: + found_pairs = list() + + if(query.shape[0] == 3): + query = query.reshape((1, 3)) + + distances = mda.lib.distances.distance_array(query, + points, box=box) + + if min_cutoff is None: + min_cutoff = 0. + indices = np.where((distances < max_cutoff) & (distances > min_cutoff)) + + assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1], axis=0)) + + @pytest.mark.parametrize('npoints', npoints_1) @pytest.mark.parametrize('box', boxes_1) @pytest.mark.parametrize('method', method_1) @@ -139,10 +178,8 @@ def test_self_capped_distance(npoints, box, method, min_cutoff): @pytest.mark.parametrize('npoints,cutoff,meth', [(1, 0.02, '_bruteforce_capped_self'), (1, 0.2, '_bruteforce_capped_self'), - (6000, 0.02, '_pkdtree_capped_self'), - (6000, 0.2, '_pkdtree_capped_self'), - (200000, 0.02, '_pkdtree_capped_self'), - (200000, 0.2, '_bruteforce_capped_self')]) + (600, 0.02, '_pkdtree_capped_self'), + (600, 0.2, '_nsgrid_capped_self')]) def test_method_selfselection(box, npoints, cutoff, meth): np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, @@ -157,10 +194,9 @@ def test_method_selfselection(box, npoints, cutoff, meth): @pytest.mark.parametrize('npoints,cutoff,meth', [(1, 0.02, '_bruteforce_capped'), (1, 0.2, '_bruteforce_capped'), - (6000, 0.02, '_pkdtree_capped'), - (6000, 0.2, '_pkdtree_capped'), - (200000, 0.02, '_pkdtree_capped'), - (200000, 0.2, '_bruteforce_capped')]) + (200, 0.02, '_nsgrid_capped'), + (200, 0.35, '_bruteforce_capped'), + (10000, 0.35, '_nsgrid_capped')]) def test_method_selection(box, npoints, cutoff, meth): np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, diff --git a/testsuite/MDAnalysisTests/lib/test_pkdtree.py b/testsuite/MDAnalysisTests/lib/test_pkdtree.py index c161949f9d4..57dd947e55c 100644 --- a/testsuite/MDAnalysisTests/lib/test_pkdtree.py +++ b/testsuite/MDAnalysisTests/lib/test_pkdtree.py @@ -119,6 +119,7 @@ def test_searchpairs(b, radius, result): indices = tree.search_pairs(radius) assert_equal(len(indices), len(result)) + @pytest.mark.parametrize('radius, result', ((0.1, []), (0.3, [[0, 2]]))) def test_ckd_searchpairs_nopbc(radius, result): @@ -127,3 +128,27 @@ def test_ckd_searchpairs_nopbc(radius, result): tree.set_coords(coords) indices = tree.search_pairs(radius) assert_equal(indices, result) + + +@pytest.mark.parametrize('b, q, result', ( + ([10, 10, 10, 90, 90, 90], [0.5, -0.1, 1.1], []), + ([10, 10, 10, 90, 90, 90], [2.1, -3.1, 0.1], [[0, 2], + [0, 3], + [0, 4]]), + ([10, 10, 10, 90, 90, 90], [[2.1, -3.1, 0.1], + [0.5, 0.5, 0.5]], [[0, 2], + [0, 3], + [0, 4], + [1, 1]]), + ([10, 10, 10, 45, 60, 90], [2.1, -3.1, 0.1], [[0, 2], + [0, 3]]) + )) +def test_searchtree(b, q, result): + b = np.array(b, dtype=np.float32) + cutoff = 3.0 + coords = transform_StoR(f_dataset, b) + q = transform_StoR(np.array(q, dtype=np.float32), b) + tree = PeriodicKDTree(box=b) + tree.set_coords(coords, cutoff=cutoff) + pairs = tree.search_tree(q, cutoff) + assert_equal(pairs, result) From e3966303776577e15a043daeceff5a591370398a Mon Sep 17 00:00:00 2001 From: ayushsuhane <34154224+ayushsuhane@users.noreply.github.com> Date: Tue, 14 Aug 2018 07:13:00 -0700 Subject: [PATCH 404/455] Using Capped distance in distance selections (#2035) * modified capped function for faster computations, added search_tree in pkdtree, added tests, updated Changlog * updated docs, added cutoff in determine methods * safety condition added for bruteforce method * added _apply_nsgrid to selections * Removed dependency on kdtree flags, substituted capped_distance in class Distance based selection + point selection except CylindricalSelection * changed determine_method * minor correction for failed tests * updated CHANGELOG * minor flake8 corrections --- package/CHANGELOG | 4 + package/MDAnalysis/core/selection.py | 135 +++++------------- .../core/test_atomselections.py | 52 +++---- 3 files changed, 66 insertions(+), 125 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 112d6d33764..bc64f31b466 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -21,6 +21,10 @@ The rules for this file: Enhancements + * Replaced multiple apply (_apply_distmat, _apply_kdtree) + methods in distance based selections with + lib.distances.capped_distance for automatic selection of + distance evaluation method. (PR #2035) * Added return_distances argument in lib.distances.capped_distances to evaluate and return distances only when required. Modified the optimization rules in lib.distances._determine_method for diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index 4532ac854a7..bac71597b08 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -49,6 +49,7 @@ import numpy as np from numpy.lib.utils import deprecate + from MDAnalysis.lib.pkdtree import PeriodicKDTree from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core import flags @@ -237,10 +238,6 @@ class DistanceSelection(Selection): - _apply_distmat """ def __init__(self): - if flags['use_KDTree_routines'] in (True, 'fast', 'always'): - self.apply = self._apply_KDTree - else: - self.apply = self._apply_distmat self.periodic = flags['use_periodic_selections'] @@ -271,39 +268,23 @@ def __init__(self, parser, tokens): self.cutoff = float(tokens.popleft()) self.sel = parser.parse_expression(self.precedence) - def _apply_KDTree(self, group): - """KDTree based selection is about 7x faster than distmat - for typical problems. - """ + def apply(self, group): + indices = [] sel = self.sel.apply(group) # All atoms in group that aren't in sel sys = group[~np.in1d(group.indices, sel.indices)] - if not sys: + if not sys or not sel: return sys[[]] box = self.validate_dimensions(group.dimensions) + pairs = distances.capped_distance(sel.positions, sys.positions, + self.cutoff, box=box, + return_distances=False) + if pairs.size > 0: + indices = np.sort(pairs[:, 1]) - cut = self.cutoff if box is not None else None - kdtree = PeriodicKDTree(box=box, leafsize=10) - kdtree.set_coords(sys.positions, cutoff=cut) - kdtree.search(sel.positions, self.cutoff) - unique_idx = np.asarray(kdtree.get_indices()) - - return sys[unique_idx.astype(np.int32)].unique - - def _apply_distmat(self, group): - sel = self.sel.apply(group) - sys = group[~np.in1d(group.indices, sel.indices)] - - box = self.validate_dimensions(group.dimensions) - dist = distances.distance_array( - sys.positions, sel.positions, box) - - mask = (dist <= self.cutoff).any(axis=1) - - return sys[mask].unique - + return sys[np.asarray(indices, dtype=np.int64)].unique class SphericalLayerSelection(DistanceSelection): token = 'sphlayer' @@ -314,39 +295,22 @@ def __init__(self, parser, tokens): self.inRadius = float(tokens.popleft()) self.exRadius = float(tokens.popleft()) self.sel = parser.parse_expression(self.precedence) - - def _apply_KDTree(self, group): - """Selection using KDTree and PeriodicKDTree for aperiodic and - fully-periodic systems, respectively. - """ - sel = self.sel.apply(group) - box = self.validate_dimensions(group.dimensions) - periodic = box is not None - ref = sel.center_of_geometry(pbc=periodic) - kdtree = PeriodicKDTree(box=box) - - cutoff = self.exRadius if box is not None else None - kdtree.set_coords(group.positions, cutoff=cutoff) - kdtree.search(ref, self.exRadius) - found_ExtIndices = kdtree.get_indices() - kdtree.search(ref, self.inRadius) - found_IntIndices = kdtree.get_indices() - found_indices = list(set(found_ExtIndices) - set(found_IntIndices)) - return group[found_indices].unique - - def _apply_distmat(self, group): + + def apply(self, group): + indices = [] sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) periodic = box is not None ref = sel.center_of_geometry(pbc=periodic).reshape(1, 3).astype( np.float32) - d = distances.distance_array(ref, - group.positions, - box=box)[0] - mask = d < self.exRadius - mask &= d > self.inRadius + pairs = distances.capped_distance(ref, group.positions, self.exRadius, + min_cutoff=self.inRadius, + box=box, + return_distances=False) + if pairs.size > 0: + indices = np.sort(pairs[:, 1]) - return group[mask].unique + return group[np.asarray(indices, dtype=np.int64)].unique class SphericalZoneSelection(DistanceSelection): @@ -358,39 +322,27 @@ def __init__(self, parser, tokens): self.cutoff = float(tokens.popleft()) self.sel = parser.parse_expression(self.precedence) - def _apply_KDTree(self, group): - """Selection using KDTree and PeriodicKDTree for aperiodic and - fully-periodic systems, respectively. - """ + def apply(self, group): + indices = [] sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) periodic = box is not None - ref = sel.center_of_geometry(pbc=periodic) + ref = sel.center_of_geometry(pbc=periodic).reshape(1, 3).astype( + np.float32) + pairs = distances.capped_distance(ref, group.positions, self.cutoff, + box=box, + return_distances=False) + if pairs.size > 0: + indices = np.sort(pairs[:, 1]) - cut = self.cutoff if box is not None else None - kdtree = PeriodicKDTree(box=box) - kdtree.set_coords(group.positions, cutoff=cut) - kdtree.search(ref, self.cutoff) - found_indices = kdtree.get_indices() - return group[found_indices].unique - - def _apply_distmat(self, group): - sel = self.sel.apply(group) - box = self.validate_dimensions(group.dimensions) - periodic = box is not None - ref = sel.center_of_geometry(pbc=periodic).reshape(1, 3).\ - astype(np.float32) - d = distances.distance_array(ref, - group.positions, - box=box)[0] - idx = d < self.cutoff - return group[idx].unique + return group[np.asarray(indices, dtype=np.int64)].unique class CylindricalSelection(Selection): def __init__(self): self.periodic = flags['use_periodic_selections'] + def apply(self, group): sel = self.sel.apply(group) @@ -484,25 +436,16 @@ def __init__(self, parser, tokens): self.ref = np.array([x, y, z], dtype=np.float32) self.cutoff = float(tokens.popleft()) - def _apply_KDTree(self, group): - box = self.validate_dimensions(group.dimensions) - kdtree = PeriodicKDTree(box=box) - cut = self.cutoff if box is not None else None - kdtree.set_coords(group.positions, cutoff=cut) - kdtree.search(self.ref, self.cutoff) - found_indices = kdtree.get_indices() - - return group[found_indices].unique - - def _apply_distmat(self, group): - ref_coor = self.ref[np.newaxis, ...] - - ref_coor = np.asarray(ref_coor, dtype=np.float32) + def apply(self, group): + indices = [] box = self.validate_dimensions(group.dimensions) + pairs = distances.capped_distance(self.ref[None, :], group.positions, self.cutoff, + box=box, + return_distances=False) + if pairs.size > 0: + indices = np.sort(pairs[:, 1]) - dist = distances.distance_array(group.positions, ref_coor, box) - mask = (dist <= self.cutoff).any(axis=1) - return group[mask].unique + return group[np.asarray(indices, dtype=np.int64)].unique class AtomSelection(Selection): diff --git a/testsuite/MDAnalysisTests/core/test_atomselections.py b/testsuite/MDAnalysisTests/core/test_atomselections.py index 33178097ca0..c60e094aee5 100644 --- a/testsuite/MDAnalysisTests/core/test_atomselections.py +++ b/testsuite/MDAnalysisTests/core/test_atomselections.py @@ -496,31 +496,14 @@ class BaseDistanceSelection(object): Cylindrical methods don't use KDTree """ - - methods = [('kdtree', False), - ('kdtree', True), - ('distmat', True), - ('distmat', False)] - - @staticmethod - def choosemeth(sel, meth, periodic): - """hack in the desired apply method""" - if meth == 'kdtree': - sel.apply = sel._apply_KDTree - elif meth == 'distmat': - sel.apply = sel._apply_distmat - + @pytest.mark.parametrize('periodic', (True, False)) + def test_around(self, u, periodic): + sel = Parser.parse('around 5.0 resid 1', u.atoms) if periodic: sel.periodic = True else: sel.periodic = False - return sel - - @pytest.mark.parametrize('meth, periodic', methods) - def test_around(self, u, meth, periodic): - sel = Parser.parse('around 5.0 resid 1', u.atoms) - sel = self.choosemeth(sel, meth, periodic) result = sel.apply(u.atoms) r1 = u.select_atoms('resid 1') @@ -535,10 +518,14 @@ def test_around(self, u, meth, periodic): ref.difference_update(set(r1.indices)) assert ref == set(result.indices) - @pytest.mark.parametrize('meth, periodic', methods) - def test_spherical_layer(self, u, meth, periodic): + @pytest.mark.parametrize('periodic', (True, False)) + def test_spherical_layer(self, u, periodic): sel = Parser.parse('sphlayer 2.4 6.0 resid 1', u.atoms) - sel = self.choosemeth(sel, meth, periodic) + if periodic: + sel.periodic = True + else: + sel.periodic = False + result = sel.apply(u.atoms) r1 = u.select_atoms('resid 1') @@ -549,10 +536,14 @@ def test_spherical_layer(self, u, meth, periodic): assert ref == set(result.indices) - @pytest.mark.parametrize('meth, periodic', methods) - def test_spherical_zone(self, u, meth, periodic): + @pytest.mark.parametrize('periodic', (True, False)) + def test_spherical_zone(self, u, periodic): sel = Parser.parse('sphzone 5.0 resid 1', u.atoms) - sel = self.choosemeth(sel, meth, periodic) + if periodic: + sel.periodic = True + else: + sel.periodic = False + result = sel.apply(u.atoms) r1 = u.select_atoms('resid 1') @@ -563,10 +554,13 @@ def test_spherical_zone(self, u, meth, periodic): assert ref == set(result.indices) - @pytest.mark.parametrize('meth, periodic', methods) - def test_point(self, u, meth, periodic): + @pytest.mark.parametrize('periodic', (True, False)) + def test_point(self, u, periodic): sel = Parser.parse('point 5.0 5.0 5.0 3.0', u.atoms) - sel = self.choosemeth(sel, meth, periodic) + if periodic: + sel.periodic = True + else: + sel.periodic = False result = sel.apply(u.atoms) box = u.dimensions if periodic else None From 6f34d3cb6e5e464724e991b3703051e1d99b8f5f Mon Sep 17 00:00:00 2001 From: Tyler Reddy Date: Sat, 11 Aug 2018 18:21:20 -0700 Subject: [PATCH 405/455] TST: add codecov to appveyor CI run. --- .appveyor.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 7669c2e4009..988a4535a29 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -48,7 +48,7 @@ install: # see: https://github.com/swistakm/pyimgui/blob/master/.appveyor.yml - cp "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h" "C:\Users\appveyor\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include\stdint.h" - ps: conda config --append channels conda-forge - - ps: conda create -n testing python=$env:PYTHON_VERSION pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis + - ps: conda create -n testing python=$env:PYTHON_VERSION pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis pytest-cov codecov - cmd: C:\conda\envs\testing\Scripts\pip.exe install gsd==1.5.2 duecredit - cmd: C:\conda\envs\testing\Scripts\activate testing @@ -60,7 +60,8 @@ test_script: - cmd: cd ..\testsuite - cmd: C:\conda\envs\testing\python.exe setup.py develop --no-deps --user 3>&1 - cmd: cd MDAnalysisTests - - cmd: C:\conda\envs\testing\Scripts\pytest.exe --disable-pytest-warnings 3>&1 + - cmd: C:\conda\envs\testing\Scripts\pytest.exe --cov=MDAnalysis --disable-pytest-warnings 3>&1 + - cmd: codecov after_build: # cache cleanup From 6cee1c1da269b501ec6006060c7a9174fed36ead Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Tue, 14 Aug 2018 14:20:24 -0700 Subject: [PATCH 406/455] remove unused lib.mdamath.one_to_many_pointers() function fix #2010 --- package/CHANGELOG | 2 ++ package/MDAnalysis/lib/mdamath.py | 43 ------------------------------- 2 files changed, 2 insertions(+), 43 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 112d6d33764..7234cc9ff02 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -106,6 +106,8 @@ Changes * The TPR parser reads SETTLE constraints as bonds. (Issue #1949) * Indexing a trajectory with a slice or an array now returns an iterable (Issue #1894) + * removed unused function MDAnalysis.lb.mdamath.one_to_many_pointers() + (issue #2010) Deprecations * almost all "save()", "save_results()", "save_table()" methods in diff --git a/package/MDAnalysis/lib/mdamath.py b/package/MDAnalysis/lib/mdamath.py index 8d8f87badbd..d623142e386 100644 --- a/package/MDAnalysis/lib/mdamath.py +++ b/package/MDAnalysis/lib/mdamath.py @@ -249,46 +249,3 @@ def box_volume(dimensions): """ return np.linalg.det(triclinic_vectors(dimensions)) - -def one_to_many_pointers(Ni, Nj, i2j): - """Based on a many to one mapping of i to j, create the reverse mapping - - Arguments - --------- - Ni : int - number of i components - Nj : int - number of j components - i2j : numpy.ndarray - relates i to parent js - - Returns - ------- - ordered : list - an ordered list of i indices [size (i,)] - ptrs : list - the start and end index for each j [size (Nj, 2)] - - Example - ------- - .. code:: python - - # Residx - the resid of each Atom - ordered, ptrs = one_to_many_pointers(Natoms, Nres, Residx) - - # Returns an array of the atom indices that are in resid 7 - atoms = ordered[ptrs[7,0]:ptrs[7,1]] - - """ - ordered = i2j.argsort() - sorted_idx = i2j[ordered] - borders = np.concatenate([[0], - np.where(np.diff(sorted_idx))[0] + 1, - [Ni]]) - - ptrs = np.zeros((Nj, 2), dtype=np.int32) - for x, y in zip(borders[:-1], borders[1:]): - i = sorted_idx[x] - ptrs[i] = x, y - - return ordered, ptrs From 353f22051feaea8567b60a50e7c2fbe598c39aa7 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Tue, 14 Aug 2018 15:17:50 -0700 Subject: [PATCH 407/455] removed testsuite/__init__.py - fix #2040 - instead of relying on pytest to interpret testsuite/setup.py as a package-level setup and generate MDAnalysisTests/authors.py on Travis CI, explicitly build the testsuite on Travis CI (see https://github.com/MDAnalysis/mdanalysis/issues/2040#issuecomment-413033864 for details) - made header of testsuite/AUTHORS the same as package/AUTHORS (until we merge them according to #2050) --- .travis.yml | 2 +- testsuite/AUTHORS | 10 +++++----- testsuite/__init__.py | 0 3 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 testsuite/__init__.py diff --git a/.travis.yml b/.travis.yml index 957cbb219d0..941a7eb0436 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ env: - PYTEST_LIST="testsuite/MDAnalysisTests" - MAIN_CMD="pytest ${PYTEST_LIST}" - SETUP_CMD="${PYTEST_FLAGS}" - - BUILD_CMD="pip install -v package/ && pip install testsuite/" + - BUILD_CMD="pip install -v package/ && (cd testsuite/ && python setup.py build)" - CONDA_MIN_DEPENDENCIES="mmtf-python mock six biopython networkx cython joblib matplotlib scipy griddataformats hypothesis gsd codecov" - CONDA_DEPENDENCIES="${CONDA_MIN_DEPENDENCIES} seaborn>=0.7.0 clustalw=2.1 netcdf4 scikit-learn" - CONDA_CHANNELS='biobuilds conda-forge' diff --git a/testsuite/AUTHORS b/testsuite/AUTHORS index 32fb9b8fbed..c1927e7541c 100644 --- a/testsuite/AUTHORS +++ b/testsuite/AUTHORS @@ -6,12 +6,12 @@ MDAnalysis was originally written by Naveen Michaud-Agrawal. -Oliver Beckstein and Elizabeth J. Denning are maintaining the project -and contributing to the development. +The project is maintained by the MDAnalysis Core Developer Team +(@MDAnalysis/coredevs on https://github.com/MDAnalysis). -All contributing authors are listed in this file below. The repository -history at https://github.com/MDAnalysis/mdanalysis and the CHANGELOG -show individual code contributions. +All contributing authors for the testsuite are listed in this file below. The +repository history at https://github.com/MDAnalysis/mdanalysis and the +CHANGELOG show individual code contributions. Chronological list of authors diff --git a/testsuite/__init__.py b/testsuite/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 From e9ee6be5179c0589bb729774cddb7393df490f5f Mon Sep 17 00:00:00 2001 From: ayushsuhane <34154224+ayushsuhane@users.noreply.github.com> Date: Wed, 15 Aug 2018 06:06:44 -0700 Subject: [PATCH 408/455] Modified the distance function in RDF (#2013) * using capped_distance function in rdf * updated docs, added cutoff in determine methods * extended RDF benchmarks to cover range of atoms --- benchmarks/benchmarks/analysis/rdf.py | 12 +++++----- package/CHANGELOG | 3 +++ package/MDAnalysis/analysis/rdf.py | 32 +++++++++++---------------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/benchmarks/benchmarks/analysis/rdf.py b/benchmarks/benchmarks/analysis/rdf.py index 7be6ad35789..a91c12eb139 100644 --- a/benchmarks/benchmarks/analysis/rdf.py +++ b/benchmarks/benchmarks/analysis/rdf.py @@ -17,21 +17,23 @@ class SimpleRdfBench(object): """ params = ([20,75,200], - [[0,5], [0,15], [0,20]]) + [[0,5], [0,15], [0,20]], + [1, 100, 1000, 10000]) param_names = ['nbins', - 'range_val'] + 'range_val', + 'natoms'] - def setup(self, nbins, range_val): + def setup(self, nbins, range_val, natoms): self.sel_str = 'name OW' self.u = MDAnalysis.Universe(TPR, XTC) try: - self.sel = self.u.select_atoms(self.sel_str)[:200] + self.sel = self.u.select_atoms(self.sel_str)[:natoms] except AttributeError: - self.sel = self.u.selectAtoms(self.sel_str)[:200] + self.sel = self.u.selectAtoms(self.sel_str)[:natoms] # do not include initialization of the # InterRDF object in the benchmark itself diff --git a/package/CHANGELOG b/package/CHANGELOG index 2c487c0dc9d..946e8458de3 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -21,10 +21,13 @@ The rules for this file: Enhancements + * Replaced multiple apply (_apply_distmat, _apply_kdtree) methods in distance based selections with lib.distances.capped_distance for automatic selection of distance evaluation method. (PR #2035) + * Modified analysis.rdf.InterRDF to use lib.distances.capped_distance + to handle rdf calculations for large systems. (PR #2013) * Added return_distances argument in lib.distances.capped_distances to evaluate and return distances only when required. Modified the optimization rules in lib.distances._determine_method for diff --git a/package/MDAnalysis/analysis/rdf.py b/package/MDAnalysis/analysis/rdf.py index 23d7cf667b3..0d96b7ac106 100644 --- a/package/MDAnalysis/analysis/rdf.py +++ b/package/MDAnalysis/analysis/rdf.py @@ -187,26 +187,23 @@ def _prepare(self): # Need to know average volume self.volume = 0.0 + # Set the max range to filter the search radius + self._maxrange = self.rdf_settings['range'][1] - # Allocate a results array which we will reuse - self._result = np.zeros((len(self.g1), len(self.g2)), dtype=np.float64) - # If provided exclusions, create a mask of _result which - # lets us take these out - if self._exclusion_block is not None: - self._exclusion_mask = blocks_of(self._result, - *self._exclusion_block) - self._maxrange = self.rdf_settings['range'][1] + 1.0 - else: - self._exclusion_mask = None def _single_frame(self): - distances.distance_array(self.g1.positions, self.g2.positions, - box=self.u.dimensions, result=self._result) + pairs, dist = distances.capped_distance(self.g1.positions, + self.g2.positions, + self._maxrange, + box=self.u.dimensions) # Maybe exclude same molecule distances - if self._exclusion_mask is not None: - self._exclusion_mask[:] = self._maxrange + if self._exclusion_block is not None: + idxA, idxB = pairs[:, 0]//self._exclusion_block[0], pairs[:, 1]//self._exclusion_block[1] + mask = np.where(idxA != idxB)[0] + dist = dist[mask] + - count = np.histogram(self._result, **self.rdf_settings)[0] + count = np.histogram(dist, **self.rdf_settings)[0] self.count += count self.volume += self._ts.volume @@ -370,15 +367,12 @@ def _conclude(self): def get_cdf(self): """Calculate the cumulative distribution functions (CDF) for all sites. - Note that this is the actual count within a given radius, i.e., :math:`N(r)`. - Returns ------- cdf : list list of arrays with the same structure as :attr:`rdf` - """ # Calculate cumulative distribution function # Empty list to restore CDF @@ -391,4 +385,4 @@ def get_cdf(self): # self.cdf is a list of cdf between pairs of AtomGroups in ags self.cdf = cdf - return cdf + return cdf \ No newline at end of file From 825ee05423085521e6a718b3527be9b723409280 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Thu, 16 Aug 2018 11:08:09 -0700 Subject: [PATCH 409/455] tests and updated docs for analysis.data (#2047) - add docs explaining data and showing example use - simple test for loading all data in analysis.data.filenames (analysis/test_data.py) - replaced assert_array_equal with assert_equal in utils/test_datafiles.py, which I used as a template --- package/MDAnalysis/analysis/data/filenames.py | 32 +++++++++++++++++-- .../MDAnalysisTests/analysis/test_data.py | 32 +++++++++++++++++++ .../MDAnalysisTests/utils/test_datafiles.py | 6 ++-- 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 testsuite/MDAnalysisTests/analysis/test_data.py diff --git a/package/MDAnalysis/analysis/data/filenames.py b/package/MDAnalysis/analysis/data/filenames.py index 81971bb6b13..795ca9db37c 100644 --- a/package/MDAnalysis/analysis/data/filenames.py +++ b/package/MDAnalysis/analysis/data/filenames.py @@ -19,8 +19,7 @@ # MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -""" -Analysis data files +"""Analysis data files =================== :mod:`MDAnalysis.analysis.data` contains data files that are used as part of @@ -37,11 +36,38 @@ Reference Ramachandran histogram for :class:`MDAnalysis.analysis.dihedrals.Ramachandran`. The data were calculated on a data set of 500 PDB structures taken from [Lovell2003]_. + This is a numpy array in the :math:`\phi` and :math:`psi` backbone dihedral angles. + + Load and plot it with :: + + import numpy as np + import matplotlib.pyplot as plt + from MDAnalysis.analysis.data.filenames import Rama_ref + X, Y = np.meshgrid(np.arange(-180, 180, 4), np.arange(-180, 180, 4)) + Z = np.load(Rama_ref) + ax.contourf(X, Y, Z, levels=[1, 17, 15000]) + + The given levels will draw contours that contain 90% and 99% of the data + points. See the :ref:`Ramachandran plot figure ` as an + example. .. data:: Janin_ref - Reference Ramachandran histogram for :class:`MDAnalysis.analysis.dihedrals.Ramachandran`. + Reference Janin histogram for :class:`MDAnalysis.analysis.dihedrals.Janin`. The data were calculated on a data set of 500 PDB structures taken from [Lovell2003]_. + This is a numpy array in the :math:`\chi_1` and :math:`chi_2` sidechain dihedral angles. + + Load and plot it with :: + + import numpy as np + import matplotlib.pyplot as plt + from MDAnalysis.analysis.data.filenames import Janin_ref + X, Y = np.meshgrid(np.arange(-180, 180, 4), np.arange(-180, 180, 4)) + Z = np.load(Janin_ref) + ax.contourf(X, Y, Z, levels=[1, 6, 600]) + + The given levels will draw contours that contain 90% and 98% of the + data. See the :ref:`Janin plot figure ` as an example. """ from __future__ import absolute_import diff --git a/testsuite/MDAnalysisTests/analysis/test_data.py b/testsuite/MDAnalysisTests/analysis/test_data.py new file mode 100644 index 00000000000..14034cd3de1 --- /dev/null +++ b/testsuite/MDAnalysisTests/analysis/test_data.py @@ -0,0 +1,32 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +from __future__ import absolute_import + +from numpy.testing import assert_equal +import pytest + +def test_all_exports(): + from MDAnalysis.analysis.data import filenames + missing = [name for name in dir(filenames) + if + not name.startswith('_') and name not in filenames.__all__ and name != 'absolute_import'] + assert_equal(missing, [], err_msg="Variables need to be added to __all__.") diff --git a/testsuite/MDAnalysisTests/utils/test_datafiles.py b/testsuite/MDAnalysisTests/utils/test_datafiles.py index 946db49c64a..945b4157c15 100644 --- a/testsuite/MDAnalysisTests/utils/test_datafiles.py +++ b/testsuite/MDAnalysisTests/utils/test_datafiles.py @@ -22,7 +22,7 @@ from __future__ import absolute_import import pytest -from numpy.testing import assert_array_equal +from numpy.testing import assert_equal def test_import(): @@ -37,7 +37,7 @@ def test_all_exports(): missing = [name for name in dir(MDAnalysisTests.datafiles) if not name.startswith('_') and name not in MDAnalysisTests.datafiles.__all__ and name != 'absolute_import'] - assert_array_equal(missing, [], err_msg="Variables need to be added to __all__.") + assert_equal(missing, [], err_msg="Variables need to be added to __all__.") def test_export_variables(): @@ -45,4 +45,4 @@ def test_export_variables(): import MDAnalysis.tests.datafiles missing = [name for name in MDAnalysisTests.datafiles.__all__ if name not in dir(MDAnalysis.tests.datafiles)] - assert_array_equal(missing, [], err_msg="Variables not exported to MDAnalysis.tests.datafiles") + assert_equal(missing, [], err_msg="Variables not exported to MDAnalysis.tests.datafiles") From 5eebb18bea3a89df08dd3adfd187b9ee18a67d1f Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Sat, 18 Aug 2018 17:48:29 +0200 Subject: [PATCH 410/455] Simplified code in `lib.distances` a bit (#2048) * Simplified code in `lib.distances` * Renamed `_box_check()` -> `_check_box()` to be consistent with naming of other helper functions. * `_check_box()` now also returns the box in the format expected by low-level C functions in `lib.c_distances`. * Removed obsolete box type `'tri_vecs_bad'`. * Renamed `_check_array()` -> `_check_coord_array()` to better reflect its purpose. * Renamed `_check_results_array()` -> `_check_result_array()` since the checked parameter is always named `result`. * `_check_result_array()` now returns a numpy array of correct shape and dtype if `result` is `None`. * Improved docstrings of `transform_RtoS()` and `transform_StoR()` and added input coordinate shape check. Adjusted `test_augment.py` accordingly. * Added shape check for input coordinates of `calc_distance()`, `clac_angle()`, and `calc_dihedral()`. * fixed wrong box types in `_check_box()` * tests for `transform_RtoS()` and `transform_StoR()` with single coordinate input * added ortho detection for tri_vecs format in `_check_box()` * added tests for `check_box()` helper function * made `_check_box()` correspond to docs and moved coord checks to `@check_coords()` decorator. * fixed tests to work with correct box requirements * Small doc fixes in `lib.util`; added check for contiguous input in `lib.util.blocks_of()` * added tests for `check_coords()` decorator and for `_check_result_array()` --- package/MDAnalysis/lib/_cutil.pyx | 13 +- package/MDAnalysis/lib/distances.py | 630 ++++++------------ package/MDAnalysis/lib/nsgrid.pyx | 15 +- package/MDAnalysis/lib/util.py | 258 ++++++- .../analysis/test_distances.py | 2 +- .../MDAnalysisTests/core/test_atomgroup.py | 2 +- testsuite/MDAnalysisTests/lib/test_augment.py | 4 +- .../MDAnalysisTests/lib/test_distances.py | 84 +++ testsuite/MDAnalysisTests/lib/test_util.py | 277 +++++++- .../MDAnalysisTests/utils/test_distances.py | 133 ++-- 10 files changed, 894 insertions(+), 524 deletions(-) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index dec11c68ea7..dd5206dd4d4 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -45,19 +45,20 @@ ctypedef cmap[int, intset] intmap @cython.boundscheck(False) # turn off bounds-checking for entire function @cython.wraparound(False) # turn off negative index wrapping for entire function def unique_int_1d(np.int64_t[:] values): - """ - Find the unique elements of a 1D array of integers. + """Find the unique elements of a 1D array of integers. This function is optimal on sorted arrays. Parameters ---------- - values: np.ndarray of type int64 - 1D array of int in which to find the unique values. + values: numpy.ndarray + 1D array of dtype ``numpy.int64`` in which to find the unique values. Returns ------- - np.ndarray + numpy.ndarray + A deduplicated copy of `values`. + .. versionadded:: 0.19.0 """ @@ -310,4 +311,4 @@ cdef float _norm(float * a): result = 0.0 for n in range(3): result += a[n]*a[n] - return sqrt(result) \ No newline at end of file + return sqrt(result) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 94183a014a2..25d2822fd0f 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -73,6 +73,7 @@ import numpy as np from numpy.lib.utils import deprecate +from .util import check_coords from .mdamath import triclinic_vectors, triclinic_box from ._augment import augment_coordinates, undo_augment @@ -128,98 +129,101 @@ def _run(funcname, args=None, kwargs=None, backend="serial"): from .c_distances_openmp import OPENMP_ENABLED as USED_OPENMP -def _box_check(box): - """Take a box input and deduce what type of system it represents based - on the shape of the array and whether all angles are 90. +def _check_box(box): + """Take a box input and deduce what type of system it represents based on + the shape of the array and whether all angles are 90 degrees. Parameters ---------- - box : array - Box information of unknown format. + box : array_like + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. Returns ------- boxtype : str - * ``ortho`` orthogonal box - * ``tri_vecs`` triclinic box vectors - * ``tri_box`` triclinic box lengths and angles + * ``'ortho'`` orthogonal box + * ``'tri_vecs'`` triclinic box vectors + + checked_box : numpy.ndarray + Array of dtype ``numpy.float32`` containing box information: + * If `boxtype` is ``'ortho'``, `cecked_box` will have the shape ``(3,)`` + containing the x-, y-, and z-dimensions of the orthogonal box. + * If `boxtype` is ``'tri_vecs'``, `cecked_box` will have the shape + ``(3, 3)`` containing the triclinic box vectors in a lower triangular + matrix as returned by + :meth:`~MDAnalysis.lib.mdamath.triclinic_vectors`. Raises ------ - TypeError - If box is not float32. ValueError - If box type not detected. + If `box` is not of the form ``[lx, ly, lz, alpha, beta, gamma]`` + or contains data that is not convertible to ``numpy.float32``. + + .. seealso: :meth:`~MDAnalysis.lib.mdamath.triclinic_vectors` + .. versionchanged: 0.19.0 + * Enforced correspondence of `box` with specified format. + * Added automatic conversion of input to :class:`numpy.ndarray` with + dtype ``numpy.float32``. + * Now also returns the box in the format expected by low-level functions + in :mod:`~MDAnalysis.lib.c_distances`. + * Removed obsolete box types ``tri_box`` and ``tri_vecs_bad``. """ - if box.dtype != np.float32: - raise TypeError("Box must be of type float32") - - boxtype = 'unknown' - - if box.shape == (3,): - boxtype = 'ortho' - elif box.shape == (3, 3): - if np.all([box[0][1] == 0.0, # Checks that tri box is properly formatted - box[0][2] == 0.0, - box[1][2] == 0.0]): - boxtype = 'tri_vecs' - else: - boxtype = 'tri_vecs_bad' - elif box.shape == (6,): - if np.all(box[3:] == 90.): - boxtype = 'ortho' - else: - boxtype = 'tri_box' + box = np.asarray(box, dtype=np.float32, order='C') + if box.shape != (6,): + raise ValueError("Invalid box information. Must be of the form " + "[lx, ly, lz, alpha, beta, gamma].") + if np.all(box[3:] == 90.): + return 'ortho', box[:3] + return 'tri_vecs', triclinic_vectors(box) - if boxtype == 'unknown': - raise ValueError("box input not recognised" - ", must be an array of box dimensions") - return boxtype - - -def _check_array(coords, desc): - """Check an array is a valid array of coordinates - - Must be: - (n,3) in shape - float32 data - """ - if (coords.ndim != 2 or coords.shape[1] != 3): - raise ValueError("{0} must be a sequence of 3 dimensional coordinates" - "".format(desc)) - _check_array_dtype(coords, desc) +def _check_result_array(result, shape): + """Check if the result array is ok to use. + The `result` array must meet the following requirements: + * Must have a shape equal to `shape`. + * Its dtype must be ``numpy.float64``. -def _check_array_dtype(coords, desc): - """Check whether an array contains values of dtype: np.float32 or not""" - if coords.dtype != np.float32: - raise TypeError("{0} must be of type float32".format(desc)) - + Paramaters + ---------- + result : numpy.ndarray or None + The result array to check. If `result` is `None``, a newly created + array of correct shape and dtype ``numpy.float64`` will be returned. + shape : tuple + The shape expected for the `result` array. -def _check_results_array(results, size): - """Check the results array is ok to use + Returns + ------- + result : numpy.ndarray + The input array or a newly created array if the input was ``None``. - Must be: - same shape as size - float64 + Raises + ------ + ValueError + If `result` is of incorrect shape. + TypeError + If the dtype of `result` is not ``numpy.float64``. """ - if results.shape != size: - raise ValueError("Result array has incorrect size," - "should be {0}, got {1}".format(size, results.shape)) - if results.dtype != np.float64: - raise TypeError("Results array must be of type float64") - - -def _check_lengths_match(*arrays): - """Check all arrays are same shape""" - ref = arrays[0].shape - - if not all( a.shape == ref for a in arrays): - raise ValueError("Input arrays must all be same shape" - "Got {0}".format([a.shape for a in arrays])) - -def distance_array(reference, configuration, box=None, result=None, backend="serial"): + if result is None: + return np.zeros(shape, dtype=np.float64) + if result.shape != shape: + raise ValueError("Result array has incorrect shape, should be {0}, got " + "{1}.".format(shape, result.shape)) + if result.dtype != np.float64: + raise TypeError("Result array must be of type numpy.float64, got {}." + "".format(result.dtype)) +# The following two lines would break a lot of tests. WHY?! +# if not coords.flags['C_CONTIGUOUS']: +# raise ValueError("{0} is not C-contiguous.".format(desc)) + return result + +@check_coords('reference', 'configuration', enforce_copy=False, + check_lengths_match=False) +def distance_array(reference, configuration, box=None, result=None, + backend="serial"): """Calculate all distances between a reference set and another configuration. If there are *i* positions in reference, and *j* positions in configuration, @@ -260,57 +264,35 @@ def distance_array(reference, configuration, box=None, result=None, backend="ser ``d[i,j]`` between reference coordinates `i` and configuration coordinates `j`. - Note - ---- - This method is slower than it could be because internally we need to make - copies of the ref and conf arrays. - .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - ref = reference.astype(np.float32, order='C', copy=True) - conf = configuration.astype(np.float32, order='C', copy=True) - - _check_array(conf, 'conf') - _check_array(ref, 'ref') + confnum = configuration.shape[0] + refnum = reference.shape[0] - if box is not None: - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - - confnum = conf.shape[0] - refnum = ref.shape[0] - - if result is not None: - _check_results_array(result, (refnum, confnum)) - distances = np.asarray(result) - else: - distances = np.zeros((refnum, confnum), np.float64) + distances = _check_result_array(result, (refnum, confnum)) if box is not None: + boxtype, box = _check_box(box) if boxtype == 'ortho': _run("calc_distance_array_ortho", - args=(ref, conf, box, distances), - backend=backend) + args=(reference, configuration, box, distances), + backend=backend) else: _run("calc_distance_array_triclinic", - args=(ref, conf, box, distances), - backend=backend) + args=(reference, configuration, box, distances), + backend=backend) else: _run("calc_distance_array", - args=(ref, conf, distances), - backend=backend) + args=(reference, configuration, distances), + backend=backend) return distances - +@check_coords('reference', enforce_copy=False, reduce_result_if_single=False) def self_distance_array(reference, box=None, result=None, backend="serial"): """Calculate all distances within a configuration *reference*. @@ -352,52 +334,33 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): k += 1 dist[i,j] = d[k] - Note - ---- - This method is slower than it could be because internally we need to make - copies of the coordinate array. - .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - ref = reference.astype(np.float32, order='C', copy=True) - - _check_array(ref, 'ref') - - with_PBC = (box is not None) - if box is not None: - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - - refnum = ref.shape[0] + refnum = reference.shape[0] distnum = refnum * (refnum - 1) // 2 - if result is not None: - _check_results_array(result, (distnum,)) - distances = np.asarray(result) - else: - distances = np.zeros((distnum,), np.float64) + distances = _check_result_array(result, (distnum,)) + if len(distances) == 0: + return distances if box is not None: + boxtype, box = _check_box(box) if boxtype == 'ortho': _run("calc_self_distance_array_ortho", - args=(ref, box, distances), - backend=backend) + args=(reference, box, distances), + backend=backend) else: _run("calc_self_distance_array_triclinic", - args=(ref, box, distances), - backend=backend) + args=(reference, box, distances), + backend=backend) else: _run("calc_self_distance_array", - args=(ref, distances), - backend=backend) + args=(reference, distances), + backend=backend) return distances @@ -562,9 +525,10 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, else: return methods['nsgrid'] - -def _bruteforce_capped(reference, configuration, max_cutoff, - min_cutoff=None, box=None, return_distances=True): +@check_coords('reference', 'configuration', enforce_copy=False, + reduce_result_if_single=False, check_lengths_match=False) +def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, + box=None, return_distances=True): """Internal method for bruteforce calculations Uses naive distance calulations and returns a list @@ -583,17 +547,7 @@ def _bruteforce_capped(reference, configuration, max_cutoff, is set to ``True`` """ - pairs, distance = [], [] - reference = np.asarray(reference, dtype=np.float32) - configuration = np.asarray(configuration, dtype=np.float32) - - if reference.shape == (3, ): - reference = reference[None, :] - if configuration.shape == (3, ): - configuration = configuration[None, :] - - _check_array(reference, 'reference') - _check_array(configuration, 'configuration') + pairs = [] distance = distance_array(reference, configuration, box=box) if min_cutoff is not None: @@ -610,9 +564,10 @@ def _bruteforce_capped(reference, configuration, max_cutoff, else: return pairs - -def _pkdtree_capped(reference, configuration, max_cutoff, - min_cutoff=None, box=None, return_distances=True): +@check_coords('reference', 'configuration', enforce_copy=False, + reduce_result_if_single=False, check_lengths_match=False) +def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, + box=None, return_distances=True): """ Capped Distance evaluations using KDtree. Uses minimum image convention if *box* is specified @@ -631,16 +586,6 @@ def _pkdtree_capped(reference, configuration, max_cutoff, """ from .pkdtree import PeriodicKDTree - reference = np.asarray(reference, dtype=np.float32) - configuration = np.asarray(configuration, dtype=np.float32) - - if reference.shape == (3, ): - reference = reference[None, :] - if configuration.shape == (3, ): - configuration = configuration[None, :] - - _check_array(reference, 'reference') - _check_array(configuration, 'configuration') kdtree = PeriodicKDTree(box=box) cut = max_cutoff if box is not None else None kdtree.set_coords(configuration, cutoff=cut) @@ -659,7 +604,8 @@ def _pkdtree_capped(reference, configuration, max_cutoff, else: return pairs - +@check_coords('reference', 'configuration', enforce_copy=False, + reduce_result_if_single=False, check_lengths_match=False) def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None, return_distances=True): """Search all the pairs in *reference* and *configuration* within @@ -695,13 +641,8 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, Distance between two atoms corresponding to the (i, j) indices in pairs. Only returns when ``return_distances`` is set to ``True`` - """ from .nsgrid import FastNS - if reference.shape == (3, ): - reference = reference[None, :] - if configuration.shape == (3, ): - configuration = configuration[None, :] if box is None: # create a pseudobox @@ -746,8 +687,8 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, return pairs -def self_capped_distance(reference, max_cutoff, min_cutoff=None, - box=None, method=None): +def self_capped_distance(reference, max_cutoff, min_cutoff=None, box=None, + method=None): """Finds all the pairs and respective distances within a specified cutoff for a configuration *reference* @@ -817,8 +758,8 @@ def self_capped_distance(reference, max_cutoff, min_cutoff=None, return np.asarray(pairs), np.asarray(dist) -def _determine_method_self(reference, max_cutoff, min_cutoff=None, - box=None, method=None): +def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, + method=None): """ Switch between different methods based on the the optimized time. All the rules to select the method based on the input can be @@ -864,11 +805,11 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, return methods[method] if box is None: - min_dim = np.array([reference.min(axis=0)]) - max_dim = np.array([reference.max(axis=0)]) - size = max_dim.max(axis=0) - min_dim.min(axis=0) + min_dim = np.array([reference.min(axis=0)]) + max_dim = np.array([reference.max(axis=0)]) + size = max_dim.max(axis=0) - min_dim.min(axis=0) elif np.allclose(box[3:], 90): - size = box[:3] + size = box[:3] else: tribox = triclinic_vectors(box) size = tribox.max(axis=0) - tribox.min(axis=0) @@ -880,9 +821,8 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, else: return methods['nsgrid'] - -def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, - box=None): +@check_coords('reference', enforce_copy=False, reduce_result_if_single=False) +def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, box=None): """Finds all the pairs among the *reference* coordinates within a fixed distance using brute force method @@ -900,9 +840,6 @@ def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, """ pairs, distance = [], [] - reference = np.asarray(reference, dtype=np.float32) - if reference.shape == (3, ): - reference = reference[None, :] N = len(reference) distvec = np.zeros((N*(N-1)//2), dtype=np.float64) @@ -921,9 +858,8 @@ def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, distance = distance[mask] return np.asarray(pairs), np.asarray(distance) - -def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, - box=None): +@check_coords('reference', enforce_copy=False, reduce_result_if_single=False) +def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, box=None): """Finds all the pairs among the coordinates within a fixed distance using PeriodicKDTree @@ -942,10 +878,6 @@ def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, """ from .pkdtree import PeriodicKDTree - reference = np.asarray(reference, dtype=np.float32) - if reference.shape == (3, ): - reference = reference[None, :] - pairs, distance = [], [] kdtree = PeriodicKDTree(box=box) cut = max_cutoff if box is not None else None @@ -960,8 +892,7 @@ def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, return np.asarray(pairs), np.asarray(distance) -def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, - box=None): +def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, box=None): """Finds all the pairs among the *reference* coordinates within a fixed distance using gridsearch @@ -1017,32 +948,34 @@ def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, pairs, pair_distance = pairs[idx], pair_distance[idx] return pairs, pair_distance +@check_coords('coords') +def transform_RtoS(coords, box, backend="serial"): + """Transform an array of coordinates from real space to S space (a.k.a. + lambda space) -def transform_RtoS(inputcoords, box, backend="serial"): - """Transform an array of coordinates from real space to S space (aka lambda space) + S space represents fractional space within the unit cell for this system. - S space represents fractional space within the unit cell for this system - - Reciprocal operation to :meth:`transform_StoR` + Reciprocal operation to :meth:`transform_StoR`. Parameters ---------- - inputcoords : array - A (3,) coordinate or (n x 3) array of coordinates (``dtype`` is - arbitrary, will be converted to ``dtype=numpy.float32`` internally) - box : array - The unitcell dimesions for this system. - The dimensions must be provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, - ly, lz, alpha, beta, gamma]``. + coords : numpy.ndarray + A ``(3,)`` or ``(n, 3)`` array of coordinates (dtype is arbitrary, will + be converted to ``numpy.float32`` internally). + box : numpy.ndarray + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. backend : str, optional - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- - outcoords : array - A n x 3 array of fractional coordiantes. + newcoords : numpy.ndarray + An array of dtype ``numpy.float32`` with the same shape as `coords` + containing fractional coordiantes. .. versionchanged:: 0.13.0 @@ -1050,62 +983,46 @@ def transform_RtoS(inputcoords, box, backend="serial"): .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - coords = inputcoords.astype(np.float32, order='C', copy=True) - - is_1d = False # True if only one vector coordinate - if len(coords.shape) == 1: - coords = coords.reshape(1, len(coords)) - is_1d = True - - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - elif (boxtype == 'ortho'): - box = np.array([[box[0], 0.0, 0.0], - [0.0, box[1], 0.0], - [0.0, 0.0, box[2]]], dtype=np.float32) + boxtype, box = _check_box(box) + if boxtype == 'ortho': + box = np.diag(box) # Create inverse matrix of box # need order C here inv = np.array(np.matrix(box).I, dtype=np.float32, order='C') - _run("coord_transform", - args=(coords, inv), - backend=backend) + _run("coord_transform", args=(coords, inv), backend=backend) - if is_1d: - coords = coords.reshape(len(coords[0]), ) return coords -def transform_StoR(inputcoords, box, backend="serial"): +@check_coords('coords') +def transform_StoR(coords, box, backend="serial"): """Transform an array of coordinates from S space into real space. - S space represents fractional space within the unit cell for this system + S space represents fractional space within the unit cell for this system. Reciprocal operation to :meth:`transform_RtoS` Parameters ---------- - inputcoords : array - A (3,) coordinate or (n x 3) array of coordinates (``dtype`` is - arbitrary, will be converted to ``dtype=numpy.float32`` internally) - box : array - The unitcell dimesions for this system. - The dimensions must be provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, - ly, lz, alpha, beta, gamma]``. + coords : numpy.ndarray + A ``(3,)`` or ``(n, 3)`` array of coordinates (dtype is arbitrary, will + be converted to ``numpy.float32`` internally). + box : numpy.ndarray + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. backend : str, optional - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- - outcoords : array - A n x 3 array of fractional coordiantes. + newcoords : numpy.ndarray + An array of dtype ``numpy.float32`` with the same shape as `coords` + containing real space coordiantes. .. versionchanged:: 0.13.0 @@ -1113,31 +1030,14 @@ def transform_StoR(inputcoords, box, backend="serial"): .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - coords = inputcoords.astype(np.float32, order='C', copy=True) - - is_1d = False # True if only one vector coordinate - if len(coords.shape) == 1: - coords = coords.reshape(1, len(coords)) - is_1d = True - - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - elif (boxtype == 'ortho'): - box = np.array([[box[0], 0.0, 0.0], - [0.0, box[1], 0.0], - [0.0, 0.0, box[2]]], dtype=np.float32) - - _run("coord_transform", - args=(coords, box), - backend=backend) - - if is_1d: - coords = coords.reshape(len(coords[0]),) - return coords + boxtype, box = _check_box(box) + if boxtype == 'ortho': + box = np.diag(box) + _run("coord_transform", args=(coords, box), backend=backend) + return coords +@check_coords('coords1', 'coords2', enforce_copy=False) def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): """ Calculate all distances between a pair of atoms. *atom1* and *atom2* are both @@ -1191,46 +1091,27 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - atom1 = coords1.astype(np.float32, order='C', copy=True) - atom2 = coords2.astype(np.float32, order='C', copy=True) - - _check_array(atom1, 'atom1') - _check_array(atom2, 'atom2') - _check_lengths_match(atom1, atom2) - - if box is not None: - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - - numatom = atom1.shape[0] - - if result is not None: - _check_results_array(result, (numatom,)) - distances = np.asarray(result) - else: - distances = np.zeros((numatom,), np.float64) + numatom = coords1.shape[0] + bondlengths = _check_result_array(result, (numatom,)) if box is not None: + boxtype, box = _check_box(box) if boxtype == 'ortho': _run("calc_bond_distance_ortho", - args=(atom1, atom2, box, distances), - backend=backend) + args=(coords1, coords2, box, bondlengths), + backend=backend) else: _run("calc_bond_distance_triclinic", - args=(atom1, atom2, box, distances), - backend=backend) + args=(coords1, coords2, box, bondlengths), + backend=backend) else: _run("calc_bond_distance", - args=(atom1, atom2, distances), - backend=backend) - - return distances + args=(coords1, coords2, bondlengths), + backend=backend) + return bondlengths +@check_coords('coords1', 'coords2', 'coords3', enforce_copy=False) def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="serial"): """ Calculates the angle formed between three atoms, over a list of coordinates. @@ -1285,47 +1166,27 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="seria .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - atom1 = coords1.astype(np.float32, order='C', copy=True) - atom2 = coords2.astype(np.float32, order='C', copy=True) - atom3 = coords3.astype(np.float32, order='C', copy=True) - numatom = atom1.shape[0] - - _check_array(atom1, 'coords1') - _check_array(atom2, 'coords2') - _check_array(atom3, 'coords3') - _check_lengths_match(atom1, atom2, atom3) - - if box is not None: - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - - if result is not None: - _check_results_array(result, (numatom,)) - angles = np.asarray(result) - else: - angles = np.zeros((numatom,), np.float64) + numatom = coords1.shape[0] + angles = _check_result_array(result, (numatom,)) if box is not None: + boxtype, box = _check_box(box) if boxtype == 'ortho': _run("calc_angle_ortho", - args=(atom1, atom2, atom3, box, angles), + args=(coords1, coords2, coords3, box, angles), backend=backend) else: _run("calc_angle_triclinic", - args=(atom1, atom2, atom3, box, angles), + args=(coords1, coords2, coords3, box, angles), backend=backend) else: _run("calc_angle", - args=(atom1, atom2, atom3, angles), + args=(coords1, coords2, coords3, angles), backend=backend) return angles - +@check_coords('coords1', 'coords2', 'coords3', 'coords4', enforce_copy=False) def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, backend="serial"): """ @@ -1394,75 +1255,49 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - atom1 = coords1.astype(np.float32, order='C', copy=True) - atom2 = coords2.astype(np.float32, order='C', copy=True) - atom3 = coords3.astype(np.float32, order='C', copy=True) - atom4 = coords4.astype(np.float32, order='C', copy=True) - - _check_array(atom1, 'atom1') - _check_array(atom2, 'atom2') - _check_array(atom3, 'atom3') - _check_array(atom4, 'atom4') - _check_lengths_match(atom1, atom2, atom3, atom4) - - numatom = atom1.shape[0] - - if box is not None: - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if (boxtype == 'tri_box'): - box = triclinic_vectors(box) - if (boxtype == 'tri_vecs_bad'): - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - - if result is not None: - _check_results_array(result, (numatom,)) - angles = np.asarray(result) - else: - angles = np.zeros((numatom,), np.float64) + numatom = coords1.shape[0] + dihedrals = _check_result_array(result, (numatom,)) if box is not None: + boxtype, box = _check_box(box) if boxtype == 'ortho': _run("calc_dihedral_ortho", - args=(atom1, atom2, atom3, atom4, box, angles), - backend=backend) + args=(coords1, coords2, coords3, coords4, box, dihedrals), + backend=backend) else: _run("calc_dihedral_triclinic", - args=(atom1, atom2, atom3, atom4, box, angles), - backend=backend) + args=(coords1, coords2, coords3, coords4, box, dihedrals), + backend=backend) else: _run("calc_dihedral", - args=(atom1, atom2, atom3, atom4, angles), - backend=backend) - - return angles + args=(coords1, coords2, coords3, coords4, dihedrals), + backend=backend) + return dihedrals -def apply_PBC(incoords, box, backend="serial"): - """Moves a set of coordinates to all be within the primary unit cell - - newcoords = apply_PBC(coords, box) +@check_coords('coords') +def apply_PBC(coords, box, backend="serial"): + """Moves coordinates into the primary unit cell. Parameters ---------- - incoords : numpy.ndarray - Coordinate array of shape ``(n, 3)`` (``dtype`` is arbitrary, will be - converted to ``dtype=numpy.float32`` internally) - box : array - The unitcell dimesions for this system; can be either orthogonal or - triclinic information. The dimensions must be provided in the same - format as returned by - :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, ly, lz, - alpha, beta, gamma]``. - backend : str - Select the type of acceleration; ``"serial"`` is always available. Other - possibilities are ``"OpenMP"`` (OpenMP). + coords : numpy.ndarray + Coordinate array of shape ``(n, 3)`` (dtype is arbitrary, will be + converted to ``numpy.float32`` internally). + box : numpy.ndarray + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + backend : str, optional + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- - newcoords : numpy.ndarray(dtype=numpy.float32) - Coordinates that are now all within the primary unit cell, as defined - by box. + newcoords : numpy.ndarray + Array of dtype ``numpy.float32`` containing coordinates that all lie + within the primary unit cell as defined by `box`. .. versionadded:: 0.8 @@ -1471,35 +1306,13 @@ def apply_PBC(incoords, box, backend="serial"): .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. """ - coords = incoords.astype(np.float32, order='C', copy=True) - - _check_array(coords, 'coords') - - coordnum = coords.shape[0] - - # determine boxtype - boxtype = _box_check(box) - # Convert [A,B,C,alpha,beta,gamma] to [[A],[B],[C]] - if boxtype == 'tri_box': - box = triclinic_vectors(box) - if boxtype == 'tri_vecs_bad': - box = triclinic_vectors(triclinic_box(box[0], box[1], box[2])) - - box_inv = np.zeros((3), dtype=np.float32) + boxtype, box = _check_box(box) if boxtype == 'ortho': - box_inv[0] = 1.0 / box[0] - box_inv[1] = 1.0 / box[1] - box_inv[2] = 1.0 / box[2] - _run("ortho_pbc", - args=(coords, box, box_inv), - backend=backend) + box_inv = box ** (-1) + _run("ortho_pbc", args=(coords, box, box_inv), backend=backend) else: - box_inv[0] = 1.0 / box[0][0] - box_inv[1] = 1.0 / box[1][1] - box_inv[2] = 1.0 / box[2][2] - _run("triclinic_pbc", - args=(coords, box, box_inv), - backend=backend) + box_inv = np.diagonal(box) ** (-1) + _run("triclinic_pbc", args=(coords, box, box_inv), backend=backend) return coords @@ -1517,7 +1330,7 @@ def calc_distance(a, b, box=None): .. versionadded:: 0.18.1 """ - return calc_bonds(a[None, :], b[None, :], box=box)[0] + return calc_bonds(a, b, box=box) def calc_angle(a, b, c, box=None): @@ -1534,7 +1347,7 @@ def calc_angle(a, b, c, box=None): .. versionadded:: 0.18.1 """ - return np.rad2deg(calc_angles(a[None, :], b[None, :], c[None, :], box=box)[0]) + return np.rad2deg(calc_angles(a, b, c, box=box)) def calc_dihedral(a, b, c, d, box=None): @@ -1550,5 +1363,4 @@ def calc_dihedral(a, b, c, d, box=None): .. versionadded:: 0.18.1 """ - return np.rad2deg( - calc_dihedrals(a[None, :], b[None, :], c[None, :], d[None, :], box)[0]) + return np.rad2deg(calc_dihedrals(a, b, c, d, box)) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 97222e2d9aa..6ace6e38494 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -72,7 +72,6 @@ not reflect in the results. .. versionadded:: 0.19.0 """ -from MDAnalysis.lib.distances import _check_array # Used to handle memory allocation from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free from libc.math cimport sqrt @@ -766,14 +765,15 @@ cdef class FastNS(object): from MDAnalysis.lib.mdamath import triclinic_vectors - - _check_array(coords, 'coords') + if (coords.ndim != 2 or coords.shape[1] != 3): + raise ValueError("coords must have a shape of (n, 3), got {}." + "".format(coords.shape)) if np.allclose(box[:3], 0.0): raise ValueError("Any of the box dimensions cannot be 0") self.periodic = pbc - self.coords = coords.copy() + self.coords = coords.astype(np.float32, order='C', copy=True) if box.shape != (3, 3): box = triclinic_vectors(box) @@ -850,10 +850,13 @@ cdef class FastNS(object): cdef real cutoff2 = self.cutoff * self.cutoff cdef ns_int npairs = 0 - _check_array(search_coords, 'search_coords') + + if (search_coords.ndim != 2 or search_coords.shape[1] != 3): + raise ValueError("search_coords must have a shape of (n, 3), got " + "{}.".format(search_coords.shape)) # Generate another grid to search - searchcoords = np.ascontiguousarray(search_coords, dtype=np.float32) + searchcoords = search_coords.astype(np.float32, order='C', copy=False) searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) searchgrid.fill_grid(searchcoords_bbox) diff --git a/package/MDAnalysis/lib/util.py b/package/MDAnalysis/lib/util.py index 14f257e3792..c6034321493 100644 --- a/package/MDAnalysis/lib/util.py +++ b/package/MDAnalysis/lib/util.py @@ -109,7 +109,7 @@ .. autofunction:: asiterable .. autofunction:: hasmethod .. autoclass:: Namespace -.. autofunction:: unique_int_1d +.. autofunction:: unique_int_1d(values) File parsing ------------ @@ -118,7 +118,6 @@ :members: .. autodata:: FORTRAN_format_regex - Data manipulation and handling ------------------------------ @@ -132,12 +131,17 @@ .. autofunction:: parse_residue .. autofunction:: conv_float - Class decorators ---------------- .. autofunction:: cached +Function decorators +------------------- + +.. autofunction:: static_variables +.. autofunction:: warn_if_not_unique +.. autofunction:: check_coords Code management --------------- @@ -158,8 +162,6 @@ order to make :meth:`NamedStream.close` actually close the underlying stream and ``NamedStream.close(force=True)`` will also close it. - - """ from __future__ import division, absolute_import import six @@ -1576,28 +1578,29 @@ def unique_rows(arr, return_index=False): def blocks_of(a, n, m): - """Extract a view of (n, m) blocks along the diagonal of the array `a` + """Extract a view of ``(n, m)`` blocks along the diagonal of the array `a`. Parameters ---------- - a : array_like - starting array + a : numpy.ndarray + Input array, must be C contiguous and at least 2D. n : int - size of block in first dimension + Size of block in first dimension. m : int - size of block in second dimension + Size of block in second dimension. Returns ------- - (nblocks, n, m) : tuple - view of the original array, where nblocks is the number of times the - miniblock fits in the original. + view : numpy.ndarray + A view of the original array with shape ``(nblocks, n, m)``, where + ``nblocks`` is the number of times the miniblocks of shape ``(n, m)`` + fit in the original. Raises ------ ValueError If the supplied `n` and `m` don't divide `a` into an integer number - of blocks. + of blocks or if `a` is not C contiguous. Examples -------- @@ -1612,9 +1615,11 @@ def blocks_of(a, n, m): Notes ----- - n, m must divide a into an identical integer number of blocks. + `n`, `m` must divide `a` into an identical integer number of blocks. Please + note that if the block size is larger than the input array, this number will + be zero, resulting in an empty view! - Uses strides so probably requires that the array is C contiguous. + Uses strides and therefore requires that the array is C contiguous. Returns a view, so editing this modifies the original array. @@ -1625,6 +1630,8 @@ def blocks_of(a, n, m): # based on: # http://stackoverflow.com/a/10862636 # but generalised to handle non square blocks. + if not a.flags['C_CONTIGUOUS']: + raise ValueError("Input array is not C contiguous.") nblocks = a.shape[0] // n nblocks2 = a.shape[1] // m @@ -1735,11 +1742,11 @@ def static_variables(**kwargs): Example ------- - >>> @static(msg='foo calls', calls=0) - >>> def foo(): - >>> foo.calls += 1 - >>> print("{}: {}".format(foo.msg, foo.calls)) - >>> + >>> @static_variables(msg='foo calls', calls=0) + ... def foo(): + ... foo.calls += 1 + ... print("{}: {}".format(foo.msg, foo.calls)) + ... >>> foo() foo calls: 1 >>> foo() @@ -1747,7 +1754,7 @@ def static_variables(**kwargs): .. note:: Based on https://stackoverflow.com/a/279586 - by user `Claudiu` + by `Claudiu `_ .. versionadded:: 0.19.0 """ @@ -1773,12 +1780,21 @@ def static_decorator(func): @static_variables(warned=False) def warn_if_not_unique(groupmethod): - """Decorator triggering a :class:`DuplicateWarning` if the underlying group - is not unique. + """Decorator triggering a :class:`~MDAnalysis.exceptions.DuplicateWarning` + if the underlying group is not unique. - Assures that during execution of the decorated method, only the first of + Assures that during execution of the decorated method only the first of potentially multiple warnings concerning the uniqueness of groups is shown. + Raises + ------ + :class:`~MDAnalysis.exceptions.DuplicateWarning` + If the :class:`~MDAnalysis.core.groups.AtomGroup`, + :class:`~MDAnalysis.core.groups.ResidueGroup`, or + :class:`~MDAnalysis.core.groups.SegmentGroup` of which the decorated + method is a member contains duplicates. + + .. versionadded:: 0.19.0 """ @wraps(groupmethod) @@ -1817,6 +1833,198 @@ def wrapper(group, *args, **kwargs): return wrapper +def check_coords(*coord_names, **options): + """Decorator for automated coordinate array checking. + + This decorator is intended for use especially in + :mod:`MDAnalysis.lib.distances`. + It takes an arbitrary number of positional arguments which must correspond + to names of positional arguments of the decorated function. + It then checks if the corresponding values are valid coordinate arrays. + If all these arrays are single coordinates (i.e., their shape is ``(3,)``), + the decorated function can optionally return a single coordinate (or angle) + instead of an array of coordinates (or angles). This can be used to enable + computations of single observables using functions originally designed to + accept only 2-d coordinate arrays. + + The checks performed on each individual coordinate array are: + + * Check that coordinate arrays are of type :class:`numpy.ndarray`. + * Check that coordinate arrays have a shape of ``(n, 3)`` (or ``(3,)`` if + single coordinates are allowed; see keyword argument `allow_single`). + * Automatic dtype conversion to ``numpy.float32``. + * Optional replacement by a copy; see keyword argument `enforce_copy` . + * If coordinate arrays aren't C-contiguous, they will be automatically + replaced by a C-contiguous copy. + * Optional check for equal length of all coordinate arrays; see optional + keyword argument `check_lengths_match`. + + Parameters + ---------- + *coord_names : tuple + Arbitrary number of strings corresponding to names of positional + arguments of the decorated function. + **options : dict, optional + * **enforce_copy** (:class:`bool`, optional) -- Enforce working on a + copy of the coordinate arrays. This is useful to ensure that the input + arrays are left unchanged. Default: ``True`` + * **allow_single** (:class:`bool`, optional) -- Allow the input + coordinate array to be a single coordinate with shape ``(3,)``. + * **convert_single** (:class:`bool`, optional) -- If ``True``, single + coordinate arrays will be converted to have a shape of ``(1, 3)``. + Only has an effect if `allow_single` is ``True``. Default: ``True`` + * **reduce_result_if_single** (:class:`bool`, optional) -- If ``True`` + and *all* input coordinates are single, a decorated function ``func`` + will return ``func()[0]`` instead of ``func()``. Only has an effect if + `allow_single` is ``True``. Default: ``True`` + * **check_lengths_match** (:class:`bool`, optional) -- If ``True``, a + :class:`ValueError` is raised if not all coordinate arrays contain the + same number of coordinates. Default: ``True`` + + Raises + ------ + ValueError + If the decorator is used without positional arguments (for development + purposes only). + + If any of the positional arguments supplied to the decorator doesn't + correspond to a name of any of the decorated function's positional + arguments. + + If any of the coordinate arrays has a wrong shape. + TypeError + If any of the coordinate arrays is not a :class:`numpy.ndarray`. + + If the dtype of any of the coordinate arrays is not convertible to + ``numpy.float32``. + + Example + ------- + + >>> @check_coords('coords1', 'coords2') + ... def coordsum(coords1, coords2): + ... assert coords1.dtype == np.float32 + ... assert coords2.flags['C_CONTIGUOUS'] + ... return coords1 + coords2 + ... + >>> # automatic dtype conversion: + >>> coordsum(np.zeros(3, dtype=np.int64), np.ones(3)) + array([1., 1., 1.], dtype=float32) + >>> + >>> # automatic handling of non-contiguous arrays: + >>> coordsum(np.zeros(3), np.ones(6)[::2]) + array([1., 1., 1.], dtype=float32) + >>> + >>> # automatic shape checking: + >>> coordsum(np.zeros(3), np.ones(6)) + ValueError: coordsum(): coords2.shape must be (3,) or (n, 3), got (6,). + + + .. versionadded:: 0.19.0 + """ + enforce_copy = options.get('enforce_copy', True) + allow_single = options.get('allow_single', True) + convert_single = options.get('convert_single', True) + reduce_result_if_single = options.get('reduce_result_if_single', True) + check_lengths_match = options.get('check_lengths_match', + len(coord_names) > 1) + if not coord_names: + raise ValueError("Decorator check_coords() cannot be used without " + "positional arguments.") + def check_coords_decorator(func): + fname = func.__name__ + code = func.__code__ + argnames = code.co_varnames + nargs = len(code.co_varnames) + ndefaults = len(func.__defaults__) if func.__defaults__ else 0 + # Create a tuple of positional argument names: + nposargs = code.co_argcount - ndefaults + posargnames = argnames[:nposargs] + # The check_coords() decorator is designed to work only for positional + # arguments: + for name in coord_names: + if name not in posargnames: + raise ValueError("In decorator check_coords(): Name '{}' " + "doesn't correspond to any positional " + "argument of the decorated function {}()." + "".format(name, func.__name__)) + + def _check_coords(coords, argname): + if not isinstance(coords, np.ndarray): + raise TypeError("{}(): Parameter '{}' must be a numpy.ndarray, " + "got {}.".format(fname, argname, type(coords))) + is_single = False + if allow_single: + if (coords.ndim not in (1, 2)) or (coords.shape[-1] != 3): + raise ValueError("{}(): {}.shape must be (3,) or (n, 3), " + "got {}.".format(fname, argname, + coords.shape)) + if coords.ndim == 1: + is_single = True + if convert_single: + coords = coords[None, :] + else: + if (coords.ndim != 2) or (coords.shape[1] != 3): + raise ValueError("{}(): {}.shape must be (n, 3), got {}." + "".format(fname, argname, coords.shape)) + try: + coords = coords.astype(np.float32, order='C', copy=enforce_copy) + except ValueError: + raise TypeError("{}(): {}.dtype must be convertible to float32," + " got {}.".format(fname, argname, coords.dtype)) + return coords, is_single + + @wraps(func) + def wrapper(*args, **kwargs): + # Check for invalid function call: + if len(args) != nposargs: + # set marker for testing purposes: + wrapper._invalid_call = True + if len(args) > nargs: + # too many arguments, invoke call: + return func(*args, **kwargs) + for name in posargnames[:len(args)]: + if name in kwargs: + # duplicate argument, invoke call: + return func(*args, **kwargs) + for name in posargnames[len(args):]: + if name not in kwargs: + # missing argument, invoke call: + return func(*args, **kwargs) + for name in kwargs: + if name not in argnames: + # unexpected kwarg, invoke call: + return func(*args, **kwargs) + # call is valid, unset test marker: + wrapper._invalid_call = False + args = list(args) + ncoords = [] + all_single = allow_single + for name in coord_names: + idx = posargnames.index(name) + if idx < len(args): + args[idx], is_single = _check_coords(args[idx], name) + all_single &= is_single + ncoords.append(args[idx].shape[0]) + else: + kwargs[name], is_single = _check_coords(kwargs[name], + name) + all_single &= is_single + ncoords.append(kwargs[name].shape[0]) + if check_lengths_match and ncoords: + if ncoords.count(ncoords[0]) != len(ncoords): + raise ValueError("{}(): {} must contain the same number of " + "coordinates, got {}." + "".format(fname, ", ".join(coord_names), + ncoords)) + # If all input coordinate arrays were 1-d, so should be the output: + if all_single and reduce_result_if_single: + return func(*args, **kwargs)[0] + return func(*args, **kwargs) + return wrapper + return check_coords_decorator + + #------------------------------------------------------------------ # # our own deprecate function, derived from numpy (see diff --git a/testsuite/MDAnalysisTests/analysis/test_distances.py b/testsuite/MDAnalysisTests/analysis/test_distances.py index 779b8c401fa..9db91587bbf 100644 --- a/testsuite/MDAnalysisTests/analysis/test_distances.py +++ b/testsuite/MDAnalysisTests/analysis/test_distances.py @@ -51,7 +51,7 @@ def coord(): @staticmethod @pytest.fixture() def box(): - return np.array([10, 10, 10], dtype=np.float32) + return np.array([10, 10, 10, 90, 90, 90], dtype=np.float32) @staticmethod @pytest.fixture() diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index e1c7e115cd1..7b5029e2799 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -1250,7 +1250,7 @@ def test_packintobox(self, universe): u.trajectory.rewind() # just to make sure... ag = u.atoms[1000:2000:200] # Provide arbitrary box - box = np.array([5., 5., 5.], dtype=np.float32) + box = np.array([5., 5., 5., 90., 90., 90.], dtype=np.float32) # Expected folded coordinates packed_coords = np.array([[3.94543672, 2.5939188, 2.73179913], [3.21632767, 0.879035, 0.32085133], diff --git a/testsuite/MDAnalysisTests/lib/test_augment.py b/testsuite/MDAnalysisTests/lib/test_augment.py index 216ccfed16d..f80bce934e8 100644 --- a/testsuite/MDAnalysisTests/lib/test_augment.py +++ b/testsuite/MDAnalysisTests/lib/test_augment.py @@ -83,8 +83,8 @@ def test_augment(b, q, res): aug = np.sort(aug, axis=0) else: aug = list() - cs = transform_StoR(np.array(res, dtype=np.float32), b) - if cs.size > 0: + if len(res) > 0: + cs = transform_StoR(np.array(res, dtype=np.float32), b) cs = np.sort(cs, axis=0) else: cs = list() diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index ccb96e127ec..46ae02aa018 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -27,6 +27,90 @@ import MDAnalysis as mda + +class TestCheckBox(object): + + prec = 6 + ref_ortho = np.ones(3, dtype=np.float32) + ref_tri_vecs = np.array([[1, 0, 0], [0, 1, 0], [0, 2 ** 0.5, 2 ** 0.5]], + dtype=np.float32) + + @pytest.mark.parametrize('box', + ([1, 1, 1, 90, 90, 90], + (1, 1, 1, 90, 90, 90), + ['1', '1', 1, 90, '90', '90'], + ('1', '1', 1, 90, '90', '90'), + np.array(['1', '1', 1, 90, '90', '90']), + np.array([1, 1, 1, 90, 90, 90], dtype=np.float32), + np.array([1, 1, 1, 90, 90, 90], dtype=np.float64), + np.array([1, 1, 1, 1, 1, 1, 90, 90, 90, 90, 90, 90], + dtype=np.float32)[::2])) + def test_ckeck_box_ortho(self, box): + boxtype, checked_box = mda.lib.distances._check_box(box) + assert boxtype == 'ortho' + assert_equal(checked_box, self.ref_ortho) + assert checked_box.dtype == np.float32 + assert checked_box.flags['C_CONTIGUOUS'] + + @pytest.mark.parametrize('box', + ([1, 1, 2, 45, 90, 90], + (1, 1, 2, 45, 90, 90), + ['1', '1', 2, 45, '90', '90'], + ('1', '1', 2, 45, '90', '90'), + np.array(['1', '1', 2, 45, '90', '90']), + np.array([1, 1, 2, 45, 90, 90], dtype=np.float32), + np.array([1, 1, 2, 45, 90, 90], dtype=np.float64), + np.array([1, 1, 1, 1, 2, 2, 45, 45, 90, 90, 90, 90], + dtype=np.float32)[::2])) + def test_check_box_tri_vecs(self, box): + boxtype, checked_box = mda.lib.distances._check_box(box) + assert boxtype == 'tri_vecs' + assert_almost_equal(checked_box, self.ref_tri_vecs, self.prec) + assert checked_box.dtype == np.float32 + assert checked_box.flags['C_CONTIGUOUS'] + + def test_check_box_wrong_data(self): + with pytest.raises(ValueError): + wrongbox = ['invalid', 1, 1, 90, 90, 90] + boxtype, checked_box = mda.lib.distances._check_box(wrongbox) + + def test_check_box_wrong_shape(self): + with pytest.raises(ValueError): + wrongbox = np.ones((3, 3), dtype=np.float32) + boxtype, checked_box = mda.lib.distances._check_box(wrongbox) + + +class TestCheckResultArray(object): + + ref = np.zeros(1, dtype=np.float64) + + def test_check_result_array_pass(self): + # Assert input array is returned if it has correct shape and dtype: + res = mda.lib.distances._check_result_array(self.ref, self.ref.shape) + assert res is self.ref + # Assert correct array is returned if input is None: + res = mda.lib.distances._check_result_array(None, self.ref.shape) + assert_equal(res, self.ref) + assert res.dtype == np.float64 + + def test_check_result_array_wrong_shape(self): + wrong_shape = (1,) + self.ref.shape + with pytest.raises(ValueError) as err: + res = mda.lib.distances._check_result_array(self.ref, wrong_shape) + assert err.msg == ("Result array has incorrect shape, should be " + "{0}, got {1}.".format(self.ref.shape, + wrong_shape)) + + def test_check_result_array_wrong_dtype(self): + wrong_dtype = np.int64 + ref_wrong_dtype = self.ref.astype(wrong_dtype) + with pytest.raises(TypeError) as err: + res = mda.lib.distances._check_result_array(ref_wrong_dtype, + self.ref.shape) + assert err.msg == ("Result array must be of type numpy.float64, " + "got {}.".format(wrong_dtype)) + + @pytest.mark.parametrize('coord_dtype', (np.float32, np.float64)) def test_transform_StoR_pass(coord_dtype): box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) diff --git a/testsuite/MDAnalysisTests/lib/test_util.py b/testsuite/MDAnalysisTests/lib/test_util.py index 2d9d584e5d5..0b1f6343767 100644 --- a/testsuite/MDAnalysisTests/lib/test_util.py +++ b/testsuite/MDAnalysisTests/lib/test_util.py @@ -36,7 +36,8 @@ import MDAnalysis as mda import MDAnalysis.lib.util as util import MDAnalysis.lib.mdamath as mdamath -from MDAnalysis.lib.util import cached, static_variables, warn_if_not_unique +from MDAnalysis.lib.util import (cached, static_variables, warn_if_not_unique, + check_coords) from MDAnalysis.core.topologyattrs import Bonds from MDAnalysis.exceptions import NoDataError, DuplicateWarning @@ -970,8 +971,6 @@ def test_blocks_of_1(self): view = util.blocks_of(arr, 1, 1) - # should return a (4, 1, 1) view - # ie 4 lots of 1x1 assert view.shape == (4, 1, 1) assert_array_almost_equal(view, np.array([[[0]], [[5]], [[10]], [[15]]])) @@ -990,7 +989,6 @@ def test_blocks_of_2(self): view = util.blocks_of(arr, 2, 2) - # should return (2, 2, 2) assert view.shape == (2, 2, 2) assert_array_almost_equal(view, np.array([[[0, 1], [4, 5]], [[10, 11], [14, 15]]])) @@ -1012,10 +1010,20 @@ def test_blocks_of_3(self): assert view.shape == (4, 2, 1) + def test_blocks_of_4(self): + # testing block exceeding array size results in empty view + arr = np.arange(4).reshape(2, 2) + view = util.blocks_of(arr, 3, 3) + assert view.shape == (0, 3, 3) + view[:] = 100 + assert_array_equal(arr, np.arange(4).reshape(2, 2)) + def test_blocks_of_ValueError(self): arr = np.arange(16).reshape(4, 4) with pytest.raises(ValueError): - util.blocks_of(arr, 2, 1) + util.blocks_of(arr, 2, 1) # blocks don't fit + with pytest.raises(ValueError): + util.blocks_of(arr[:, ::2], 2, 1) # non-contiguous input class TestNamespace(object): @@ -1326,6 +1334,265 @@ def func(group): assert not w.list assert len(record) == 0 +class TestCheckCoords(object): + """Tests concerning the decorator @check_coords + """ + + prec = 6 + + def test_default_options(self): + a_in = np.zeros(3, dtype=np.float32) + b_in = np.ones(3, dtype=np.float32) + b_in2 = np.ones((2, 3), dtype=np.float32) + + @check_coords('a','b') + def func(a, b): + # check that enforce_copy is True by default: + assert a is not a_in + assert b is not b_in + # check that convert_single is True by default: + assert a.shape == (1, 3) + assert b.shape == (1, 3) + return a + b + + # check that allow_single is True by default: + res = func(a_in, b_in) + # check that reduce_result_if_single is True by default: + assert res.shape == (3,) + # check correct function execution: + assert_array_equal(res, b_in) + + # check that check_lenghts_match is True by default: + with pytest.raises(ValueError): + res = func(a_in, b_in2) + + def test_enforce_copy(self): + + a_2d = np.ones((1, 3), dtype=np.float32) + b_1d = np.zeros(3, dtype=np.float32) + c_2d = np.zeros((1, 6), dtype=np.float32)[:, ::2] + d_2d = np.zeros((1, 3), dtype=np.int64) + + @check_coords('a', 'b', 'c', 'd', enforce_copy=False) + def func(a, b, c, d): + # Assert that if enforce_copy is False: + # no copy is made if input shape, order, and dtype are correct: + assert a is a_2d + # a copy is made if input shape has to be changed: + assert b is not b_1d + # a copy is made if input order has to be changed: + assert c is not c_2d + # a copy is made if input dtype has to be changed: + assert d is not d_2d + # Assert correct dtype conversion: + assert d.dtype == np.float32 + assert_almost_equal(d, d_2d, self.prec) + # Assert all shapes are converted to (1, 3): + assert a.shape == b.shape == c.shape == d.shape == (1, 3) + return a + b + c + d + + # Call func() to: + # - test the above assertions + # - ensure that input of single coordinates is simultaneously possible + # with different shapes (3,) and (1, 3) + res = func(a_2d, b_1d, c_2d, d_2d) + # Since some inputs are not 1d, even though reduce_result_if_single is + # True, the result must have shape (1, 3): + assert res.shape == (1, 3) + # check correct function execution: + assert_array_equal(res, a_2d) + + def test_no_allow_single(self): + + @check_coords('a', allow_single=False) + def func(a): + pass + + with pytest.raises(ValueError) as err: + func(np.zeros(3, dtype=np.float32)) + assert err.msg == ("func(): a.shape must be (n, 3), got (3,).") + + def test_no_convert_single(self): + + a_1d = np.arange(-3, 0, dtype=np.float32) + + @check_coords('a', enforce_copy=False, convert_single=False) + def func(a): + # assert no conversion and no copy were performed: + assert a is a_1d + return a + + res = func(a_1d) + # Assert result has been reduced: + assert res == a_1d[0] + assert type(res) is np.float32 + + def test_no_reduce_result_if_single(self): + + a_1d = np.zeros(3, dtype=np.float32) + + # Test without shape conversion: + @check_coords('a', enforce_copy=False, convert_single=False, + reduce_result_if_single=False) + def func(a): + return a + + res = func(a_1d) + # make sure the input array is just passed through: + assert res is a_1d + + # Test with shape conversion: + @check_coords('a', enforce_copy=False, reduce_result_if_single=False) + def func(a): + return a + + res = func(a_1d) + assert res.shape == (1, 3) + assert_array_equal(res[0], a_1d) + + def test_no_check_lengths_match(self): + + a_2d = np.zeros((1, 3), dtype=np.float32) + b_2d = np.zeros((3, 3), dtype=np.float32) + + @check_coords('a', 'b', enforce_copy=False, check_lengths_match=False) + def func(a, b): + return a, b + + res_a, res_b = func(a_2d, b_2d) + # Assert arrays are just passed through: + assert res_a is a_2d + assert res_b is b_2d + + def test_invalid_input(self): + + a_inv_dtype = np.array([['hello', 'world', '!']]) + a_inv_type = [[0., 0., 0.]] + a_inv_shape_1d = np.zeros(6, dtype=np.float32) + a_inv_shape_2d = np.zeros((3, 2), dtype=np.float32) + + @check_coords('a') + def func(a): + pass + + with pytest.raises(TypeError) as err: + func(a_inv_dtype) + assert err.msg.startswith("func(): a.dtype must be convertible to " + "float32, got ") + + with pytest.raises(TypeError) as err: + func(a_inv_type) + assert err.msg == ("func(): Parameter 'a' must be a numpy.ndarray, " + "got .") + + with pytest.raises(ValueError) as err: + func(a_inv_shape_1d) + assert err.msg == ("func(): a.shape must be (3,) or (n, 3), got " + "(6,).") + + with pytest.raises(ValueError) as err: + func(a_inv_shape_2d) + assert err.msg == ("func(): a.shape must be (3,) or (n, 3), got " + "(3, 2).") + + def test_usage_with_kwargs(self): + + a_2d = np.zeros((1, 3), dtype=np.float32) + + @check_coords('a', enforce_copy=False) + def func(a, b, c=0): + return a, b, c + + # check correct functionality if passed as keyword argument: + a, b, c = func(a=a_2d, b=0, c=1) + assert a is a_2d + assert b == 0 + assert c == 1 + + def test_wrong_func_call(self): + + @check_coords('a', enforce_copy=False) + def func(a, b, c=0): + pass + + # Make sure invalid call marker is present: + func._invalid_call = False + + # usage with posarg doubly defined: + assert not func._invalid_call + with pytest.raises(TypeError): + func(0, a=0) # pylint: disable=redundant-keyword-arg + assert func._invalid_call + func._invalid_call = False + + # usage with missing posargs: + assert not func._invalid_call + with pytest.raises(TypeError): + func(0) + assert func._invalid_call + func._invalid_call = False + + # usage with missing posargs (supplied as kwargs): + assert not func._invalid_call + with pytest.raises(TypeError): + func(a=0, c=1) + assert func._invalid_call + func._invalid_call = False + + # usage with too many posargs: + assert not func._invalid_call + with pytest.raises(TypeError): + func(0, 0, 0, 0) + assert func._invalid_call + func._invalid_call = False + + # usage with unexpected kwarg: + assert not func._invalid_call + with pytest.raises(TypeError): + func(a=0, b=0, c=1, d=1) # pylint: disable=unexpected-keyword-arg + assert func._invalid_call + func._invalid_call = False + + def test_wrong_decorator_usage(self): + + # usage without parantheses: + @check_coords + def func(): + pass + + with pytest.raises(TypeError): + func() + + # usage without arguments: + with pytest.raises(ValueError) as err: + @check_coords() + def func(): + pass + + assert err.msg == ("Decorator check_coords() cannot be used " + "without positional arguments.") + + # usage with defaultarg: + with pytest.raises(ValueError) as err: + @check_coords('a') + def func(a=1): + pass + + assert err.msg == ("In decorator check_coords(): Name 'a' doesn't " + "correspond to any positional argument of the " + "decorated function func().") + + # usage with invalid parameter name: + with pytest.raises(ValueError) as err: + @check_coords('b') + def func(a): + pass + + assert err.msg == ("In decorator check_coords(): Name 'b' doesn't " + "correspond to any positional argument of the " + "decorated function func().") + + @pytest.mark.parametrize("old_name", (None, "MDAnalysis.Universe")) @pytest.mark.parametrize("new_name", (None, "Multiverse")) @pytest.mark.parametrize("remove", (None, "99.0.0", 2099)) diff --git a/testsuite/MDAnalysisTests/utils/test_distances.py b/testsuite/MDAnalysisTests/utils/test_distances.py index fa57a16d0ac..b5b7f6c0f99 100644 --- a/testsuite/MDAnalysisTests/utils/test_distances.py +++ b/testsuite/MDAnalysisTests/utils/test_distances.py @@ -33,7 +33,7 @@ @pytest.fixture() def ref_system(): - box = np.array([1., 1., 2.], dtype=np.float32) + box = np.array([1., 1., 2., 90., 90., 90], dtype=np.float32) points = np.array( [ [0, 0, 0], [1, 1, 2], [1, 0, 2], # identical under PBC @@ -75,13 +75,13 @@ def test_PBC(self, backend, ref_system): def test_PBC2(self, backend): a = np.array([7.90146923, -13.72858524, 3.75326586], dtype=np.float32) b = np.array([-1.36250901, 13.45423985, -0.36317623], dtype=np.float32) - box = np.array([5.5457325, 5.5457325, 5.5457325], dtype=np.float32) + box = np.array([5.5457325, 5.5457325, 5.5457325, 90., 90., 90.], dtype=np.float32) def mindist(a, b, box): x = a - b return np.linalg.norm(x - np.rint(x / box) * box) - ref = mindist(a, b, box) + ref = mindist(a, b, box[:3]) val = MDAnalysis.lib.distances.distance_array(np.array([a]), np.array([b]), box=box, backend=backend)[0, 0] @@ -217,13 +217,13 @@ def TRIC(): @staticmethod @pytest.fixture() - def box(TRIC): + def tri_vec_box(TRIC): return MDAnalysis.coordinates.core.triclinic_vectors(TRIC.dimensions) @staticmethod @pytest.fixture() - def boxV(box): - return MDAnalysis.coordinates.core.triclinic_box(box[0], box[1], box[2]) + def box(TRIC): + return TRIC.dimensions @staticmethod @pytest.fixture() @@ -233,32 +233,36 @@ def S_mol(TRIC): return S_mol1, S_mol2 - def test_transforms(self, S_mol, box, boxV, backend): + @staticmethod + @pytest.fixture() + def S_mol_single(TRIC): + S_mol1 = TRIC.atoms[383].position + S_mol2 = TRIC.atoms[390].position + return S_mol1, S_mol2 + + @pytest.mark.parametrize('S_mol', [S_mol, S_mol_single], indirect=True) + def test_transforms(self, S_mol, tri_vec_box, box, backend): from MDAnalysis.lib.distances import transform_StoR, transform_RtoS # To check the cython coordinate transform, the same operation is done in numpy - # Is a matrix multiplication of Coords x Box = NewCoords, so can use np.dot + # Is a matrix multiplication of Coords x tri_vec_box = NewCoords, so can use np.dot S_mol1, S_mol2 = S_mol # Test transformation R_mol1 = transform_StoR(S_mol1, box, backend=backend) - R_np1 = np.dot(S_mol1, box) - - # Test transformation when given box in different form - R_mol2 = transform_StoR(S_mol2, boxV, backend=backend) - R_np2 = np.dot(S_mol2, box) + R_np1 = np.dot(S_mol1, tri_vec_box) + R_mol2 = transform_StoR(S_mol2, box, backend=backend) + R_np2 = np.dot(S_mol2, tri_vec_box) - assert_almost_equal(R_mol1, R_np1, self.prec, err_msg="StoR transform failed with box") - assert_almost_equal(R_mol2, R_np2, self.prec, err_msg="StoR transform failed with boxV") + assert_almost_equal(R_mol1, R_np1, self.prec, err_msg="StoR transform failed for S_mol1") + assert_almost_equal(R_mol2, R_np2, self.prec, err_msg="StoR transform failed for S_mol2") # Round trip test - # boxV here althought initial transform with box - S_test1 = transform_RtoS(R_mol1, boxV, backend=backend) - # and vice versa, should still work + S_test1 = transform_RtoS(R_mol1, box, backend=backend) S_test2 = transform_RtoS(R_mol2, box, backend=backend) - assert_almost_equal(S_test1, S_mol1, self.prec, err_msg="Round trip failed in transform") - assert_almost_equal(S_test2, S_mol2, self.prec, err_msg="Round trip failed in transform") + assert_almost_equal(S_test1, S_mol1, self.prec, err_msg="Round trip 1 failed in transform") + assert_almost_equal(S_test2, S_mol2, self.prec, err_msg="Round trip 2 failed in transform") - def test_selfdist(self, S_mol, box, boxV, backend): + def test_selfdist(self, S_mol, box, tri_vec_box, backend): from MDAnalysis.lib.distances import self_distance_array from MDAnalysis.lib.distances import transform_StoR @@ -273,9 +277,9 @@ def test_selfdist(self, S_mol, box, boxV, backend): for i, Ri in enumerate(R_coords): for Rj in R_coords[i + 1:]: Rij = Rj - Ri - Rij -= round(Rij[2] / box[2][2]) * box[2] - Rij -= round(Rij[1] / box[1][1]) * box[1] - Rij -= round(Rij[0] / box[0][0]) * box[0] + Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] + Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] + Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] Rij = np.linalg.norm(Rij) # find norm of Rij vector manual[distpos] = Rij # and done, phew distpos += 1 @@ -284,19 +288,18 @@ def test_selfdist(self, S_mol, box, boxV, backend): err_msg="self_distance_array failed with input 1") # Do it again for input 2 (has wider separation in points) - # Also use boxV here in self_dist calculation R_coords = transform_StoR(S_mol2, box, backend=backend) # Transform functions are tested elsewhere so taken as working here - dists = self_distance_array(R_coords, box=boxV, backend=backend) + dists = self_distance_array(R_coords, box=box, backend=backend) # Manually calculate self_distance_array manual = np.zeros(len(dists), dtype=np.float64) distpos = 0 for i, Ri in enumerate(R_coords): for Rj in R_coords[i + 1:]: Rij = Rj - Ri - Rij -= round(Rij[2] / box[2][2]) * box[2] - Rij -= round(Rij[1] / box[1][1]) * box[1] - Rij -= round(Rij[0] / box[0][0]) * box[0] + Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] + Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] + Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] Rij = np.linalg.norm(Rij) # find norm of Rij vector manual[distpos] = Rij # and done, phew distpos += 1 @@ -304,7 +307,7 @@ def test_selfdist(self, S_mol, box, boxV, backend): assert_almost_equal(dists, manual, self.prec, err_msg="self_distance_array failed with input 2") - def test_distarray(self, S_mol, box, boxV, backend): + def test_distarray(self, S_mol, tri_vec_box, box, backend): from MDAnalysis.lib.distances import distance_array from MDAnalysis.lib.distances import transform_StoR @@ -320,26 +323,21 @@ def test_distarray(self, S_mol, box, boxV, backend): for i, Ri in enumerate(R_mol1): for j, Rj in enumerate(R_mol2): Rij = Rj - Ri - Rij -= round(Rij[2] / box[2][2]) * box[2] - Rij -= round(Rij[1] / box[1][1]) * box[1] - Rij -= round(Rij[0] / box[0][0]) * box[0] + Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] + Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] + Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] Rij = np.linalg.norm(Rij) # find norm of Rij vector manual[i][j] = Rij assert_almost_equal(dists, manual, self.prec, err_msg="distance_array failed with box") - # Now check using boxV - dists = distance_array(R_mol1, R_mol2, box=boxV, backend=backend) - assert_almost_equal(dists, manual, self.prec, - err_msg="distance_array failed with boxV") - - def test_pbc_dist(self, S_mol, boxV, backend): + def test_pbc_dist(self, S_mol, box, backend): from MDAnalysis.lib.distances import distance_array S_mol1, S_mol2 = S_mol results = np.array([[37.629944]]) - dists = distance_array(S_mol1, S_mol2, box=boxV, + dists = distance_array(S_mol1, S_mol2, box=box, backend=backend) assert_almost_equal(dists, results, self.prec, @@ -347,14 +345,15 @@ def test_pbc_dist(self, S_mol, boxV, backend): def test_pbc_wrong_wassenaar_distance(self, backend): from MDAnalysis.lib.distances import distance_array - box = MDAnalysis.lib.mdamath.triclinic_vectors([2, 2, 2, 60, 60, 60]) - a, b, c = box + box = [2, 2, 2, 60, 60, 60] + tri_vec_box = MDAnalysis.lib.mdamath.triclinic_vectors(box) + a, b, c = tri_vec_box point_a = a + b point_b = .5 * point_a dist = distance_array(point_a[np.newaxis, :], point_b[np.newaxis, :], box=box, backend=backend) assert_almost_equal(dist[0, 0], 1) - # check that our distance is different then the wassenaar distance as + # check that our distance is different from the wassenaar distance as # expected. assert np.linalg.norm(point_a - point_b) != dist[0, 0] @@ -370,12 +369,15 @@ class TestCythonFunctions(object): @staticmethod @pytest.fixture() def box(): - return np.array([10., 10., 10.], dtype=np.float32) + return np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) @staticmethod @pytest.fixture() def triclinic_box(): - return np.array([[10., 0., 0.], [1., 10., 0., ], [1., 0., 10.]], dtype=np.float32) + box_vecs = np.array([[10., 0., 0.], [1., 10., 0., ], [1., 0., 10.]], + dtype=np.float32) + return MDAnalysis.lib.mdamath.triclinic_box(box_vecs[0], box_vecs[1], + box_vecs[2]) @staticmethod @pytest.fixture() @@ -430,18 +432,16 @@ def test_bonds(self, positions, box, backend, dtype): def test_bonds_badbox(self, positions, backend): a, b, c, d = positions - badboxtype = np.array([10., 10., 10.], dtype=np.float64) - badboxsize = np.array([[10., 10.], [10., 10., ]], dtype=np.float32) + badbox1 = np.array([10., 10., 10.], dtype=np.float64) + badbox2 = np.array([[10., 10.], [10., 10., ]], dtype=np.float32) with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_bonds(a, - b, box=badboxsize, - backend=backend) # Bad box data + MDAnalysis.lib.distances.calc_bonds(a, b, box=badbox1, + backend=backend) - with pytest.raises(TypeError): - MDAnalysis.lib.distances.calc_bonds(a, - b, box=badboxtype, - backend=backend) # Bad box type + with pytest.raises(ValueError): + MDAnalysis.lib.distances.calc_bonds(a, b, box=badbox2, + backend=backend) def test_bonds_badresult(self, positions, backend): a, b, c, d = positions @@ -565,15 +565,12 @@ def test_ortho_PBC(self, backend): U = MDAnalysis.Universe(PSF, DCD) atoms = U.atoms.positions - box1 = np.array([2.5, 2.5, 3.5], dtype=np.float32) - box2 = np.array([2.5, 2.5, 3.5, 90., 90., 90.], dtype=np.float32) - - cyth1 = apply_PBC(atoms, box1, backend=backend) - cyth2 = apply_PBC(atoms, box2, backend=backend) - reference = atoms - np.floor(atoms / box1) * box1 + box = np.array([2.5, 2.5, 3.5, 90., 90., 90.], dtype=np.float32) + with pytest.raises(ValueError): + cyth1 = apply_PBC(atoms, box[:3], backend=backend) + cyth2 = apply_PBC(atoms, box, backend=backend) + reference = atoms - np.floor(atoms / box[:3]) * box[:3] - assert_almost_equal(cyth1, reference, self.prec, - err_msg="Ortho apply_PBC #1 failed comparison with np") assert_almost_equal(cyth2, reference, self.prec, err_msg="Ortho apply_PBC #2 failed comparison with np") @@ -582,8 +579,7 @@ def test_tric_PBC(self, backend): U = MDAnalysis.Universe(TRIC) atoms = U.atoms.positions - box1 = U.dimensions - box2 = MDAnalysis.coordinates.core.triclinic_vectors(box1) + box = U.dimensions def numpy_PBC(coords, box): # move to fractional coordinates @@ -593,14 +589,11 @@ def numpy_PBC(coords, box): # move back to real coordinates return MDAnalysis.lib.distances.transform_StoR(fractional, box) - cyth1 = apply_PBC(atoms, box1, backend=backend) - cyth2 = apply_PBC(atoms, box2, backend=backend) - reference = numpy_PBC(atoms, box2) + cyth1 = apply_PBC(atoms, box, backend=backend) + reference = numpy_PBC(atoms, box) assert_almost_equal(cyth1, reference, decimal=4, err_msg="Triclinic apply_PBC failed comparison with np") - assert_almost_equal(cyth2, reference, decimal=4, - err_msg="Triclinic apply_PBC failed comparison with np") box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) r = np.array([[5.75, 0.36066014, 0.75]], dtype=np.float32) @@ -635,6 +628,7 @@ def test_angles(self, positions, backend): ref = calc_angles(a, b, c, backend=backend) + box = np.append(box, [90, 90, 90]) test1 = calc_angles(a2, b, c, box=box, backend=backend) test2 = calc_angles(a, b2, c, box=box, backend=backend) test3 = calc_angles(a, b, c2, box=box, backend=backend) @@ -653,6 +647,7 @@ def test_dihedrals(self, positions, backend): ref = calc_dihedrals(a, b, c, d, backend=backend) + box = np.append(box, [90, 90, 90]) test1 = calc_dihedrals(a2, b, c, d, box=box, backend=backend) test2 = calc_dihedrals(a, b2, c, d, box=box, From 232bcd9b72754b2a9f7081262c1110f812cafcf5 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sun, 5 Aug 2018 19:28:32 -0500 Subject: [PATCH 411/455] Added Cython implementation of fragment finding Added more tests for fragment finding --- benchmarks/benchmarks/ag_methods.py | 16 +++- package/CHANGELOG | 3 + package/MDAnalysis/core/universe.py | 59 ++------------ package/MDAnalysis/lib/_cutil.pyx | 77 ++++++++++++++++++- package/MDAnalysis/lib/mdamath.py | 3 +- package/MDAnalysis/lib/util.py | 2 +- .../MDAnalysisTests/core/test_fragments.py | 8 ++ testsuite/MDAnalysisTests/lib/test_cutil.py | 22 +++++- 8 files changed, 134 insertions(+), 56 deletions(-) diff --git a/benchmarks/benchmarks/ag_methods.py b/benchmarks/benchmarks/ag_methods.py index c5b81bae66e..d6edc8ec27d 100644 --- a/benchmarks/benchmarks/ag_methods.py +++ b/benchmarks/benchmarks/ag_methods.py @@ -4,7 +4,7 @@ import numpy as np try: - from MDAnalysisTests.datafiles import GRO + from MDAnalysisTests.datafiles import GRO, TPR, XTC from MDAnalysis.exceptions import NoDataError except: pass @@ -322,3 +322,17 @@ def time_bond(self, num_atoms): Requires ag of size 2. """ self.ag[:2].bond + + +class FragmentFinding(object): + """Test how quickly we find fragments (distinct molecules from bonds)""" + params = [(TPR, XTC), # single large fragment, many small solvents + (PSF, DCD), # single large fragment + (TRZ_psf, TRZ)] # 20ish polymer chains + param_names = ['universe'] + + def setup(self, universe): + self.u = MDAnalysis.Universe(*universe) + + def test_find_fragments(self, universe): + frags = self.u.atoms.fragments diff --git a/package/CHANGELOG b/package/CHANGELOG index 946e8458de3..9c22d1fff0a 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -80,6 +80,9 @@ Enhancements * Added dihedrals.py with Dihedral, Ramachandran, and Janin classes to analysis module (PR #1997, PR #2033) * Added the analysis.data module for reference data used in analysis (PR #2033) + * Added dihedrals.py with Ramachandran class to analysis module + * Performance improvements to make_whole (PR #1965) + * Performance improvements to fragment finding (PR #2028) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index 266206ce5de..8cd98b758c7 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -117,6 +117,7 @@ from ..lib import util from ..lib.log import ProgressMeter, _set_verbose from ..lib.util import cached, NamedStream, isstream +from ..lib.mdamath import find_fragments from . import groups from ._get_readers import get_reader_for, get_parser_for from .groups import (ComponentBase, GroupBase, @@ -978,58 +979,14 @@ def _fragdict(self): .. versionchanged:: 0.16.0 Fragment atoms are sorted by their index, and framgents are sorted by their first atom index so their order is predictable. + .. versionchanged:: 0.19.0 + Uses faster C++ implementation """ - bonds = self.atoms.bonds - - class _fragset(object): - __slots__ = ['ats'] - """Normal sets aren't hashable, this is""" - - def __init__(self, ats): - self.ats = set(ats) - - def __iter__(self): - return iter(self.ats) - - def add(self, other): - self.ats.add(other) - - def update(self, other): - self.ats.update(other.ats) - - # each atom starts with its own list - f = dict.fromkeys(self.atoms, None) - - for a1, a2 in bonds: - if not (f[a1] or f[a2]): - # New set made here - new = _fragset([a1, a2]) - f[a1] = f[a2] = new - elif f[a1] and not f[a2]: - # If a2 isn't in a fragment, add it to a1's - f[a1].add(a2) - f[a2] = f[a1] - elif not f[a1] and f[a2]: - # If a1 isn't in a fragment, add it to a2's - f[a2].add(a1) - f[a1] = f[a2] - elif f[a1] is f[a2]: - # If they're in the same fragment, do nothing - continue - else: - # If they are both in different fragments, combine fragments - f[a1].update(f[a2]) - f.update(dict((a, f[a1]) for a in f[a2])) - - # Lone atoms get their own fragment - f.update(dict((a, _fragset((a,))) - for a, val in f.items() if not val)) - - # All the unique values in f are the fragments - frags = tuple( - [AtomGroup(np.sort(np.array([at.index for at in ag])), self) - for ag in set(f.values())], - ) + atoms = self.atoms.ix + bonds = self.atoms.bonds.to_indices() + + frag_indices = find_fragments(atoms, bonds) + frags = tuple([AtomGroup(np.sort(ix), self) for ix in frag_indices]) fragdict = {} for f in frags: diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index dd5206dd4d4..f04590ae58c 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -30,8 +30,11 @@ from MDAnalysis import NoDataError from libcpp.set cimport set as cset from libcpp.map cimport map as cmap +from libcpp.vector cimport vector +from cython.operator cimport dereference as deref -__all__ = ['unique_int_1d', 'make_whole'] + +__all__ = ['unique_int_1d', 'make_whole', 'find_fragments'] cdef extern from "calc_distances.h": ctypedef float coordinate[3] @@ -312,3 +315,75 @@ cdef float _norm(float * a): for n in range(3): result += a[n]*a[n] return sqrt(result) + + +@cython.boundscheck(False) +@cython.wraparound(False) +def find_fragments(atoms, bondlist): + """Calculate distinct fragments from nodes and edges + + Parameters + ---------- + atoms : numpy.ndarray + array of nodes + bonds : numpy.ndarray + array of edges. Any edges which refer to nodes not in *atoms* + will be ignored + + Returns + ------- + fragments : list + list of arrays, each containing the indices of a fragment + + .. versionaddded:: 0.19.0 + """ + cdef intmap bondmap + cdef intset todo, frag_todo, frag_done + cdef vector[int] this_frag + cdef int i, a, b + cdef np.int64_t[:] atoms_view + cdef np.int32_t[:, :] bonds_view + + atoms_view = np.asarray(atoms, dtype=np.int64) + bonds_view = np.asarray(bondlist, dtype=np.int32) + + # grab record of which atoms I have to process + # ie set of all nodes + for i in range(atoms_view.shape[0]): + todo.insert(atoms_view[i]) + # Process edges into map + for i in range(bonds_view.shape[0]): + a = bondlist[i, 0] + b = bondlist[i, 1] + # only include edges if both are known nodes + if todo.count(a) and todo.count(b): + bondmap[a].insert(b) + bondmap[b].insert(a) + + frags = [] + + while not todo.empty(): # While not all nodes have been done + # Start a new fragment + frag_todo.clear() + frag_done.clear() + this_frag.clear() + # Grab a start point for next fragment + frag_todo.insert(deref(todo.begin())) + + # Loop until fragment fully explored + while not frag_todo.empty(): + # Pop next in this frag todo + a = deref(frag_todo.begin()) + frag_todo.erase(a) + if not frag_done.count(a): + this_frag.push_back(a) + frag_done.insert(a) + todo.erase(a) + for b in bondmap[a]: + if not frag_done.count(b): + frag_todo.insert(b) + + # Add fragment to output + frags.append(np.asarray(this_frag)) + + return frags diff --git a/package/MDAnalysis/lib/mdamath.py b/package/MDAnalysis/lib/mdamath.py index d623142e386..220f17d29b8 100644 --- a/package/MDAnalysis/lib/mdamath.py +++ b/package/MDAnalysis/lib/mdamath.py @@ -35,6 +35,7 @@ .. autofunction:: triclinic_vectors .. autofunction:: box_volume .. autofunction:: make_whole +.. autofunction:: find_fragments .. versionadded:: 0.11.0 """ @@ -44,7 +45,7 @@ from ..exceptions import NoDataError from . import util -from ._cutil import make_whole +from ._cutil import make_whole, find_fragments # geometric functions def norm(v): diff --git a/package/MDAnalysis/lib/util.py b/package/MDAnalysis/lib/util.py index c6034321493..f1ea174555c 100644 --- a/package/MDAnalysis/lib/util.py +++ b/package/MDAnalysis/lib/util.py @@ -192,7 +192,7 @@ import inspect from ..exceptions import StreamWarning, DuplicateWarning -from ._cutil import * +from ._cutil import unique_int_1d # Python 3.0, 3.1 do not have the builtin callable() diff --git a/testsuite/MDAnalysisTests/core/test_fragments.py b/testsuite/MDAnalysisTests/core/test_fragments.py index 7625355d7a9..bcb19ae2280 100644 --- a/testsuite/MDAnalysisTests/core/test_fragments.py +++ b/testsuite/MDAnalysisTests/core/test_fragments.py @@ -28,11 +28,13 @@ ) import pytest +import MDAnalysis as mda from MDAnalysis.core.topologyattrs import Bonds from MDAnalysis.core import groups from MDAnalysis import NoDataError from MDAnalysisTests import make_Universe +from MDAnalysisTests.datafiles import TPR, XTC # Also used in topology/test_guessers @@ -175,3 +177,9 @@ def test_atom_fragment_nobonds_NDE(self): u = make_Universe() with pytest.raises(NoDataError): getattr(u.atoms[10], 'fragment') + + +def test_tpr_fragments(): + frags = mda.Universe(TPR, XTC).atoms.fragments + + assert len(frags[0]) == 3341 diff --git a/testsuite/MDAnalysisTests/lib/test_cutil.py b/testsuite/MDAnalysisTests/lib/test_cutil.py index 73c94b24d89..23483fc902b 100644 --- a/testsuite/MDAnalysisTests/lib/test_cutil.py +++ b/testsuite/MDAnalysisTests/lib/test_cutil.py @@ -25,7 +25,7 @@ import numpy as np from numpy.testing import assert_equal -from MDAnalysis.lib._cutil import unique_int_1d +from MDAnalysis.lib._cutil import unique_int_1d, find_fragments @pytest.mark.parametrize('values', ( @@ -39,3 +39,23 @@ def test_unique_int_1d(values): array = np.array(values, dtype=np.int64) assert_equal(unique_int_1d(array), np.unique(array)) + + +@pytest.mark.parametrize('edges,ref', [ + (np.array([[0, 1], [1, 2], [2, 3], [3, 4]], dtype=np.int32), + [[0, 1, 2, 3, 4]]), # linear chain + (np.array([[0, 1], [1, 2], [2, 3], [3, 4], [4, 10]], dtype=np.int32), + [[0, 1, 2, 3, 4]]), # unused edge (4, 10) + (np.array([[0, 1], [1, 2], [2, 3]], dtype=np.int32), + [[0, 1, 2, 3], [4]]), # lone atom + (np.array([[0, 1], [1, 2], [2, 0], [3, 4], [4, 3]], dtype=np.int32), + [[0, 1, 2], [3, 4]]), # circular +]) +def test_find_fragments(edges, ref): + atoms = np.arange(5) + + fragments = find_fragments(atoms, edges) + + assert len(fragments) == len(ref) + for frag, r in zip(fragments, ref): + assert_equal(frag, r) From 62c35d49bd9458f2b5057d28d4904391a4a38513 Mon Sep 17 00:00:00 2001 From: ayushsuhane <34154224+ayushsuhane@users.noreply.github.com> Date: Mon, 20 Aug 2018 08:56:24 -0700 Subject: [PATCH 412/455] Replaced kdtree in neighborsearch with capped distances (#2054) * replaced kdtree in neighborsearch with capped distances * type modification --- package/MDAnalysis/lib/NeighborSearch.py | 20 +++++++------------ .../lib/test_neighborsearch.py | 4 ++-- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/package/MDAnalysis/lib/NeighborSearch.py b/package/MDAnalysis/lib/NeighborSearch.py index 39cd5b3f7a6..956d8a31452 100644 --- a/package/MDAnalysis/lib/NeighborSearch.py +++ b/package/MDAnalysis/lib/NeighborSearch.py @@ -30,7 +30,7 @@ from __future__ import absolute_import import numpy as np -from MDAnalysis.lib.pkdtree import PeriodicKDTree +from MDAnalysis.lib.distances import capped_distance from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core.groups import AtomGroup, Atom @@ -65,7 +65,7 @@ def __init__(self, atom_group, box=None, bucket_size=10): self.atom_group = atom_group self._u = atom_group.universe self._box = box - self.kdtree = PeriodicKDTree(box=box, leafsize=bucket_size) + #self.kdtree = PeriodicKDTree(box=box, leafsize=bucket_size) def search(self, atoms, radius, level='A'): """ @@ -82,23 +82,17 @@ def search(self, atoms, radius, level='A'): char (A, R, S). Return atoms(A), residues(R) or segments(S) within *radius* of *atoms*. """ + unique_idx = [] if isinstance(atoms, Atom): positions = atoms.position.reshape(1, 3) else: positions = atoms.positions - - # check if already built - cutoff = radius if self._box is not None else None - self.kdtree.set_coords(self.atom_group.positions, cutoff=cutoff) + pairs = capped_distance(positions, self.atom_group.positions, + radius, box=self._box, return_distances=False) - indices = [] - for pos in positions: - self.kdtree.search(pos, radius) - indices.append(self.kdtree.get_indices()) - unique_idx = unique_int_1d( - np.array([i for l in indices for i in l], dtype=np.int64) - ) + if pairs.size > 0: + unique_idx = unique_int_1d(np.asarray(pairs[:, 1], dtype=np.int64)) return self._index2level(unique_idx, level) def _index2level(self, indices, level): diff --git a/testsuite/MDAnalysisTests/lib/test_neighborsearch.py b/testsuite/MDAnalysisTests/lib/test_neighborsearch.py index 226ba7fac42..6f0675d430e 100644 --- a/testsuite/MDAnalysisTests/lib/test_neighborsearch.py +++ b/testsuite/MDAnalysisTests/lib/test_neighborsearch.py @@ -41,8 +41,8 @@ def universe(): def test_search(universe): - """simply check that for a centered protein in a large box pkdtree - and kdtree return the same result""" + """simply check that for a centered protein in a large box periodic + and non-periodic return the same result""" ns = NeighborSearch.AtomNeighborSearch(universe.atoms) pns = NeighborSearch.AtomNeighborSearch(universe.atoms, universe.atoms.dimensions) From bf366247dc33bd90f4542712cd353a42e12a32cc Mon Sep 17 00:00:00 2001 From: zeman Date: Mon, 20 Aug 2018 22:25:53 +0200 Subject: [PATCH 413/455] more verbose docstring of `find_fragments()` --- package/MDAnalysis/lib/_cutil.pyx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index f04590ae58c..c767e5f03ae 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -320,20 +320,24 @@ cdef float _norm(float * a): @cython.boundscheck(False) @cython.wraparound(False) def find_fragments(atoms, bondlist): - """Calculate distinct fragments from nodes and edges + """Calculate distinct fragments from nodes (atom indices) and edges (pairs + of atom indices). Parameters ---------- - atoms : numpy.ndarray - array of nodes - bonds : numpy.ndarray - array of edges. Any edges which refer to nodes not in *atoms* - will be ignored + atoms : array_like + 1-D Array of atom indices (dtype will be converted to ``numpy.int64`` + internally) + bonds : array_like + 2-D array of bonds (dtype will be converted to ``numpy.int32`` + internally), where ``bonds[i, 0]`` and ``bonds[i, 1]`` are the + indices of atoms connected by the ``i``-th bond. Any bonds referring to + atom indices not in `atoms` will be ignored. Returns ------- fragments : list - list of arrays, each containing the indices of a fragment + List of arrays, each containing the atom indices of a fragment. .. versionaddded:: 0.19.0 """ From 40865ce39d0b99d5db98d3e2797c516baebb4e50 Mon Sep 17 00:00:00 2001 From: zeman Date: Mon, 20 Aug 2018 22:44:09 +0200 Subject: [PATCH 414/455] use `bonds_view` instead of bondlist to initialize `bondmap` in `find_fragments()` --- package/MDAnalysis/lib/_cutil.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/lib/_cutil.pyx b/package/MDAnalysis/lib/_cutil.pyx index c767e5f03ae..250abacbe73 100644 --- a/package/MDAnalysis/lib/_cutil.pyx +++ b/package/MDAnalysis/lib/_cutil.pyx @@ -357,8 +357,8 @@ def find_fragments(atoms, bondlist): todo.insert(atoms_view[i]) # Process edges into map for i in range(bonds_view.shape[0]): - a = bondlist[i, 0] - b = bondlist[i, 1] + a = bonds_view[i, 0] + b = bonds_view[i, 1] # only include edges if both are known nodes if todo.count(a) and todo.count(b): bondmap[a].insert(b) From 2feaaa91d54818df18beb70b25f8571e0bff40cf Mon Sep 17 00:00:00 2001 From: zeman Date: Mon, 20 Aug 2018 22:45:48 +0200 Subject: [PATCH 415/455] test_find_fragments now ensures array_like input works with `find_fragments()` --- testsuite/MDAnalysisTests/lib/test_cutil.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_cutil.py b/testsuite/MDAnalysisTests/lib/test_cutil.py index 23483fc902b..c530a8864be 100644 --- a/testsuite/MDAnalysisTests/lib/test_cutil.py +++ b/testsuite/MDAnalysisTests/lib/test_cutil.py @@ -42,13 +42,13 @@ def test_unique_int_1d(values): @pytest.mark.parametrize('edges,ref', [ - (np.array([[0, 1], [1, 2], [2, 3], [3, 4]], dtype=np.int32), + ([[0, 1], [1, 2], [2, 3], [3, 4]], [[0, 1, 2, 3, 4]]), # linear chain - (np.array([[0, 1], [1, 2], [2, 3], [3, 4], [4, 10]], dtype=np.int32), + ([[0, 1], [1, 2], [2, 3], [3, 4], [4, 10]], [[0, 1, 2, 3, 4]]), # unused edge (4, 10) - (np.array([[0, 1], [1, 2], [2, 3]], dtype=np.int32), + ([[0, 1], [1, 2], [2, 3]], [[0, 1, 2, 3], [4]]), # lone atom - (np.array([[0, 1], [1, 2], [2, 0], [3, 4], [4, 3]], dtype=np.int32), + ([[0, 1], [1, 2], [2, 0], [3, 4], [4, 3]], [[0, 1, 2], [3, 4]]), # circular ]) def test_find_fragments(edges, ref): From d487aa32905a0150cb8afc82d74595219af0be0c Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 21 Aug 2018 00:44:14 +0200 Subject: [PATCH 416/455] added missing CHANGELOG entry for PR #2048 --- package/CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package/CHANGELOG b/package/CHANGELOG index 946e8458de3..b883cb6fff2 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -80,6 +80,8 @@ Enhancements * Added dihedrals.py with Dihedral, Ramachandran, and Janin classes to analysis module (PR #1997, PR #2033) * Added the analysis.data module for reference data used in analysis (PR #2033) + * Most functions in `MDanalysis.lib.distances` previously only accepting + arrays of coordinates now also accept single coordinates as input (PR #2048) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) @@ -117,6 +119,9 @@ Changes (Issue #1894) * removed unused function MDAnalysis.lb.mdamath.one_to_many_pointers() (issue #2010) + * Box input for functions in `MDAnalysis.lib.distances` is now consistently + enforced to be of the form ``[lx, ly, lz, alpha, beta, gamma]`` as required + by the docs (Issue #2046, PR #2048) Deprecations * almost all "save()", "save_results()", "save_table()" methods in From 6d9e3eac56538bcb79dd8a1e1c0a6489e45a3ca9 Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 21 Aug 2018 00:45:48 +0200 Subject: [PATCH 417/455] ensured `lib.distances.distance_array()` always returns an array --- package/MDAnalysis/lib/distances.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 25d2822fd0f..3709d390e16 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -221,7 +221,7 @@ def _check_result_array(result, shape): return result @check_coords('reference', 'configuration', enforce_copy=False, - check_lengths_match=False) + reduce_result_if_single=False, check_lengths_match=False) def distance_array(reference, configuration, box=None, result=None, backend="serial"): """Calculate all distances between a reference set and another configuration. From 35440bfa025e2706b1fac0591b63d0187e00c464 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Wed, 22 Aug 2018 14:59:30 -0500 Subject: [PATCH 418/455] deprecate flags add periodic kwarg to select_atoms --- package/CHANGELOG | 6 ++- package/MDAnalysis/core/__init__.py | 20 ++++++++-- package/MDAnalysis/core/groups.py | 6 ++- package/MDAnalysis/core/selection.py | 38 +++++++------------ .../MDAnalysisTests/core/test_atomgroup.py | 36 +----------------- .../core/test_flag_deprecations.py | 37 ++++++++++++++++++ 6 files changed, 78 insertions(+), 65 deletions(-) create mode 100644 testsuite/MDAnalysisTests/core/test_flag_deprecations.py diff --git a/package/CHANGELOG b/package/CHANGELOG index 9c22d1fff0a..b68281d2d42 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -120,12 +120,16 @@ Changes (Issue #1894) * removed unused function MDAnalysis.lb.mdamath.one_to_many_pointers() (issue #2010) + * Added periodic keyword to select_atoms (#759) Deprecations * almost all "save()", "save_results()", "save_table()" methods in analysis classes were deprecated and will be removed in 1.0 (Issue #1972 and #1745) - + * deprecated use of core.flags. For use_pbc, the pbc keyword should + be used, use_KDTree_routines is obsolete as all distance calculations + select the fastest method, all other uses of flags are deprecated. + (#782) 04/15/18 tylerjereddy, richardjgowers, palnabarun, bieniekmateusz, kain88-de, orbeckst, xiki-tempula, navyakhare, zemanj, ayushsuhane, davidercruz, diff --git a/package/MDAnalysis/core/__init__.py b/package/MDAnalysis/core/__init__.py index f0801c337d6..57081aaf743 100644 --- a/package/MDAnalysis/core/__init__.py +++ b/package/MDAnalysis/core/__init__.py @@ -92,6 +92,19 @@ from __future__ import absolute_import import six +import warnings +_DEPMSG = { + 'use_KDTree_routines': ('This flag is obsolete, all selections now ' + 'automatically select the fastest method'), + 'use_periodic_selections': 'Use periodic=True/False to select_atoms', + 'convert_lengths': 'This behaviour has been deprecated', + 'length_unit': 'This behaviour has been deprecated', + 'time_unit': 'This behaviour has been deprecated', + 'speed_unit': 'This behaviour has been deprecated', + 'force_unit': 'This behaviour has been deprecated', + 'charge_unit': 'This behaviour has been deprecated', + 'use_pbc': 'Supply a pbc kwarg to the relevant methods', +} __all__ = ['AtomGroup', 'Selection'] @@ -243,6 +256,10 @@ def get(self): return self.value def set(self, value): + warnings.warn('MDAnalysis.core.flags is deprecated and will be removed in version 1.0. ' + '' + _DEPMSG[self.name], # custom message for each flag too + DeprecationWarning) + if value is not None: try: self.value = self.mapping[value] @@ -280,9 +297,6 @@ def __doc__(self): * False - periodicity is ignored The MDAnalysis preset of this flag is %(default)r. - - Note that KD-tree based distance selections always ignore this flag. (For - details see the docs for the 'use_KDTree_routines' flag.) """ ), _Flag( diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index f7af77f7b8b..12c2e263fe6 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -2362,7 +2362,11 @@ def select_atoms(self, sel, *othersel, **selgroups): the `updating` argument. .. versionchanged:: 0.17.0 Added *moltype* and *molnum* selections. .. versionchanged:: 0.18.1 Added strict type checking for passed groups. + .. versionchanged:: 0.19.0 Added periodic kwarg (default True) """ + # once flags removed, replace with default=True + periodic = selgroups.pop('periodic', flags['use_periodic_selections']) + updating = selgroups.pop('updating', False) sel_strs = (sel,) + othersel @@ -2372,7 +2376,7 @@ def select_atoms(self, sel, *othersel, **selgroups): "You provided {} for group '{}'".format( thing.__class__.__name__, group)) - selections = tuple((selection.Parser.parse(s, selgroups) + selections = tuple((selection.Parser.parse(s, selgroups, periodic=periodic) for s in sel_strs)) if updating: atomgrp = UpdatingAtomGroup(self, selections, sel_strs) diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index bac71597b08..828cfbb594f 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -50,7 +50,6 @@ from numpy.lib.utils import deprecate -from MDAnalysis.lib.pkdtree import PeriodicKDTree from MDAnalysis.lib.util import unique_int_1d from MDAnalysis.core import flags from ..lib import distances @@ -227,19 +226,7 @@ def apply(self, group): class DistanceSelection(Selection): - """Base class for distance search based selections - - Grabs the flags for this selection - - 'use_KDTree_routines' - - 'use_periodic_selections' - - Populates the `apply` method with either - - _apply_KDTree - - _apply_distmat - """ - def __init__(self): - - self.periodic = flags['use_periodic_selections'] + """Base class for distance search based selections""" def validate_dimensions(self, dimensions): r"""Check if the system is periodic in all three-dimensions. @@ -264,7 +251,7 @@ class AroundSelection(DistanceSelection): precedence = 1 def __init__(self, parser, tokens): - super(AroundSelection, self).__init__() + self.periodic = parser.periodic self.cutoff = float(tokens.popleft()) self.sel = parser.parse_expression(self.precedence) @@ -291,7 +278,7 @@ class SphericalLayerSelection(DistanceSelection): precedence = 1 def __init__(self, parser, tokens): - super(SphericalLayerSelection, self).__init__() + self.periodic = parser.periodic self.inRadius = float(tokens.popleft()) self.exRadius = float(tokens.popleft()) self.sel = parser.parse_expression(self.precedence) @@ -318,7 +305,7 @@ class SphericalZoneSelection(DistanceSelection): precedence = 1 def __init__(self, parser, tokens): - super(SphericalZoneSelection, self).__init__() + self.periodic = parser.periodic self.cutoff = float(tokens.popleft()) self.sel = parser.parse_expression(self.precedence) @@ -339,10 +326,6 @@ def apply(self, group): class CylindricalSelection(Selection): - def __init__(self): - self.periodic = flags['use_periodic_selections'] - - def apply(self, group): sel = self.sel.apply(group) @@ -405,7 +388,7 @@ class CylindricalZoneSelection(CylindricalSelection): precedence = 1 def __init__(self, parser, tokens): - super(CylindricalZoneSelection, self).__init__() + self.periodic = parser.periodic self.exRadius = float(tokens.popleft()) self.zmax = float(tokens.popleft()) self.zmin = float(tokens.popleft()) @@ -417,7 +400,7 @@ class CylindricalLayerSelection(CylindricalSelection): precedence = 1 def __init__(self, parser, tokens): - super(CylindricalLayerSelection, self).__init__() + self.periodic = parser.periodic self.inRadius = float(tokens.popleft()) self.exRadius = float(tokens.popleft()) self.zmax = float(tokens.popleft()) @@ -429,7 +412,7 @@ class PointSelection(DistanceSelection): token = 'point' def __init__(self, parser, tokens): - super(PointSelection, self).__init__() + self.periodic = parser.periodic x = float(tokens.popleft()) y = float(tokens.popleft()) z = float(tokens.popleft()) @@ -1135,7 +1118,7 @@ def expect(self, token): "Unexpected token: '{0}' Expected: '{1}'" "".format(self.tokens[0], token)) - def parse(self, selectstr, selgroups): + def parse(self, selectstr, selgroups, periodic=None): """Create a Selection object from a string. Parameters @@ -1144,6 +1127,9 @@ def parse(self, selectstr, selgroups): The string that describes the selection selgroups : AtomGroups AtomGroups to be used in `group` selections + periodic : bool, optional + for distance based selections, whether to consider + periodic boundary conditions Returns ------- @@ -1155,6 +1141,8 @@ def parse(self, selectstr, selgroups): SelectionError If anything goes wrong in creating the Selection object. """ + self.periodic = periodic + self.selectstr = selectstr self.selgroups = selgroups tokens = selectstr.replace('(', ' ( ').replace(')', ' ) ') diff --git a/testsuite/MDAnalysisTests/core/test_atomgroup.py b/testsuite/MDAnalysisTests/core/test_atomgroup.py index 7b5029e2799..f7195f8504e 100644 --- a/testsuite/MDAnalysisTests/core/test_atomgroup.py +++ b/testsuite/MDAnalysisTests/core/test_atomgroup.py @@ -886,10 +886,6 @@ def ag(self): universe = mda.Universe(TRZ_psf, TRZ) return universe.residues[0:3] - def test_flag(self): - # Test default setting of flag - assert mda.core.flags['use_pbc'] is False - def test_default(self, ag, ref_noPBC): # Test regular behaviour assert_almost_equal(ag.center_of_geometry(), ref_noPBC['COG'], self.prec) @@ -904,7 +900,7 @@ def test_default(self, ag, ref_noPBC): assert_almost_equal(ag.principal_axes(), ref_noPBC['PAxes'], self.prec) def test_pbcflag(self, ag, ref_PBC): - # Test using ag method flag + # Test using pbc keyword assert_almost_equal(ag.center_of_geometry(pbc=True), ref_PBC['COG'], self.prec) assert_almost_equal(ag.center_of_mass(pbc=True), ref_PBC['COM'], self.prec) assert_almost_equal(ag.radius_of_gyration(pbc=True), ref_PBC['ROG'], self.prec) @@ -916,36 +912,6 @@ def test_pbcflag(self, ag, ref_PBC): assert_almost_equal(ag.bsphere(pbc=True)[1], ref_PBC['BSph'][1], self.prec) assert_almost_equal(ag.principal_axes(pbc=True), ref_PBC['PAxes'], self.prec) - def test_usepbc_flag(self, ag, ref_PBC): - # Test using the core.flags flag - mda.core.flags['use_pbc'] = True - assert_almost_equal(ag.center_of_geometry(), ref_PBC['COG'], self.prec) - assert_almost_equal(ag.center_of_mass(), ref_PBC['COM'], self.prec) - assert_almost_equal(ag.radius_of_gyration(), ref_PBC['ROG'], self.prec) - assert_almost_equal(ag.shape_parameter(), ref_PBC['Shape'], self.prec) - assert_almost_equal(ag.asphericity(), ref_PBC['Asph'], self.prec) - assert_almost_equal(ag.moment_of_inertia(), ref_PBC['MOI'], self.prec) - assert_almost_equal(ag.bbox(), ref_PBC['BBox'], self.prec) - assert_almost_equal(ag.bsphere()[0], ref_PBC['BSph'][0], self.prec) - assert_almost_equal(ag.bsphere()[1], ref_PBC['BSph'][1], self.prec) - assert_almost_equal(ag.principal_axes(), ref_PBC['PAxes'], self.prec) - mda.core.flags['use_pbc'] = False - - def test_override_flag(self, ag, ref_noPBC): - # Test using the core.flags flag, then overriding - mda.core.flags['use_pbc'] = True - assert_almost_equal(ag.center_of_geometry(pbc=False), ref_noPBC['COG'], self.prec) - assert_almost_equal(ag.center_of_mass(pbc=False), ref_noPBC['COM'], self.prec) - assert_almost_equal(ag.radius_of_gyration(pbc=False), ref_noPBC['ROG'], self.prec) - assert_almost_equal(ag.shape_parameter(pbc=False), ref_noPBC['Shape'], self.prec) - assert_almost_equal(ag.asphericity(pbc=False), ref_noPBC['Asph'], self.prec) - assert_almost_equal(ag.moment_of_inertia(pbc=False), ref_noPBC['MOI'], self.prec) - assert_almost_equal(ag.bbox(pbc=False), ref_noPBC['BBox'], self.prec) - assert_almost_equal(ag.bsphere(pbc=False)[0], ref_noPBC['BSph'][0], self.prec) - assert_almost_equal(ag.bsphere(pbc=False)[1], ref_noPBC['BSph'][1], self.prec) - assert_almost_equal(ag.principal_axes(pbc=False), ref_noPBC['PAxes'], self.prec) - mda.core.flags['use_pbc'] = False - def test_instantselection_termini(): """Test that instant selections work, even for residues that are also termini (Issue 70)""" diff --git a/testsuite/MDAnalysisTests/core/test_flag_deprecations.py b/testsuite/MDAnalysisTests/core/test_flag_deprecations.py new file mode 100644 index 00000000000..33825a49b0d --- /dev/null +++ b/testsuite/MDAnalysisTests/core/test_flag_deprecations.py @@ -0,0 +1,37 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +from __future__ import absolute_import, division + +import pytest + +import MDAnalysis as mda + + +@pytest.mark.parametrize('flag', ['use_pbc', 'use_periodic_selections', + 'use_KDTree_routines', 'convert_lengths', + 'length_unit', 'speed_unit', 'force_unit', + 'charge_unit', 'time_unit']) +def test_flag_deprecation(flag): + curr = mda.core.flags[flag] + + with pytest.warns(DeprecationWarning): + mda.core.flags[flag] = curr From 8cd8f55c89c5969889b6e270d36e7309a68f6d4d Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Sat, 25 Aug 2018 14:39:58 -0500 Subject: [PATCH 419/455] fixed Cython 0.26 not liking to call len inside nogil block --- package/MDAnalysis/lib/nsgrid.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 6ace6e38494..4ba028ed326 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -417,7 +417,7 @@ cdef class NSResults(object): cdef ns_int idx, nsearch cdef real dist2, dist - nsearch = len(self.searchcoords) + nsearch = self.searchcoords.shape[0] self.indices_buffer = vector[intvec]() self.distances_buffer = vector[realvec]() From 6fcadc055d8b9ceb06cdedb7333821ac3e3808ef Mon Sep 17 00:00:00 2001 From: VOD555 Date: Tue, 28 Aug 2018 17:11:52 -0700 Subject: [PATCH 420/455] Use capped_distance instead of distance_array --- package/MDAnalysis/analysis/rdf.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/package/MDAnalysis/analysis/rdf.py b/package/MDAnalysis/analysis/rdf.py index 0d96b7ac106..83f2890012e 100644 --- a/package/MDAnalysis/analysis/rdf.py +++ b/package/MDAnalysis/analysis/rdf.py @@ -303,10 +303,8 @@ def __init__(self, u, ags, # List of pairs of AtomGroups self.ags = ags - self.u = u self._density = density - self.rdf_settings = {'bins': nbins, 'range': range} @@ -323,16 +321,19 @@ def _prepare(self): # Need to know average volume self.volume = 0.0 + self._maxrange = self.rdf_settings['range'][1] def _single_frame(self): for i, (ag1, ag2) in enumerate(self.ags): - result=distances.distance_array(ag1.positions, ag2.positions, - box=self.u.dimensions) - for j in range(ag1.n_atoms): - for k in range(ag2.n_atoms): - count = np.histogram(result[j, k], **self.rdf_settings)[0] - self.count[i][j, k, :] += count + pairs, dist = distances.capped_distance(ag1.positions, + ag2.positions, + self._maxrange, + box=self.u.dimensions) + + for j, (idx1, idx2) in enumerate(pairs): + self.count[i][idx1, idx2, :] += np.histogram(dist[j], + **self.rdf_settings)[0] self.volume += self._ts.volume @@ -385,4 +386,4 @@ def get_cdf(self): # self.cdf is a list of cdf between pairs of AtomGroups in ags self.cdf = cdf - return cdf \ No newline at end of file + return cdf From bb55d16ac6a8a71dfca60933be3cf14a54b7a7e8 Mon Sep 17 00:00:00 2001 From: zeman Date: Mon, 3 Sep 2018 09:15:24 +0200 Subject: [PATCH 421/455] improved docstrings in lib/_augment.pyx --- package/MDAnalysis/lib/_augment.pyx | 683 ++++++++++++++-------------- 1 file changed, 341 insertions(+), 342 deletions(-) diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index a1f90631dfe..9e8fe263c76 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -1,342 +1,341 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 -# -# MDAnalysis --- https://www.mdanalysis.org -# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors -# (see the file AUTHORS for the full list of names) -# -# Released under the GNU Public Licence, v2 or any higher version -# -# Please cite your use of MDAnalysis in published work: -# -# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, -# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. -# MDAnalysis: A Python package for the rapid analysis of molecular dynamics -# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th -# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. -# -# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. -# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. -# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 -# -# - -import cython -import numpy as np -from .mdamath import triclinic_vectors -cimport numpy as np -cimport _cutil -from _cutil cimport _dot ,_norm, _cross - -from libcpp.vector cimport vector - - -__all__ = ['augment_coordinates', 'undo_augment'] - - -@cython.boundscheck(False) -@cython.wraparound(False) -def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): - r"""Calculates the relevant images of particles which are within a - distance 'r' from the box walls - - The algorithm works by generating explicit periodic images of - interior atoms residing close to any of the six box walls. - The steps involved in generating images involves - evaluation of reciprocal vectors for the given box vectors - followed by calculation of projection distance of atom along the - reciprocal vectors. If the distance is less than a - specified cutoff distance, relevant periodic images are generated - using box translation vectors i.e. ``l[a] + m[b] + n[c]``, where - ``[l, m, n]`` are the neighbouring cell indices relative to the central cell, - and ``[a, b, c]`` are the box vectors. For instance, an atom close to - ``XY`` plane containing origin will generate a periodic image - outside the central cell and close to the opposite `XY` plane - of the box i.e. at ``0[a] + 0[b] + 1[c]``. - Similarly, if the particle is close to more than - one box walls, images along the diagonals are also generated :: - - - | x x - +---------------+ | +---------------+ - | | | | | - | | | | | - | | | | | - | o | | x | o | - +---------------+ | +---------------+ - | - - - - Parameters - ---------- - coordinates : array - Input coordinate array to generate duplicate images - in the vicinity of the central cell. All the coordinates - must be within the primary unit cell. (dtype = numpy.float32) - box : array - Box dimension of shape (6, ). The dimensions must be - provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx, ly, lz, alpha, beta, gamma]`` (dtype = numpy.float32) - r : float - thickness of cutoff region for duplicate image generation - - Returns - ------- - output : array - coordinates of duplicate(augmented) particles (dtype = numpy.float32) - indices : array - original indices of the augmented coordinates (dtype = numpy.int64) - A map which translates the indices of augmented particles - to their original particle index such that - ``indices[augmentedindex] = originalindex`` - - Note - ---- - Output doesnot return coordinates from the initial array. - To merge the particles with their respective images, following operation - needs to be superseded after generating the images: - - .. code-block:: python - - images, mapping = augment_coordinates(coordinates, box, max_cutoff) - all_coords = np.concatenate([coordinates, images]) - - - See Also - -------- - MDAnalysis.lib._augment.undo_augment - - - .. versionadded:: 0.19.0 - """ - cdef bint lo_x, hi_x, lo_y, hi_y, lo_z, hi_z - cdef int i, j, N - cdef float norm - cdef float shiftX[3] - cdef float shiftY[3] - cdef float shiftZ[3] - cdef float coord[3] - cdef float end[3] - cdef float other[3] - cdef float dm[3][3] - cdef float reciprocal[3][3] - - dm = triclinic_vectors(box) - - for i in range(3): - shiftX[i] = dm[0][i] - shiftY[i] = dm[1][i] - shiftZ[i] = dm[2][i] - end[i] = dm[0][i] + dm[1][i] + dm[2][i] - # Calculate reciprocal vectors - _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) - _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) - _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) - # Normalize - for i in range(3): - norm = _norm(&reciprocal[i][0]) - for j in range(3): - reciprocal[i][j] = reciprocal[i][j]/norm - - N = coordinates.shape[0] - - cdef vector[float] output - cdef vector[int] indices - - for i in range(N): - for j in range(3): - coord[j] = coordinates[i, j] - other[j] = end[j] - coordinates[i, j] - # identify the condition - lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r - hi_x = _dot(&other[0], &reciprocal[0][0]) <= r - lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r - hi_y = _dot(&other[0], &reciprocal[1][0]) <= r - lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r - hi_z = _dot(&other[0], &reciprocal[2][0]) <= r - - if lo_x: - # if X, face piece - for j in range(3): - # add to output - output.push_back(coord[j] + shiftX[j]) - # keep record of which index this augmented - # position was created from - indices.push_back(i) - - if lo_y: - # if X&Y, edge piece - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftY[j]) - indices.push_back(i) - - if lo_z: - # if X&Y&Z, corner piece - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_y: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_x: - for j in range(3): - output.push_back(coord[j] - shiftX[j]) - indices.push_back(i) - - if lo_y: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_y: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftZ[j]) - indices.push_back(i) - - if lo_y: - for j in range(3): - output.push_back(coord[j] + shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftY[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_y: - for j in range(3): - output.push_back(coord[j] - shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftY[j] - shiftZ[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftZ[j]) - indices.push_back(i) - n = indices.size() - return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) - - -@cython.boundscheck(False) -@cython.wraparound(False) -def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): - """Translate augmented indices back to original indices - - Parameters - ---------- - results : numpy.ndarray - indices of coordinates, including "augmented" indices (dtype = numpy.int64) - translation : numpy.ndarray - Map to link the augmented indices to the original particle indices - such that ``translation[augmentedindex] = originalindex`` - (dtype = numpy.int64) - nreal : int - number of real coordinates, i.e. values in results equal or larger - than this need to be translated to their real counterpart - - - Returns - ------- - results : numpy.ndarray - modified input results with all the augmented indices - translated to their corresponding initial original indices - (dtype = numpy.int64) - - Note - ---- - Modifies the results array in place - - See Also - -------- - 'MDAnalysis.lib._augment.augment_coordinates' - - - .. versionadded:: 0.19.0 - """ - cdef int N - cdef ssize_t i - N = results.shape[0] - - for i in range(N): - if results[i] >= nreal: - results[i] = translation[results[i] - nreal] - return np.asarray(results, dtype=np.int64) +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +# + +import cython +import numpy as np +from .mdamath import triclinic_vectors +cimport numpy as np +cimport _cutil +from _cutil cimport _dot ,_norm, _cross + +from libcpp.vector cimport vector + + +__all__ = ['augment_coordinates', 'undo_augment'] + + +@cython.boundscheck(False) +@cython.wraparound(False) +def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): + r"""Calculates the relevant images of particles which are within a + distance 'r' from the box walls + + The algorithm works by generating explicit periodic images of + interior atoms residing close to any of the six box walls. + The steps involved in generating images involves + evaluation of reciprocal vectors for the given box vectors + followed by calculation of projection distance of atom along the + reciprocal vectors. If the distance is less than a + specified cutoff distance, relevant periodic images are generated + using box translation vectors i.e. ``l[a] + m[b] + n[c]``, where + ``[l, m, n]`` are the neighbouring cell indices relative to the central cell, + and ``[a, b, c]`` are the box vectors. For instance, an atom close to + ``XY`` plane containing origin will generate a periodic image + outside the central cell and close to the opposite `XY` plane + of the box i.e. at ``0[a] + 0[b] + 1[c]``. + Similarly, if the particle is close to more than + one box walls, images along the diagonals are also generated :: + + + | x x + +---------------+ | +---------------+ + | | | | | + | | | | | + | | | | | + | o | | x | o | + +---------------+ | +---------------+ + | + + + + Parameters + ---------- + coordinates : numpy.ndarray + Input coordinate array of dtype ``numpy.float32`` used to generate + duplicate images in the vicinity of the central cell. All coordinates + must be within the primary unit cell. + box : numpy.ndarray + Box dimensions of shape ``(6,)`` and dtype ``numpy.float32``. The + dimensions must be provided in the same format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx, ly, lz, alpha, beta, gamma]`` + r : float + Thickness of cutoff region for duplicate image generation. + + Returns + ------- + output : numpy.ndarray + Coordinates of duplicate (augmented) particles (dtype ``numpy.float32``). + indices : numpy.ndarray + Original indices of the augmented coordinates (dtype ``numpy.int64``). + Maps the indices of augmented particles to their original particle index + such that ``indices[augmented_index] = original_index``. + + Note + ---- + Output does not return coordinates from the initial array. + To merge the particles with their respective images, the following operation + is necessary when generating the images: + + .. code-block:: python + + images, mapping = augment_coordinates(coordinates, box, max_cutoff) + all_coords = np.concatenate([coordinates, images]) + + + See Also + -------- + :meth:`undo_augment` + + + .. versionadded:: 0.19.0 + """ + cdef bint lo_x, hi_x, lo_y, hi_y, lo_z, hi_z + cdef int i, j, N + cdef float norm + cdef float shiftX[3] + cdef float shiftY[3] + cdef float shiftZ[3] + cdef float coord[3] + cdef float end[3] + cdef float other[3] + cdef float dm[3][3] + cdef float reciprocal[3][3] + + dm = triclinic_vectors(box) + + for i in range(3): + shiftX[i] = dm[0][i] + shiftY[i] = dm[1][i] + shiftZ[i] = dm[2][i] + end[i] = dm[0][i] + dm[1][i] + dm[2][i] + # Calculate reciprocal vectors + _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) + _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) + _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) + # Normalize + for i in range(3): + norm = _norm(&reciprocal[i][0]) + for j in range(3): + reciprocal[i][j] = reciprocal[i][j]/norm + + N = coordinates.shape[0] + + cdef vector[float] output + cdef vector[int] indices + + for i in range(N): + for j in range(3): + coord[j] = coordinates[i, j] + other[j] = end[j] - coordinates[i, j] + # identify the condition + lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r + hi_x = _dot(&other[0], &reciprocal[0][0]) <= r + lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r + hi_y = _dot(&other[0], &reciprocal[1][0]) <= r + lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r + hi_z = _dot(&other[0], &reciprocal[2][0]) <= r + + if lo_x: + # if X, face piece + for j in range(3): + # add to output + output.push_back(coord[j] + shiftX[j]) + # keep record of which index this augmented + # position was created from + indices.push_back(i) + + if lo_y: + # if X&Y, edge piece + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + # if X&Y&Z, corner piece + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_x: + for j in range(3): + output.push_back(coord[j] - shiftX[j]) + indices.push_back(i) + + if lo_y: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftZ[j]) + indices.push_back(i) + + if lo_y: + for j in range(3): + output.push_back(coord[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftZ[j]) + indices.push_back(i) + n = indices.size() + return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) + + +@cython.boundscheck(False) +@cython.wraparound(False) +def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): + """Translate augmented indices back to original indices + + Parameters + ---------- + results : numpy.ndarray + Array of coordinate indices (dtype ``numpy.int64``), including "augmented" + indices. + translation : numpy.ndarray + Map to link the augmented indices to the original particle indices + such that ``translation[augmentedindex] = originalindex`` + (dtype = numpy.int64) + nreal : int + number of real coordinates, i.e. values in results equal or larger + than this need to be translated to their real counterpart + + + Returns + ------- + results : numpy.ndarray + Modified input `results` with all the augmented indices translated to + their corresponding initial original indices (dtype ``numpy.int64``) + + Note + ---- + Modifies the results array in place. + + See Also + -------- + :meth:`augment_coordinates` + + + .. versionadded:: 0.19.0 + """ + cdef int N + cdef ssize_t i + N = results.shape[0] + + for i in range(N): + if results[i] >= nreal: + results[i] = translation[results[i] - nreal] + return np.asarray(results, dtype=np.int64) From 59860e70b765e75bd62e0ea653e3ca0988c06546 Mon Sep 17 00:00:00 2001 From: zeman Date: Mon, 3 Sep 2018 15:36:02 +0200 Subject: [PATCH 422/455] improved docstrings in lib/_augment.pyx --- package/MDAnalysis/lib/_augment.pyx | 82 ++++++++++++++--------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index 9e8fe263c76..3dd6bca90a9 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -37,43 +37,44 @@ __all__ = ['augment_coordinates', 'undo_augment'] @cython.boundscheck(False) @cython.wraparound(False) def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): - r"""Calculates the relevant images of particles which are within a - distance 'r' from the box walls - - The algorithm works by generating explicit periodic images of - interior atoms residing close to any of the six box walls. - The steps involved in generating images involves - evaluation of reciprocal vectors for the given box vectors - followed by calculation of projection distance of atom along the - reciprocal vectors. If the distance is less than a - specified cutoff distance, relevant periodic images are generated - using box translation vectors i.e. ``l[a] + m[b] + n[c]``, where - ``[l, m, n]`` are the neighbouring cell indices relative to the central cell, - and ``[a, b, c]`` are the box vectors. For instance, an atom close to - ``XY`` plane containing origin will generate a periodic image - outside the central cell and close to the opposite `XY` plane - of the box i.e. at ``0[a] + 0[b] + 1[c]``. - Similarly, if the particle is close to more than - one box walls, images along the diagonals are also generated :: - - - | x x - +---------------+ | +---------------+ - | | | | | - | | | | | - | | | | | - | o | | x | o | - +---------------+ | +---------------+ - | - - + r"""Calculates the periodic images of particles which are within a distance + `r` from the box walls. + + The algorithm works by generating explicit periodic images of atoms residing + close to any of the six box walls. The steps involved in generating images + involves the evaluation of reciprocal box vectors followed by the + calculation of distances of atoms from the walls by means of projection onto + the reciprocal vectors. If the distance is less than a specified cutoff + distance, relevant periodic images are generated using box translation + vectors :math:`\vec{t}` with + + .. math:: \vec{t}=l\cdot\vec{a}+m\cdot\vec{b}+n\cdot \vec{c}\,, + + where :math:`l,\,m,\,n \in \{-1,\,0,\,1\}` are the neighboring cell indices + in :math:`x`-, :math:`y`-, and :math:`z`-direction relative to the central + cell with box vectors :math:`\vec{a},\,\vec{b},\,\vec{c}`. + + For instance, an atom close to the :math:`xy`-plane containing the origin + will generate a periodic image outside the central cell and close to the + opposite :math:`xy`-plane of the box, i.e., shifted by + :math:`\vec{t} = 0\cdot\vec{a}+0\cdot\vec{b}+1\cdot\vec{c}=\vec{c}`. + + Likewise, if the particle is close to more than one box walls, images along + the diagonals are also generated:: + + x x + +------------+ +------------+ + | | augment | | + | | -------> | | + | o | x | o | + +------------+ +------------+ Parameters ---------- coordinates : numpy.ndarray - Input coordinate array of dtype ``numpy.float32`` used to generate - duplicate images in the vicinity of the central cell. All coordinates - must be within the primary unit cell. + Input coordinate array of shape ``(n, 3)`` and dtype ``numpy.float32`` + used to generate duplicate images in the vicinity of the central cell. All + coordinates must be within the primary unit cell. box : numpy.ndarray Box dimensions of shape ``(6,)`` and dtype ``numpy.float32``. The dimensions must be provided in the same format as returned @@ -100,7 +101,7 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): .. code-block:: python images, mapping = augment_coordinates(coordinates, box, max_cutoff) - all_coords = np.concatenate([coordinates, images]) + all_coords = numpy.concatenate([coordinates, images]) See Also @@ -303,17 +304,16 @@ def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): Parameters ---------- results : numpy.ndarray - Array of coordinate indices (dtype ``numpy.int64``), including "augmented" - indices. + Array of coordinate indices with dtype ``numpy.int64``, including + "augmented" indices. translation : numpy.ndarray - Map to link the augmented indices to the original particle indices - such that ``translation[augmentedindex] = originalindex`` - (dtype = numpy.int64) + Index map (dtype ``numpy.int64``) linking the augmented indices to the + original particle indices such that + ``translation[augmented_index] = real_index`` nreal : int - number of real coordinates, i.e. values in results equal or larger + Number of real coordinates, i.e., values in results equal or larger than this need to be translated to their real counterpart - Returns ------- results : numpy.ndarray From 280efad6da31dd463c4b1c852f2b963b950bd662 Mon Sep 17 00:00:00 2001 From: zeman Date: Mon, 3 Sep 2018 16:25:41 +0200 Subject: [PATCH 423/455] improved docstrings in lib/_augment.pyx --- package/MDAnalysis/lib/_augment.pyx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index 3dd6bca90a9..b9dd8cfba9f 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -299,26 +299,26 @@ def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): @cython.boundscheck(False) @cython.wraparound(False) def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): - """Translate augmented indices back to original indices + """Translate augmented indices back to original indices. Parameters ---------- results : numpy.ndarray - Array of coordinate indices with dtype ``numpy.int64``, including + Array of dtype ``numpy.int64`` containing coordinate indices, including "augmented" indices. translation : numpy.ndarray - Index map (dtype ``numpy.int64``) linking the augmented indices to the + Index map of dtype ``numpy.int64`` linking the augmented indices to the original particle indices such that - ``translation[augmented_index] = real_index`` + ``translation[augmented_index] = original_index``. nreal : int - Number of real coordinates, i.e., values in results equal or larger - than this need to be translated to their real counterpart + Number of real coordinates, i.e., indices in `results` equal or larger + than this need to be mapped to their real counterpart. Returns ------- results : numpy.ndarray Modified input `results` with all the augmented indices translated to - their corresponding initial original indices (dtype ``numpy.int64``) + their corresponding initial original indices. Note ---- From cd58ce0797b466d3a584beda765b58abce7f9ec2 Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Fri, 7 Sep 2018 16:56:34 +0200 Subject: [PATCH 424/455] Improved docstrings in lib/_augment.pyx (#2062) * added missing CHANGELOG entry for PR #2048 * ensured `lib.distances.distance_array()` always returns an array --- package/CHANGELOG | 6 +- package/MDAnalysis/lib/_augment.pyx | 683 ++++++++++++++-------------- package/MDAnalysis/lib/distances.py | 2 +- 3 files changed, 347 insertions(+), 344 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index b68281d2d42..24135804b36 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -80,7 +80,8 @@ Enhancements * Added dihedrals.py with Dihedral, Ramachandran, and Janin classes to analysis module (PR #1997, PR #2033) * Added the analysis.data module for reference data used in analysis (PR #2033) - * Added dihedrals.py with Ramachandran class to analysis module + * Most functions in `MDanalysis.lib.distances` previously only accepting + arrays of coordinates now also accept single coordinates as input (PR #2048) * Performance improvements to make_whole (PR #1965) * Performance improvements to fragment finding (PR #2028) @@ -120,6 +121,9 @@ Changes (Issue #1894) * removed unused function MDAnalysis.lb.mdamath.one_to_many_pointers() (issue #2010) + * Box input for functions in `MDAnalysis.lib.distances` is now consistently + enforced to be of the form ``[lx, ly, lz, alpha, beta, gamma]`` as required + by the docs (Issue #2046, PR #2048) * Added periodic keyword to select_atoms (#759) Deprecations diff --git a/package/MDAnalysis/lib/_augment.pyx b/package/MDAnalysis/lib/_augment.pyx index a1f90631dfe..b9dd8cfba9f 100644 --- a/package/MDAnalysis/lib/_augment.pyx +++ b/package/MDAnalysis/lib/_augment.pyx @@ -1,342 +1,341 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 -# -# MDAnalysis --- https://www.mdanalysis.org -# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors -# (see the file AUTHORS for the full list of names) -# -# Released under the GNU Public Licence, v2 or any higher version -# -# Please cite your use of MDAnalysis in published work: -# -# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, -# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. -# MDAnalysis: A Python package for the rapid analysis of molecular dynamics -# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th -# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. -# -# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. -# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. -# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 -# -# - -import cython -import numpy as np -from .mdamath import triclinic_vectors -cimport numpy as np -cimport _cutil -from _cutil cimport _dot ,_norm, _cross - -from libcpp.vector cimport vector - - -__all__ = ['augment_coordinates', 'undo_augment'] - - -@cython.boundscheck(False) -@cython.wraparound(False) -def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): - r"""Calculates the relevant images of particles which are within a - distance 'r' from the box walls - - The algorithm works by generating explicit periodic images of - interior atoms residing close to any of the six box walls. - The steps involved in generating images involves - evaluation of reciprocal vectors for the given box vectors - followed by calculation of projection distance of atom along the - reciprocal vectors. If the distance is less than a - specified cutoff distance, relevant periodic images are generated - using box translation vectors i.e. ``l[a] + m[b] + n[c]``, where - ``[l, m, n]`` are the neighbouring cell indices relative to the central cell, - and ``[a, b, c]`` are the box vectors. For instance, an atom close to - ``XY`` plane containing origin will generate a periodic image - outside the central cell and close to the opposite `XY` plane - of the box i.e. at ``0[a] + 0[b] + 1[c]``. - Similarly, if the particle is close to more than - one box walls, images along the diagonals are also generated :: - - - | x x - +---------------+ | +---------------+ - | | | | | - | | | | | - | | | | | - | o | | x | o | - +---------------+ | +---------------+ - | - - - - Parameters - ---------- - coordinates : array - Input coordinate array to generate duplicate images - in the vicinity of the central cell. All the coordinates - must be within the primary unit cell. (dtype = numpy.float32) - box : array - Box dimension of shape (6, ). The dimensions must be - provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx, ly, lz, alpha, beta, gamma]`` (dtype = numpy.float32) - r : float - thickness of cutoff region for duplicate image generation - - Returns - ------- - output : array - coordinates of duplicate(augmented) particles (dtype = numpy.float32) - indices : array - original indices of the augmented coordinates (dtype = numpy.int64) - A map which translates the indices of augmented particles - to their original particle index such that - ``indices[augmentedindex] = originalindex`` - - Note - ---- - Output doesnot return coordinates from the initial array. - To merge the particles with their respective images, following operation - needs to be superseded after generating the images: - - .. code-block:: python - - images, mapping = augment_coordinates(coordinates, box, max_cutoff) - all_coords = np.concatenate([coordinates, images]) - - - See Also - -------- - MDAnalysis.lib._augment.undo_augment - - - .. versionadded:: 0.19.0 - """ - cdef bint lo_x, hi_x, lo_y, hi_y, lo_z, hi_z - cdef int i, j, N - cdef float norm - cdef float shiftX[3] - cdef float shiftY[3] - cdef float shiftZ[3] - cdef float coord[3] - cdef float end[3] - cdef float other[3] - cdef float dm[3][3] - cdef float reciprocal[3][3] - - dm = triclinic_vectors(box) - - for i in range(3): - shiftX[i] = dm[0][i] - shiftY[i] = dm[1][i] - shiftZ[i] = dm[2][i] - end[i] = dm[0][i] + dm[1][i] + dm[2][i] - # Calculate reciprocal vectors - _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) - _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) - _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) - # Normalize - for i in range(3): - norm = _norm(&reciprocal[i][0]) - for j in range(3): - reciprocal[i][j] = reciprocal[i][j]/norm - - N = coordinates.shape[0] - - cdef vector[float] output - cdef vector[int] indices - - for i in range(N): - for j in range(3): - coord[j] = coordinates[i, j] - other[j] = end[j] - coordinates[i, j] - # identify the condition - lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r - hi_x = _dot(&other[0], &reciprocal[0][0]) <= r - lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r - hi_y = _dot(&other[0], &reciprocal[1][0]) <= r - lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r - hi_z = _dot(&other[0], &reciprocal[2][0]) <= r - - if lo_x: - # if X, face piece - for j in range(3): - # add to output - output.push_back(coord[j] + shiftX[j]) - # keep record of which index this augmented - # position was created from - indices.push_back(i) - - if lo_y: - # if X&Y, edge piece - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftY[j]) - indices.push_back(i) - - if lo_z: - # if X&Y&Z, corner piece - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_y: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftX[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_x: - for j in range(3): - output.push_back(coord[j] - shiftX[j]) - indices.push_back(i) - - if lo_y: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_y: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftX[j] - shiftZ[j]) - indices.push_back(i) - - if lo_y: - for j in range(3): - output.push_back(coord[j] + shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] + shiftY[j] - shiftZ[j]) - indices.push_back(i) - - elif hi_y: - for j in range(3): - output.push_back(coord[j] - shiftY[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] - shiftY[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftY[j] - shiftZ[j]) - indices.push_back(i) - - if lo_z: - for j in range(3): - output.push_back(coord[j] + shiftZ[j]) - indices.push_back(i) - - elif hi_z: - for j in range(3): - output.push_back(coord[j] - shiftZ[j]) - indices.push_back(i) - n = indices.size() - return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) - - -@cython.boundscheck(False) -@cython.wraparound(False) -def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): - """Translate augmented indices back to original indices - - Parameters - ---------- - results : numpy.ndarray - indices of coordinates, including "augmented" indices (dtype = numpy.int64) - translation : numpy.ndarray - Map to link the augmented indices to the original particle indices - such that ``translation[augmentedindex] = originalindex`` - (dtype = numpy.int64) - nreal : int - number of real coordinates, i.e. values in results equal or larger - than this need to be translated to their real counterpart - - - Returns - ------- - results : numpy.ndarray - modified input results with all the augmented indices - translated to their corresponding initial original indices - (dtype = numpy.int64) - - Note - ---- - Modifies the results array in place - - See Also - -------- - 'MDAnalysis.lib._augment.augment_coordinates' - - - .. versionadded:: 0.19.0 - """ - cdef int N - cdef ssize_t i - N = results.shape[0] - - for i in range(N): - if results[i] >= nreal: - results[i] = translation[results[i] - nreal] - return np.asarray(results, dtype=np.int64) +# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# +# MDAnalysis --- https://www.mdanalysis.org +# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors +# (see the file AUTHORS for the full list of names) +# +# Released under the GNU Public Licence, v2 or any higher version +# +# Please cite your use of MDAnalysis in published work: +# +# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, +# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. +# MDAnalysis: A Python package for the rapid analysis of molecular dynamics +# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th +# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. +# +# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. +# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. +# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 +# +# + +import cython +import numpy as np +from .mdamath import triclinic_vectors +cimport numpy as np +cimport _cutil +from _cutil cimport _dot ,_norm, _cross + +from libcpp.vector cimport vector + + +__all__ = ['augment_coordinates', 'undo_augment'] + + +@cython.boundscheck(False) +@cython.wraparound(False) +def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): + r"""Calculates the periodic images of particles which are within a distance + `r` from the box walls. + + The algorithm works by generating explicit periodic images of atoms residing + close to any of the six box walls. The steps involved in generating images + involves the evaluation of reciprocal box vectors followed by the + calculation of distances of atoms from the walls by means of projection onto + the reciprocal vectors. If the distance is less than a specified cutoff + distance, relevant periodic images are generated using box translation + vectors :math:`\vec{t}` with + + .. math:: \vec{t}=l\cdot\vec{a}+m\cdot\vec{b}+n\cdot \vec{c}\,, + + where :math:`l,\,m,\,n \in \{-1,\,0,\,1\}` are the neighboring cell indices + in :math:`x`-, :math:`y`-, and :math:`z`-direction relative to the central + cell with box vectors :math:`\vec{a},\,\vec{b},\,\vec{c}`. + + For instance, an atom close to the :math:`xy`-plane containing the origin + will generate a periodic image outside the central cell and close to the + opposite :math:`xy`-plane of the box, i.e., shifted by + :math:`\vec{t} = 0\cdot\vec{a}+0\cdot\vec{b}+1\cdot\vec{c}=\vec{c}`. + + Likewise, if the particle is close to more than one box walls, images along + the diagonals are also generated:: + + x x + +------------+ +------------+ + | | augment | | + | | -------> | | + | o | x | o | + +------------+ +------------+ + + Parameters + ---------- + coordinates : numpy.ndarray + Input coordinate array of shape ``(n, 3)`` and dtype ``numpy.float32`` + used to generate duplicate images in the vicinity of the central cell. All + coordinates must be within the primary unit cell. + box : numpy.ndarray + Box dimensions of shape ``(6,)`` and dtype ``numpy.float32``. The + dimensions must be provided in the same format as returned + by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: + ``[lx, ly, lz, alpha, beta, gamma]`` + r : float + Thickness of cutoff region for duplicate image generation. + + Returns + ------- + output : numpy.ndarray + Coordinates of duplicate (augmented) particles (dtype ``numpy.float32``). + indices : numpy.ndarray + Original indices of the augmented coordinates (dtype ``numpy.int64``). + Maps the indices of augmented particles to their original particle index + such that ``indices[augmented_index] = original_index``. + + Note + ---- + Output does not return coordinates from the initial array. + To merge the particles with their respective images, the following operation + is necessary when generating the images: + + .. code-block:: python + + images, mapping = augment_coordinates(coordinates, box, max_cutoff) + all_coords = numpy.concatenate([coordinates, images]) + + + See Also + -------- + :meth:`undo_augment` + + + .. versionadded:: 0.19.0 + """ + cdef bint lo_x, hi_x, lo_y, hi_y, lo_z, hi_z + cdef int i, j, N + cdef float norm + cdef float shiftX[3] + cdef float shiftY[3] + cdef float shiftZ[3] + cdef float coord[3] + cdef float end[3] + cdef float other[3] + cdef float dm[3][3] + cdef float reciprocal[3][3] + + dm = triclinic_vectors(box) + + for i in range(3): + shiftX[i] = dm[0][i] + shiftY[i] = dm[1][i] + shiftZ[i] = dm[2][i] + end[i] = dm[0][i] + dm[1][i] + dm[2][i] + # Calculate reciprocal vectors + _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) + _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) + _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) + # Normalize + for i in range(3): + norm = _norm(&reciprocal[i][0]) + for j in range(3): + reciprocal[i][j] = reciprocal[i][j]/norm + + N = coordinates.shape[0] + + cdef vector[float] output + cdef vector[int] indices + + for i in range(N): + for j in range(3): + coord[j] = coordinates[i, j] + other[j] = end[j] - coordinates[i, j] + # identify the condition + lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r + hi_x = _dot(&other[0], &reciprocal[0][0]) <= r + lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r + hi_y = _dot(&other[0], &reciprocal[1][0]) <= r + lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r + hi_z = _dot(&other[0], &reciprocal[2][0]) <= r + + if lo_x: + # if X, face piece + for j in range(3): + # add to output + output.push_back(coord[j] + shiftX[j]) + # keep record of which index this augmented + # position was created from + indices.push_back(i) + + if lo_y: + # if X&Y, edge piece + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + # if X&Y&Z, corner piece + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftX[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_x: + for j in range(3): + output.push_back(coord[j] - shiftX[j]) + indices.push_back(i) + + if lo_y: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftX[j] - shiftZ[j]) + indices.push_back(i) + + if lo_y: + for j in range(3): + output.push_back(coord[j] + shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] + shiftY[j] - shiftZ[j]) + indices.push_back(i) + + elif hi_y: + for j in range(3): + output.push_back(coord[j] - shiftY[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] - shiftY[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftY[j] - shiftZ[j]) + indices.push_back(i) + + if lo_z: + for j in range(3): + output.push_back(coord[j] + shiftZ[j]) + indices.push_back(i) + + elif hi_z: + for j in range(3): + output.push_back(coord[j] - shiftZ[j]) + indices.push_back(i) + n = indices.size() + return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) + + +@cython.boundscheck(False) +@cython.wraparound(False) +def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): + """Translate augmented indices back to original indices. + + Parameters + ---------- + results : numpy.ndarray + Array of dtype ``numpy.int64`` containing coordinate indices, including + "augmented" indices. + translation : numpy.ndarray + Index map of dtype ``numpy.int64`` linking the augmented indices to the + original particle indices such that + ``translation[augmented_index] = original_index``. + nreal : int + Number of real coordinates, i.e., indices in `results` equal or larger + than this need to be mapped to their real counterpart. + + Returns + ------- + results : numpy.ndarray + Modified input `results` with all the augmented indices translated to + their corresponding initial original indices. + + Note + ---- + Modifies the results array in place. + + See Also + -------- + :meth:`augment_coordinates` + + + .. versionadded:: 0.19.0 + """ + cdef int N + cdef ssize_t i + N = results.shape[0] + + for i in range(N): + if results[i] >= nreal: + results[i] = translation[results[i] - nreal] + return np.asarray(results, dtype=np.int64) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 25d2822fd0f..3709d390e16 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -221,7 +221,7 @@ def _check_result_array(result, shape): return result @check_coords('reference', 'configuration', enforce_copy=False, - check_lengths_match=False) + reduce_result_if_single=False, check_lengths_match=False) def distance_array(reference, configuration, box=None, result=None, backend="serial"): """Calculate all distances between a reference set and another configuration. From 4e0cf0ffc7a1cc508a1c5afc8cb52e52003f16d3 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Sun, 9 Sep 2018 22:36:13 -0700 Subject: [PATCH 425/455] pin numpy version for Python 3.4 - NUMPY_VERSION=1.14 (last version known to be compatible with Python 3.4 when installed via conda and conda-forge channel) - fix #2066 - This is a band-aid and should be reverted if the dependencies in the conda-forge packages have been corrected. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 941a7eb0436..7f22990a3bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ env: # Run a coverage test for most versions - CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - PYTHON_VERSION=3.6 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - - PYTHON_VERSION=3.4 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" + - PYTHON_VERSION=3.4 NUMPY_VERSION=1.14 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - PYTHON_VERSION=2.7 CODECOV="true" SETUP_CMD="${PYTEST_FLAGS} --cov=MDAnalysis" - NUMPY_VERSION=1.10.4 - NUMPY_VERSION=dev EVENT_TYPE="cron" From ddb598c05d1de4f12e585a82706f617aa3f1c20e Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Mon, 10 Sep 2018 09:49:03 +0200 Subject: [PATCH 426/455] auto-update conda in appveyor builds --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index 988a4535a29..886b9be8b77 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -47,6 +47,7 @@ install: # deal with missing stdint.h as previously described # see: https://github.com/swistakm/pyimgui/blob/master/.appveyor.yml - cp "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h" "C:\Users\appveyor\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include\stdint.h" + - ps: conda update -n base -c defaults conda - ps: conda config --append channels conda-forge - ps: conda create -n testing python=$env:PYTHON_VERSION pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis pytest-cov codecov - cmd: C:\conda\envs\testing\Scripts\pip.exe install gsd==1.5.2 duecredit From b01f7f3b76555c52719878cf91d669ac0f52554f Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Mon, 10 Sep 2018 10:20:46 +0200 Subject: [PATCH 427/455] use conda.exe to build testing env --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 886b9be8b77..052ea71cc42 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -49,7 +49,7 @@ install: - cp "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h" "C:\Users\appveyor\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include\stdint.h" - ps: conda update -n base -c defaults conda - ps: conda config --append channels conda-forge - - ps: conda create -n testing python=$env:PYTHON_VERSION pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis pytest-cov codecov + - ps: conda.exe create -n testing python=$env:PYTHON_VERSION pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis pytest-cov codecov - cmd: C:\conda\envs\testing\Scripts\pip.exe install gsd==1.5.2 duecredit - cmd: C:\conda\envs\testing\Scripts\activate testing From 94a8920de0be452d96d2ee2cd514e598b533b40b Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Mon, 10 Sep 2018 18:18:12 +0200 Subject: [PATCH 428/455] fixed .appveyor.yml --- .appveyor.yml | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 052ea71cc42..46eb1b4359d 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -12,6 +12,10 @@ image: environment: global: + CONDA_CHANNELS: conda-forge + CONDA_DEPENDENCIES: pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis pytest-cov codecov + PIP_DEPENDENCIES: gsd==1.5.2 duecredit + DEBUG: "False" MINGW_64: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin OPENBLAS_64: https://3f23b170c54c2533c070-1c8a9b3114517dc5fe17b7c3f8c63a43.ssl.cf2.rackcdn.com/openblas-5f998ef_gcc7_1_0_win64.zip APPVEYOR_SAVE_CACHE_ON_ERROR: true @@ -19,17 +23,15 @@ environment: TEST_TIMEOUT: 1000 PYTHON: "C:\\conda" MINICONDA_VERSION: "latest" - CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci-helpers\\appveyor\\windows_sdk.cmd" matrix: - - PYTHON_VERSION: 3.6 PYTHON_ARCH: 64 MSVC_VERSION: "Visual Studio 10 Win64" init: - - "ECHO %PYTHON% %PYTHON_VERSION% %PYTHON_ARCH%" - - "ECHO \"%APPVEYOR_SCHEDULED_BUILD%\"" + - ps: Write-Host ${env:PYTHON} ${env:PYTHON_VERSION} ${env:PYTHON_ARCH} + - ps: Write-Host ${env:APPVEYOR_SCHEDULED_BUILD} # cancel build if newer one is submitted; complicated # details for getting this to work are credited to JuliaLang # developers @@ -41,27 +43,23 @@ init: install: # set up a conda env - - "git clone --depth 1 git://github.com/astropy/ci-helpers.git" - - "powershell ci-helpers/appveyor/install-miniconda.ps1" - - SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH% + - ps: git clone -q --depth 1 git://github.com/astropy/ci-helpers.git + - ps: ci-helpers/appveyor/install-miniconda.ps1 + - ps: $env:PATH = "${env:PYTHON};${env:PYTHON}\Scripts;" + $env:PATH # deal with missing stdint.h as previously described - # see: https://github.com/swistakm/pyimgui/blob/master/.appveyor.yml - - cp "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h" "C:\Users\appveyor\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include\stdint.h" - - ps: conda update -n base -c defaults conda - - ps: conda config --append channels conda-forge - - ps: conda.exe create -n testing python=$env:PYTHON_VERSION pip setuptools wheel cython mock six biopython networkx joblib matplotlib scipy vs2015_runtime pytest mmtf-python GridDataFormats hypothesis pytest-cov codecov - - cmd: C:\conda\envs\testing\Scripts\pip.exe install gsd==1.5.2 duecredit - - cmd: C:\conda\envs\testing\Scripts\activate testing + # see https://github.com/swistakm/pyimgui/blob/master/.appveyor.yml + - ps: cp "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h" "C:\Users\appveyor\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\include\stdint.h" + - ps: activate test build_script: - cmd: cd package - - cmd: C:\conda\envs\testing\python.exe setup.py develop --no-deps --user 3>&1 + - cmd: C:\conda\envs\test\python.exe setup.py develop --no-deps --user 3>&1 test_script: - cmd: cd ..\testsuite - - cmd: C:\conda\envs\testing\python.exe setup.py develop --no-deps --user 3>&1 + - cmd: C:\conda\envs\test\python.exe setup.py develop --no-deps --user 3>&1 - cmd: cd MDAnalysisTests - - cmd: C:\conda\envs\testing\Scripts\pytest.exe --cov=MDAnalysis --disable-pytest-warnings 3>&1 + - cmd: C:\conda\envs\test\Scripts\pytest.exe --cov=MDAnalysis --disable-pytest-warnings 3>&1 - cmd: codecov after_build: From bf18cdad0480982a16c5c92e618765409ba7edf0 Mon Sep 17 00:00:00 2001 From: zeman Date: Tue, 11 Sep 2018 18:47:57 +0200 Subject: [PATCH 429/455] improved all docstrings in lib/distances.py --- package/MDAnalysis/lib/distances.py | 1128 ++++++++++++++++----------- 1 file changed, 692 insertions(+), 436 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 3709d390e16..2e646d9bf14 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -24,18 +24,18 @@ """Fast distance array computation --- :mod:`MDAnalysis.lib.distances` =================================================================== -Fast C-routines to calculate distance arrays from coordinate -arrays. Many of the functions also exist in parallel versions, that -typically provide higher performance than the serial code. -The boolean attribute MDAnalysis.lib.distances.USED_OPENMP can be -checked to see if OpenMP was used in the compilation of MDAnalysis. +Fast C-routines to calculate arrays of distances or angles from coordinate +arrays. Many of the functions also exist in parallel versions, which typically +provide higher performance than the serial code. +The boolean attribute `MDAnalysis.lib.distances.USED_OPENMP` can be checked to +see if OpenMP was used in the compilation of MDAnalysis. Selection of acceleration ("backend") ------------------------------------- -All functions take the optional keyword *backend*, which determines -the type of acceleration. Currently, the following choices are -implemented (*backend* is case-insensitive): +All functions take the optional keyword `backend`, which determines the type of +acceleration. Currently, the following choices are implemented (`backend` is +case-insensitive): .. Table:: Available *backends* for accelerated distance functions. @@ -52,20 +52,8 @@ Functions --------- - -.. autofunction:: distance_array(reference, configuration [, box [, result [, backend]]]) -.. autofunction:: self_distance_array(reference [, box [,result [, backend]]]) -.. autofunction:: calc_bonds(atom1, atom2 [, box, [, result [, backend]]]) -.. autofunction:: calc_angles(atom1, atom2, atom3 [,box [, result [, backend]]]) -.. autofunction:: calc_dihedrals(atom1, atom2, atom3, atom4 [,box [, result [, backend]]]) -.. autofunction:: apply_PBC(coordinates, box [, backend]) -.. autofunction:: capped_distance(reference, configuration, max_cutoff [, min_cutoff [, box [, method]]]) -.. autofunction:: self_capped_distance(reference, max_cutoff, [, min_cutoff [, box [, method]]]) -.. autofunction:: transform_RtoS(coordinates, box [, backend]) -.. autofunction:: transform_StoR(coordinates, box [,backend]) -.. autofunction:: MDAnalysis.lib._augment.augment_coordinates(coordinates, box, radius) -.. autofunction:: MDAnalysis.lib._augment.undo_augment(indices, translation, nreal) - +.. autofunction:: augment_coordinates(coordinates, box, r) +.. autofunction:: undo_augment(results, translation, nreal) """ from __future__ import division, absolute_import from six.moves import range @@ -94,15 +82,15 @@ del importlib def _run(funcname, args=None, kwargs=None, backend="serial"): - """Helper function to select a backend function *funcname*.""" + """Helper function to select a backend function `funcname`.""" args = args if args is not None else tuple() kwargs = kwargs if kwargs is not None else dict() backend = backend.lower() try: func = getattr(_distances[backend], funcname) except KeyError: - raise ValueError("Function {0} not available with backend {1}; try one of: {2}".format( - funcname, backend, ", ".join(_distances.keys()))) + raise ValueError("Function {0} not available with backend {1}; try one " + "of: {2}".format(funcname, backend, _distances.keys())) return func(*args, **kwargs) # serial versions are always available (and are typically used within @@ -162,7 +150,7 @@ def _check_box(box): If `box` is not of the form ``[lx, ly, lz, alpha, beta, gamma]`` or contains data that is not convertible to ``numpy.float32``. - .. seealso: :meth:`~MDAnalysis.lib.mdamath.triclinic_vectors` + .. seealso: :meth:`MDAnalysis.lib.mdamath.triclinic_vectors` .. versionchanged: 0.19.0 * Enforced correspondence of `box` with specified format. * Added automatic conversion of input to :class:`numpy.ndarray` with @@ -220,55 +208,59 @@ def _check_result_array(result, shape): # raise ValueError("{0} is not C-contiguous.".format(desc)) return result + @check_coords('reference', 'configuration', enforce_copy=False, reduce_result_if_single=False, check_lengths_match=False) def distance_array(reference, configuration, box=None, result=None, backend="serial"): - """Calculate all distances between a reference set and another configuration. + """Calculate all possible distances between a reference set and another + configuration. - If there are *i* positions in reference, and *j* positions in configuration, - will calculate a *i* x *j* array of distances - If an *box* is supplied then a minimum image convention is used when - calculating distances. + If there are ``n`` positions in `reference` and ``m`` positions in + `configuration`, a distance array of shape ``(n, m)`` will be computed. - If a 2D numpy array of dtype ``numpy.float64`` with the shape ``(len(reference), - len(configuration))`` is provided in *result* then this preallocated array is - filled. This can speed up calculations. + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. + + If a 2D numpy array of dtype ``numpy.float64`` with the shape ``(n, m)`` + is provided in `result`, then this preallocated array is filled. This can + speed up calculations. Parameters ---------- reference : numpy.ndarray - Reference coordinate array of shape ``(n, 3)`` (``dtype`` is arbitrary, - will be converted to ``dtype=numpy.float32`` internally) + Reference coordinate array of shape ``(3,)`` or ``(n, 3)`` (dtype is + arbitrary, will be converted to ``numpy.float32`` internally). configuration : numpy.ndarray - Configuration coordinate array of shape ``(m, 3)`` (``dtype`` is - arbitrary, will be converted to ``dtype=numpy.float32`` internally) - box : numpy.ndarray or None - Dimensions of the cell; if provided, the minimum image convention is - applied. The dimensions must be provided in the same format as returned - by by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, - ly, lz, alpha, beta, gamma]``. - result : numpy.ndarray(dtype=numpy.float64), optional - Preallocated result array which must have the - shape ``(len(ref), len(conf))`` and ``dtype=numpy.float64``. + Configuration coordinate array of shape ``(3,)`` or ``(m, 3)`` (dtype is + arbitrary, will be converted to ``numpy.float32`` internally). + box : array_like, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + result : numpy.ndarray, optional + Preallocated result array which must have the shape ``(n, m)`` and dtype + ``numpy.float64``. Avoids creating the array which saves time when the function - is called repeatedly. [``None``] - backend : str - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + is called repeatedly. + backend : str, optional + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- d : numpy.ndarray - ``(len(reference),len(configuration))`` numpy array with the distances - ``d[i,j]`` between reference coordinates `i` and configuration - coordinates `j`. + Array with shape ``(n, m)`` containing the distances ``d[i,j]`` between + reference coordinates ``i`` and configuration coordinates ``j``. .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. + Now also accepts single coordinates as input. """ confnum = configuration.shape[0] refnum = reference.shape[0] @@ -292,47 +284,50 @@ def distance_array(reference, configuration, box=None, result=None, return distances + @check_coords('reference', enforce_copy=False, reduce_result_if_single=False) def self_distance_array(reference, box=None, result=None, backend="serial"): - """Calculate all distances within a configuration *reference*. + """Calculate all possible distances within a configuration `reference`. - If a *box* is supplied then a minimum image convention is used before - calculating distances. + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. If a 1D numpy array of dtype ``numpy.float64`` with the shape - ``(N*(N-1)/2)`` is provided in *result* then this preallocated array - is filled. This can speed up calculations. + ``(n*(n-1)/2,)`` is provided in `result`, then this preallocated array is + filled. This can speed up calculations. Parameters ---------- reference : numpy.ndarray - Reference coordinate array with ``N=len(ref)`` coordinates (``dtype`` is - arbitrary, will be converted to ``dtype=numpy.float32`` internally) - box : numpy.ndarray or None - Dimensions of the cell; if provided, the minimum image convention is - applied. The dimensions must be provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, - ly, lz, alpha, beta, gamma]``. - result : numpy.ndarray(dtype=numpy.float64), optional - Preallocated result array which must have the shape ``(N*(N-1)/2,)`` and + Reference coordinate array of shape ``(3,)`` or ``(n, 3)`` (dtype is + arbitrary, will be converted to ``numpy.float32`` internally). + box : array_like, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + result : numpy.ndarray, optional + Preallocated result array which must have the shape ``(n*(n-1)/2,)`` and dtype ``numpy.float64``. Avoids creating the array which saves time when - the function is called repeatedly. [``None``] - backend : str - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + the function is called repeatedly. + backend : str, optional + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- d : numpy.ndarray - ``N*(N-1)/2`` numpy 1D array with the distances dist[i,j] between ref - coordinates i and j at position d[k]. Loop through d: + Array with shape ``(n*(n-1)/2,)`` containing the distances ``dist[i,j]`` + between reference coordinates ``i`` and ``j`` at position ``d[k]``. Loop + through ``d``: .. code-block:: python - for i in range(N): - for j in range(i+1, N): + for i in range(n): + for j in range(i + 1, n): k += 1 - dist[i,j] = d[k] + dist[i, j] = d[k] .. versionchanged:: 0.13.0 @@ -367,75 +362,82 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None, return_distances=True): - """Calculates the pairs and distances within a specified distance + """Calculates pairs of indices corresponding to entries in the `reference` + and `configuration` arrays which are separated by a distance lying within + the specified cutoff(s). Optionally, these distances can be returned as + well. - If a *box* is supplied, then a minimum image convention is used - to evaluate the distances. + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. - An automatic guessing of optimized method to calculate the distances is + An automatic guessing of the optimal method to calculate the distances is included in the function. An optional keyword for the method is also - provided. Users can override the method with this functionality. - Currently pkdtree and bruteforce are implemented. - + provided. Users can enforce a particular method with this functionality. + Currently brute force, grid search, and periodic KDtree methods are + implemented. Parameters ----------- - reference : array - reference coordinates array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)`` - configuration : array - Configuration coordinate array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)`` + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)``. + configuration : numpy.ndarray + Configuration coordinate array with shape ``(3,)`` or ``(m, 3)``. max_cutoff : float - Maximum cutoff distance between the reference and configuration - min_cutoff : (optional) float - Minimum cutoff distance between reference and configuration [None] - box : (optional) array or None - The dimensions, if provided, must be provided in the same - The unitcell dimesions for this system format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention - is applied if the box is provided [None] - method : (optional) 'bruteforce' or 'pkdtree' or 'None' - Keyword to override the automatic guessing of method built-in - in the function [None] - return_distances : (optional) 'True'/'False' - Function returns distances if set to 'True' + Maximum cutoff distance between the reference and configuration. + min_cutoff : float, optional + Minimum cutoff distance between reference and configuration. + box : array_like, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + method : str, optional + Keyword to override the automatic guessing ofthe employed search method. + Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. + return_distances : bool, optional + If set to ``True``, distances will also be returned. Returns ------- - pairs : array - Pair of indices, one from each reference and configuration such that - distance between them is within the ``max_cutoff`` and ``min_cutoff`` - pairs[i,j] contains the indices i from reference coordinates, and - j from configuration - distances : (optional) array - Distances corresponding to each pair of indices. - d[k] corresponding to the pairs[i,j] gives the distance between - i-th and j-th coordinate in reference and configuration respectively - Returns only if ``return_distances`` is set to `True` + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` and + `configuration` arrays such that the distance between them lies within + the interval (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th coordinate in `reference` and the ``j``-th coordinate in + `configuration`. + distances : numpy.ndarray, optional + Distances corresponding to each pair of indices. Only returned if + `return_distances` is ``True``. ``distances[k]`` corresponds to the + ``k``-th pair returned in `pairs` and gives the distance between the + coordinates ``reference[pairs[k, 0]]`` and + ``configuration[pairs[k, 1]]``. .. code-block:: python - pairs, distances = capped_distances(reference, coordinates, max_cutoff) - for indx, [a,b] in enumerate(pairs): - coord1 = reference[a] - coord2 = configuration[b] - distance = distances[indx] + pairs, distances = capped_distances(reference, configuration, + max_cutoff, return_distances=True) + for k, [i, j] in enumerate(pairs): + coord1 = reference[i] + coord2 = configuration[j] + distance = distances[k] Note ----- - Currently only supports brute force and Periodic KDtree + Currently supports brute force, grid-based, and periodic KDtree search + methods. - .. SeeAlso:: :func:'MDAnalysis.lib.distances.distance_array' - .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree.search' - .. SeeAlso:: :class:'MDAnalysis.lib.nsgrid.FastNS.search' + .. seealso:: :meth:`~MDAnalysis.lib.distances.distance_array` + .. seealso:: :meth:`MDAnalysis.lib.pkdtree.PeriodicKDTree.search` + .. seealso:: :meth:`MDAnalysis.lib.nsgrid.FastNS.search` """ if box is not None: + box = np.asarray(box, dtype=np.float32) if box.shape[0] != 6: - raise ValueError('Box Argument is of incompatible type. The dimension' - 'should be either None or ' - 'of the type [lx, ly, lz, alpha, beta, gamma]') + raise ValueError("Box Argument is of incompatible type. The " + "dimension should be either None or of the form " + "[lx, ly, lz, alpha, beta, gamma]") method = _determine_method(reference, configuration, max_cutoff, min_cutoff=min_cutoff, box=box, method=method) @@ -455,65 +457,61 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, box=None, method=None): - """ - Switch between different methods based on the the optimized time. - All the rules to select the method based on the input can be - incorporated here. + """Guesses the fastest method for capped distance calculations based on the + size of the coordinate sets and the relative size of the target volume. Parameters ---------- - reference : array - reference coordinates array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)`` - configuration : array - Configuration coordinate array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)`` + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)``. + configuration : numpy.ndarray + Configuration coordinate array with shape ``(3,)`` or ``(m, 3)``. max_cutoff : float - Maximum cutoff distance between the reference and configuration - min_cutoff : (optional) float - Minimum cutoff distance between reference and configuration [None] - box : (optional) array or None - The dimensions, if provided, must be provided in the same - The unitcell dimesions for this system format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention - is applied if the box is provided [None] - method : (optional) 'bruteforce' or 'pkdtree' or 'None' - Keyword to override the automatic guessing of method built-in - in the function [None] + Maximum cutoff distance between `reference` and `configuration` + coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` and `configuration` + coordinates. + box : numpy.ndarray + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + method : str, optional + Keyword to override the automatic guessing ofthe employed search method. + Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. Returns ------- - Method : Function object - Returns function object based on the rules and specified method + function : callable + The function implementing the guessed (or deliberatly chosen) method. Note ---- Currently implemented methods are present in the ``methods`` dictionary bruteforce : returns ``_bruteforce_capped`` - PKDtree : return ``_pkdtree_capped` - NSGrid : return ``_nsgrid_capped` - + PKDtree : return ``_pkdtree_capped`` + NSGrid : return ``_nsgrid_capped`` """ methods = {'bruteforce': _bruteforce_capped, 'pkdtree': _pkdtree_capped, 'nsgrid': _nsgrid_capped} if method is not None: - return methods[method] + return methods[method.lower()] if len(reference) < 10 or len(configuration) < 10: return methods['bruteforce'] - elif len(reference)*len(configuration) >= 1e8: + elif len(reference) * len(configuration) >= 1e8: # CAUTION : for large datasets, shouldnt go into 'bruteforce' # in any case. Arbitrary number, but can be characterized return methods['nsgrid'] else: if box is None: min_dim = np.array([reference.min(axis=0), - configuration.min(axis=0)]) + configuration.min(axis=0)]) max_dim = np.array([reference.max(axis=0), - configuration.max(axis=0)]) + configuration.max(axis=0)]) size = max_dim.max(axis=0) - min_dim.min(axis=0) elif np.allclose(box[3:], 90): size = box[:3] @@ -525,64 +523,134 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, else: return methods['nsgrid'] + @check_coords('reference', 'configuration', enforce_copy=False, reduce_result_if_single=False, check_lengths_match=False) def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None, return_distances=True): - """Internal method for bruteforce calculations + """Capped distance evaluations using a brute force method. + + Computes and returns an array containing pairs of indices corresponding to + entries in the `reference` and `configuration` arrays which are separated by + a distance lying within the specified cutoff(s). Employs naive distance + computations (brute force) to find relevant distances. + + Optionally, these distances can be returned as well. + + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. - Uses naive distance calulations and returns a list - containing the indices with one from each - reference and configuration arrays, such that the distance between - them is less than the specified cutoff distance + Parameters + ---------- + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)`` (dtype will + be converted to ``numpy.float32`` internally). + configuration : array + Configuration coordinate array with shape ``(3,)`` or ``(m, 3)`` (dtype + will be converted to ``numpy.float32`` internally). + max_cutoff : float + Maximum cutoff distance between `reference` and `configuration` + coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` and `configuration` + coordinates. + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + return_distances : bool, optional + If set to ``True``, distances will also be returned. Returns ------- - pairs : array - Every ``[i, j]`` pair is such that atom-index ``i`` is - from reference and ``j`` from configuration array - distance: (optional) array - Distance between ``reference[i]`` and ``configuration[j]`` - atom coordinate. Only returns when ``return_distances`` - is set to ``True`` - + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` and + `configuration` arrays such that the distance between them lies within + the interval (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th coordinate in `reference` and the ``j``-th coordinate in + `configuration`. + distances : numpy.ndarray, optional + Distances corresponding to each pair of indices. Only returned if + `return_distances` is ``True``. ``distances[k]`` corresponds to the + ``k``-th pair returned in `pairs` and gives the distance between the + coordinates ``reference[pairs[k, 0]]`` and + ``configuration[pairs[k, 1]]``. """ - pairs = [] - - distance = distance_array(reference, configuration, box=box) + distances = distance_array(reference, configuration, box=box) if min_cutoff is not None: - mask = np.where((distance <= max_cutoff) & (distance > min_cutoff)) + mask = np.where((distances <= max_cutoff) & (distances > min_cutoff)) else: - mask = np.where((distance <= max_cutoff)) + mask = np.where((distances <= max_cutoff)) if mask[0].size > 0: pairs = np.c_[mask[0], mask[1]] + else: + pairs = np.empty((0, 2), dtype=np.int64) if return_distances: - distance = distance[mask] - return pairs, distance + distances = distances[mask] + return pairs, distances else: return pairs + @check_coords('reference', 'configuration', enforce_copy=False, reduce_result_if_single=False, check_lengths_match=False) def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None, return_distances=True): - """ Capped Distance evaluations using KDtree. + """Capped distance evaluations using a KDtree method. - Uses minimum image convention if *box* is specified + Computes and returns an array containing pairs of indices corresponding to + entries in the `reference` and `configuration` arrays which are separated by + a distance lying within the specified cutoff(s). Employs a (periodic) KDtree + algorithm to find relevant distances. - Returns: - -------- - pairs : array - Array of atom indices which are within the specified cutoff distance. - Every pairs `(i, j)` corresponds to i-th particle in reference and - j-th particle in configuration - distance : (optional) array - Distance between two atoms corresponding to the (i, j) indices - in pairs. Only returns when ``return_distances`` - is set to ``True`` + Optionally, these distances can be returned as well. + + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. + + Parameters + ---------- + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)`` (dtype will + be converted to ``numpy.float32`` internally). + configuration : array + Configuration coordinate array with shape ``(3,)`` or ``(m, 3)`` (dtype + will be converted to ``numpy.float32`` internally). + max_cutoff : float + Maximum cutoff distance between `reference` and `configuration` + coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` and `configuration` + coordinates. + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + return_distances : bool, optional + If set to ``True``, distances will also be returned. + Returns + ------- + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` and + `configuration` arrays such that the distance between them lies within + the interval (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th coordinate in `reference` and the ``j``-th coordinate in + `configuration`. + distances : numpy.ndarray, optional + Distances corresponding to each pair of indices. Only returned if + `return_distances` is ``True``. ``distances[k]`` corresponds to the + ``k``-th pair returned in `pairs` and gives the distance between the + coordinates ``reference[pairs[k, 0]]`` and + ``configuration[pairs[k, 1]]``. """ from .pkdtree import PeriodicKDTree @@ -592,55 +660,73 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, pairs = kdtree.search_tree(reference, max_cutoff) if (return_distances or (min_cutoff is not None)) and pairs.size > 0: refA, refB = pairs[:, 0], pairs[:, 1] - distance = calc_bonds(reference[refA], configuration[refB], box=box) + distances = calc_bonds(reference[refA], configuration[refB], box=box) if min_cutoff is not None: - mask = np.where(distance > min_cutoff) - pairs, distance = pairs[mask], distance[mask] + mask = np.where(distances > min_cutoff) + pairs, distances = pairs[mask], distances[mask] else: - distance = [] + distances = np.zeros((0, 1), dtype=np.float64) if return_distances: - return pairs, distance + return pairs, distances else: return pairs + @check_coords('reference', 'configuration', enforce_copy=False, reduce_result_if_single=False, check_lengths_match=False) def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, box=None, return_distances=True): - """Search all the pairs in *reference* and *configuration* within - a specified distance using Grid Search + """Capped distance evaluations using a grid-based search method. + + Computes and returns an array containing pairs of indices corresponding to + entries in the `reference` and `configuration` arrays which are separated by + a distance lying within the specified cutoff(s). Employs a grid-based search + algorithm to find relevant distances. + Optionally, these distances can be returned as well. + + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. Parameters - ----------- - reference : array - reference coordinates array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)``. + ---------- + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)`` (dtype will + be converted to ``numpy.float32`` internally). configuration : array - Configuration coordinate array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)`` + Configuration coordinate array with shape ``(3,)`` or ``(m, 3)`` (dtype + will be converted to ``numpy.float32`` internally). max_cutoff : float - Maximum cutoff distance between the reference and configuration - min_cutoff : (optional) float - Minimum cutoff distance between reference and configuration [None] - box : array - The dimensions, if provided, must be provided in the same - The unitcell dimesions for this system format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention - is applied if the box is provided + Maximum cutoff distance between `reference` and `configuration` + coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` and `configuration` + coordinates. + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + return_distances : bool, optional + If set to ``True``, distances will also be returned. Returns ------- - pairs : array - Array of atom indices which are within the specified cutoff distance. - Every pairs `(i, j)` corresponds to i-th particle in reference and - j-th particle in configuration - distance : (optional) array - Distance between two atoms corresponding to the (i, j) indices - in pairs. Only returns when ``return_distances`` - is set to ``True`` + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` and + `configuration` arrays such that the distance between them lies within + the interval (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th coordinate in `reference` and the ``j``-th coordinate in + `configuration`. + distances : numpy.ndarray, optional + Distances corresponding to each pair of indices. Only returned if + `return_distances` is ``True``. ``distances[k]`` corresponds to the + ``k``-th pair returned in `pairs` and gives the distance between the + coordinates ``reference[pairs[k, 0]]`` and + ``configuration[pairs[k, 1]]``. """ from .nsgrid import FastNS @@ -689,105 +775,110 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, def self_capped_distance(reference, max_cutoff, min_cutoff=None, box=None, method=None): - """Finds all the pairs and respective distances within a specified cutoff - for a configuration *reference* + """Calculates pairs of indices corresponding to entries in the `reference` + array which are separated by a distance lying within the specified + cutoff(s). The respective distances are returned as well. - If a *box* is supplied, then a minimum image convention is used - to evaluate the distances. + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. - An automatic guessing of optimized method to calculate the distances is + An automatic guessing of the optimal method to calculate the distances is included in the function. An optional keyword for the method is also - provided. Users can override the method with this functionality. - Currently pkdtree and bruteforce are implemented. + provided. Users can enforce a particular method with this functionality. + Currently brute force, grid search, and periodic KDtree methods are + implemented. Parameters ----------- - reference : array - reference coordinates array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)`` + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)``. max_cutoff : float - Maximum cutoff distance to check the neighbors with itself - min_cutoff : (optional) float - Minimum cutoff distance [None] - box : (optional) array or None - The dimensions, if provided, must be provided in the same - The unitcell dimesions for this system format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention - is applied if the box is provided [None] - method : (optional) 'bruteforce' or 'pkdtree' or 'None' - Keyword to override the automatic guessing of method built-in - in the function [None] + Maximum cutoff distance between `reference` coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` coordinates. + box : array_like, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + method : str, optional + Keyword to override the automatic guessing ofthe employed search method. + Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. Returns ------- - pairs : array - Pair of indices such that distance between them is - within the ``max_cutoff`` and ``min_cutoff`` - distances : array - Distances corresponding to each pair of indices. - d[k] corresponding to the pairs[i,j] gives the distance between - i-th and j-th coordinate in reference + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` array + such that the distance between them lies within the interval + (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th and the ``j``-th coordinate in `reference`. + distances : numpy.ndarray + Distances corresponding to each pair of indices. ``distances[k]`` + corresponds to the ``k``-th pair returned in `pairs` and gives the + distance between the coordinates ``reference[pairs[k, 0]]`` and + ``reference[pairs[k, 1]]``. .. code-block:: python pairs, distances = self_capped_distances(reference, max_cutoff) - for indx, [a,b] in enumerate(pairs): - coord1, coords2 = reference[a], reference[b] - distance = distances[indx] + for k, [i, j] in enumerate(pairs): + coord1 = reference[i] + coord2 = reference[j] + distance = distances[k] + Note ----- - Currently only supports brute force, Periodic KDtree and Grid Search + Currently supports brute force, grid-based, and periodic KDtree search + methods. - .. SeeAlso:: :func:'MDAnalysis.lib.distances.self_distance_array' - .. SeeAlso:: :func:'MDAnalysis.lib.pkdtree.PeriodicKDTree.search' - .. SeeAlso:: :func:'MDAnalysis.lib.nsgrid.FastNS.self_search' + .. seealso:: :meth:`~MDAnalysis.lib.distances.self_distance_array` + .. seealso:: :meth:`MDAnalysis.lib.pkdtree.PeriodicKDTree.search` + .. seealso:: :meth:`MDAnalysis.lib.nsgrid.FastNS.self_search` """ if box is not None: + box = np.asarray(box, dtype=np.float32) if box.shape[0] != 6: - raise ValueError('Box Argument is of incompatible type. The dimension' - 'should be either None or ' - 'of the type [lx, ly, lz, alpha, beta, gamma]') + raise ValueError("Box Argument is of incompatible type. The " + "dimension should be either None or of the form " + "[lx, ly, lz, alpha, beta, gamma]") method = _determine_method_self(reference, max_cutoff, min_cutoff=min_cutoff, box=box, method=method) - pairs, dist = method(reference, max_cutoff, - min_cutoff=min_cutoff, box=box) + pairs, dist = method(reference, max_cutoff, min_cutoff=min_cutoff, box=box) return np.asarray(pairs), np.asarray(dist) def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, method=None): - """ - Switch between different methods based on the the optimized time. - All the rules to select the method based on the input can be - incorporated here. + """Guesses the fastest method for capped distance calculations based on the + size of the `reference` coordinate set and the relative size of the target + volume. Parameters ---------- - reference : array - reference coordinates array with shape ``reference.shape = (3,)`` - or ``reference.shape = (len(reference), 3)`` + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)``. max_cutoff : float - Maximum cutoff distance - min_cutoff : (optional) float - Minimum cutoff distance [None] - box : (optional) array or None - The dimensions, if provided, must be provided in the same - The unitcell dimesions for this system format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: - ``[lx,ly, lz, alpha, beta, gamma]``. Minimum image convention - is applied if the box is provided [None] - method : (optional) 'bruteforce' or 'pkdtree' or 'None' - Keyword to override the automatic guessing of method built-in - in the function [None] + Maximum cutoff distance between `reference` coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` coordinates. + box : numpy.ndarray + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + method : str, optional + Keyword to override the automatic guessing ofthe employed search method. + Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. Returns ------- - Method : Function object - Returns function object based on the rules and specified method + function : callable + The function implementing the guessed (or deliberatly chosen) method. Note ---- @@ -795,14 +886,13 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, bruteforce : returns ``_bruteforce_capped_self`` PKDtree : return ``_pkdtree_capped_self`` NSGrid : return ``_nsgrid_capped_self`` - """ methods = {'bruteforce': _bruteforce_capped_self, - 'pkdtree': _pkdtree_capped_self, - 'nsgrid': _nsgrid_capped_self} + 'pkdtree': _pkdtree_capped_self, + 'nsgrid': _nsgrid_capped_self} if method is not None: - return methods[method] + return methods[method.lower()] if box is None: min_dim = np.array([reference.min(axis=0)]) @@ -821,23 +911,48 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, else: return methods['nsgrid'] + @check_coords('reference', enforce_copy=False, reduce_result_if_single=False) def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, box=None): - """Finds all the pairs among the *reference* coordinates within - a fixed distance using brute force method + """Capped distance evaluations using a brute force method. + + Computes and returns an array containing pairs of indices corresponding to + entries in the `reference` array which are separated by a distance lying + within the specified cutoff(s). Employs naive distance computations (brute + force) to find relevant distances. These distances are returned as well. - Internal method using brute force method to evaluate all the pairs - of atoms within a fixed distance. + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. + + Parameters + ---------- + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)`` (dtype will + be converted to ``numpy.float32`` internally). + max_cutoff : float + Maximum cutoff distance between `reference` coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` coordinates. + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. Returns ------- - pairs : array - Arrray of ``[i, j]`` pairs such that atom-index ``i`` - and ``j`` from reference array are within the fixed distance - distance: array - Distance between ``reference[i]`` and ``reference[j]`` - atom coordinate - + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` array + such that the distance between them lies within the interval + (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th and the ``j``-th coordinate in `reference`. + distances : numpy.ndarray + Distances corresponding to each pair of indices. ``distances[k]`` + corresponds to the ``k``-th pair returned in `pairs` and gives the + distance between the coordinates ``reference[pairs[k, 0]]`` and + ``reference[pairs[k, 1]]``. """ pairs, distance = [], [] @@ -858,23 +973,48 @@ def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, box=None): distance = distance[mask] return np.asarray(pairs), np.asarray(distance) + @check_coords('reference', enforce_copy=False, reduce_result_if_single=False) def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, box=None): - """Finds all the pairs among the coordinates within a fixed distance - using PeriodicKDTree + """Capped distance evaluations using a KDtree method. + + Computes and returns an array containing pairs of indices corresponding to + entries in the `reference` array which are separated by a distance lying + within the specified cutoff(s). Employs a (periodic) KDtree algorithm to + find relevant distances. These distances are returned as well. + + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. - Internal method using PeriodicKDTree method to evaluate all the pairs - of atoms within a fixed distance. + Parameters + ---------- + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)`` (dtype will + be converted to ``numpy.float32`` internally). + max_cutoff : float + Maximum cutoff distance between `reference` coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` coordinates. + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. Returns ------- - pairs : array - Array of ``[(i, j)]`` pairs such that atom-index ``i`` - and ``j`` from reference array are within the fixed distance - distance: array - Distance between ``reference[i]`` and ``reference[j]`` - atom coordinate - + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` array + such that the distance between them lies within the interval + (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th and the ``j``-th coordinate in `reference`. + distances : numpy.ndarray + Distances corresponding to each pair of indices. ``distances[k]`` + corresponds to the ``k``-th pair returned in `pairs` and gives the + distance between the coordinates ``reference[pairs[k, 0]]`` and + ``reference[pairs[k, 1]]``. """ from .pkdtree import PeriodicKDTree @@ -893,18 +1033,45 @@ def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, box=None): def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, box=None): - """Finds all the pairs among the *reference* coordinates within - a fixed distance using gridsearch + """Capped distance evaluations using a grid-based search method. + + Computes and returns an array containing pairs of indices corresponding to + entries in the `reference` array which are separated by a distance lying + within the specified cutoff(s). Employs a grid-based search algorithm to + find relevant distances. These distances are returned as well. + + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. + + Parameters + ---------- + reference : numpy.ndarray + Reference coordinate array with shape ``(3,)`` or ``(n, 3)`` (dtype will + be converted to ``numpy.float32`` internally). + max_cutoff : float + Maximum cutoff distance between `reference` coordinates. + min_cutoff : float, optional + Minimum cutoff distance between `reference` coordinates. + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. Returns ------- - pairs : array - Arrray of ``[i, j]`` pairs such that atom-index ``i`` - and ``j`` from reference array are within a fixed distance - distance: array - Distance between ``reference[i]`` and ``reference[j]`` - atom coordinate - + pairs : numpy.ndarray + Pairs of indices, corresponding to coordinates in the `reference` array + such that the distance between them lies within the interval + (`min_cutoff`, `max_cutoff`]. + Each row in `pairs` is an index pair ``[i, j]`` corresponding to the + ``i``-th and the ``j``-th coordinate in `reference`. + distances : numpy.ndarray + Distances corresponding to each pair of indices. ``distances[k]`` + corresponds to the ``k``-th pair returned in `pairs` and gives the + distance between the coordinates ``reference[pairs[k, 0]]`` and + ``reference[pairs[k, 1]]``. """ from .nsgrid import FastNS @@ -948,6 +1115,7 @@ def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, box=None): pairs, pair_distance = pairs[idx], pair_distance[idx] return pairs, pair_distance + @check_coords('coords') def transform_RtoS(coords, box, backend="serial"): """Transform an array of coordinates from real space to S space (a.k.a. @@ -982,6 +1150,7 @@ def transform_RtoS(coords, box, backend="serial"): Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. + Now also accepts (and, likewise, returns) a single coordinate. """ boxtype, box = _check_box(box) if boxtype == 'ortho': @@ -1029,6 +1198,7 @@ def transform_StoR(coords, box, backend="serial"): Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. + Now also accepts (and, likewise, returns) a single coordinate. """ boxtype, box = _check_box(box) if boxtype == 'ortho': @@ -1037,52 +1207,56 @@ def transform_StoR(coords, box, backend="serial"): _run("coord_transform", args=(coords, box), backend=backend) return coords + @check_coords('coords1', 'coords2', enforce_copy=False) def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): - """ - Calculate all distances between a pair of atoms. *atom1* and *atom2* are both - arrays of coordinates, where atom1[i] and atom2[i] represent a bond. + """Calculates the bond lengths between pairs of atom positions from the two + coordinate arrays `coords1` and `coords2`. Both coordinate arrays must be of + the same length, so that ``coords1[i]`` and ``coords2[i]`` represent the + positions of atoms connected by the ``i``-th bond. - In comparison to distance_array and self_distance_array which calculate distances - between all combinations of coordinates, calc_bonds can be used to calculate distance - between pairs of objects, similar to:: + In comparison to :meth:`distance_array` and :meth:`self_distance_array`, + which calculate distances between all possible combinations of coordinates, + :meth:`calc_bonds` only calculates distances between pairs of coordinates, + similar to:: numpy.linalg.norm(a - b) for a, b in zip(coords1, coords2) - The optional argument *box* applies minimum image convention if supplied. - *box* can be either orthogonal or triclinic + If the optional argument `box` is supplied, the minimum image convention is + applied when calculating distances. Either orthogonal or triclinic boxes are + supported. - If a 1D numpy array of dtype ``numpy.float64`` with ``len(atom1)`` elements is - provided in *result* then this preallocated array is filled. This can speed - up calculations. - - bondlengths = calc_bonds(coords1, coords2 [, box [,result=bondlengths]]) + If a 1D numpy array of dtype ``numpy.float64`` with ``len(coords1)`` + elements is provided in `result`, then this preallocated array is filled. + This can speed up calculations. Parameters ---------- - coords1 : array - An array of coordinates for one half of the bond (``dtype`` is - arbitrary, will be converted to ``dtype=numpy.float32`` internally) - coords2 : array - An array of coordinates for the other half of bond (``dtype`` is - arbitrary, will be converted to ``dtype=numpy.float32`` internally) - box : array - The unitcell dimesions for this system. - The dimensions must be provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, - ly, lz, alpha, beta, gamma]``. - result : array, optional - Preallocated result array which must be same length as coord - arrays and ``dtype=numpy.float64``. Avoids creating the - array which saves time when the function is called repeatedly. [None] - backend : str - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + coords1 : numpy.ndarray + Coordinate array of shape ``(n, 3)`` for one half of ``n`` bonds (dtype + is arbitrary, will be converted to ``numpy.float32`` internally). + coords2 : numpy.ndarray + Coordinate array of shape ``(n, 3)`` for the other half of ``n`` bonds + (dtype is arbitrary, will be converted to ``numpy.float32`` internally). + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + result : numpy.ndarray, optional + Preallocated result array which must be of the same length ``n`` as the + coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the + array in repeated function calls. + backend : str, optional + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- - bondlengths : array - The length between each pair in coords1 and coords2 + bondlengths : numpy.ndarray or float + Array of dtype ``numpy.float64`` containing the bond lengths between + each pair of coordinates. If two single coordinates were supplied, their + distance is returned as a single number instead of an array. .. versionadded:: 0.8 @@ -1090,6 +1264,7 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. + Now also accepts single coordinates as input. """ numatom = coords1.shape[0] bondlengths = _check_result_array(result, (numatom,)) @@ -1111,60 +1286,76 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): return bondlengths + @check_coords('coords1', 'coords2', 'coords3', enforce_copy=False) def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="serial"): - """ - Calculates the angle formed between three atoms, over a list of coordinates. - All *atom* inputs are lists of coordinates of equal length, with *atom2* - representing the apex of the angle. + """Calculates the angles formed between triplets of atom positions from the + three coordinate arrays `coords1`, `coords2`, and `coords3`. All coordinate + arrays must be of equal length, with the coordinates in `coords2` + representing the apices of the angles:: + + 2---3 + / + 1 - If a 1D numpy array of dtype ``numpy.float64`` with ``len(atom1)`` elements is - provided in *result* then this preallocated array is filled. This can speed - up calculations. + Configurations where the angle is undefined (e.g., when coordinates 1 or 3 + of a triplet coincide with coordinate 2) result in a value of zero for that + angle. - The optional argument ``box`` ensures that periodic boundaries are taken into account when - constructing the connecting vectors between atoms, ie that the vector between atoms 1 & 2 - goes between coordinates in the same image. + If the optional argument `box` is supplied, periodic boundaries are taken + into account when constructing the connecting vectors between coordinates, + i.e., the minimum image convention is applied for the vectors forming the + angles. Either orthogonal or triclinic boxes are supported. - angles = calc_angles(coords1, coords2, coords3, [[box=None],result=angles]) + If a 1D numpy array of dtype ``numpy.float64`` with ``len(coords1)`` + elements is provided in `result`, then this preallocated array is filled. + This can speed up calculations. Parameters ---------- coords1 : numpy.ndarray - Coordinate array of one side of angles (``dtype`` is arbitrary, will be - converted to ``dtype=numpy.float32`` internally) + Array of shape ``(n, 3)`` containing the coordinates of one side of + ``n`` angles (dtype is arbitrary, will be converted to ``numpy.float32`` + internally) coords2 : numpy.ndarray - Coordinate array of apex of angles (``dtype`` is arbitrary, will be - converted to ``dtype=numpy.float32`` internally) + Array of shape ``(n, 3)`` containing the coordinates of the apices of + ``n`` angles (dtype is arbitrary, will be converted to ``numpy.float32`` + internally) coords3 : numpy.ndarray - Coordinate array of other side of angles (``dtype`` is arbitrary, will be - converted to ``dtype=numpy.float32`` internally) + Array of shape ``(n, 3)`` containing the coordinates of the other side + of ``n`` angles (dtype is arbitrary, will be converted to + ``numpy.float32`` internally) box : numpy.ndarray, optional - The unitcell dimesions for this system. - The dimensions must be provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, - ly, lz, alpha, beta, gamma]``. + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. result : numpy.ndarray, optional - Preallocated result array which must be same length as coord - arrays and ``dtype=numpy.float64``. Avoids creating the - array which saves time when the function is called repeatedly. [None] - backend : str - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + Preallocated result array which must be of the same length ``n`` as the + coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the + array in repeated function calls. + backend : str, optional + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- - angles : numpy.ndarray - An array of angles in radians. + angles : numpy.ndarray or float + Array of dtype ``numpy.float64`` containing the angles between each + triplet of coordinates. Values are returned in radians (rad). If three + single coordinates were supplied, the angle is returned as a single + number instead of an array. .. versionadded:: 0.8 .. versionchanged:: 0.9.0 - Added optional box argument to account for periodic boundaries in calculation + Added optional box argument to account for periodic boundaries in + calculation .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. + Now also accepts single coordinates as input. """ numatom = coords1.shape[0] angles = _check_result_array(result, (numatom,)) @@ -1186,74 +1377,86 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="seria return angles + @check_coords('coords1', 'coords2', 'coords3', 'coords4', enforce_copy=False) def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, backend="serial"): - """ - Calculate the dihedral angle formed by four atoms, over a list of coordinates. + """Calculates the dihedral angles formed between quadruplets of positions + from the four coordinate arrays `coords1`, `coords2`, `coords3`, and + `coords4`, which must be of equal length. - Dihedral angle around axis connecting atoms 1 and 2 (i.e. the angle - between the planes spanned by atoms (0,1,2) and (1,2,3)):: + The dihedral angle formed by a quadruplet of positions (1,2,3,4) is + calculated around the axis connecting positions 2 and 3 (i.e., the angle + between the planes spanned by positions (1,2,3) and (2,3,4)):: - 3 + 4 | - 1-----2 + 2-----3 / - 0 + 1 - If a 1D numpy array of dtype ``numpy.float64`` with ``len(atom1)`` elements - is provided in *result* then this preallocated array is filled. This can - speed up calculations. + If all coordinates lie in the same plane, the cis configuration corresponds + to a dihedral angle of zero, and the trans configuration to :math:`\pi` + radians (180 degrees). Configurations where the dihedral angle is undefined + (e.g., when all coordinates lie on the same straight line) result in a value + of ``nan`` (not a number) for that dihedral. - The optional argument ``box`` ensures that periodic boundaries are taken - into account when constructing the connecting vectors between atoms, ie - that the vector between atoms 1 & 2 goes between coordinates in the same - image:: + If the optional argument `box` is supplied, periodic boundaries are taken + into account when constructing the connecting vectors between coordinates, + i.e., the minimum image convention is applied for the vectors forming the + dihedral angles. Either orthogonal or triclinic boxes are supported. - angles = calc_dihedrals(coords1, coords2, coords3, coords4 [,box=box, result=angles]) + If a 1D numpy array of dtype ``numpy.float64`` with ``len(coords1)`` + elements is provided in `result` then this preallocated array is filled. + This can speed up calculations. Parameters ---------- - coords1 : array - Coordinate array of 1st atom in dihedrals (``dtype`` is arbitrary, will - be converted to ``dtype=numpy.float32`` internally) - coords2 : array - Coordinate array of 2nd atom in dihedrals (``dtype`` is arbitrary, will - be converted to ``dtype=numpy.float32`` internally) - coords3 : array - Coordinate array of 3rd atom in dihedrals (``dtype`` is arbitrary, will - be converted to ``dtype=numpy.float32`` internally) - coords4 : array - Coordinate array of 4th atom in dihedrals (``dtype`` is arbitrary, will - be converted to ``dtype=numpy.float32`` internally) - box : array - The unitcell dimesions for this system. - The dimensions must be provided in the same format as returned - by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`: ``[lx, - ly, lz, alpha, beta, gamma]``. - result : array, optional - Preallocated result array which must be same length as coord - arrays and ``dtype=numpy.float64``. Avoids creating the - array which saves time when the function is called repeatedly. [None] - backend : str - Select the type of acceleration; "serial" is always available. Other - possibilities are "OpenMP" (OpenMP). + coords1 : numpy.ndarray + Coordinate array of 1st positions in dihedrals (dtype is arbitrary, will + be converted to ``numpy.float32`` internally) + coords2 : numpy.ndarray + Coordinate array of 2nd positions in dihedrals (dtype is arbitrary, will + be converted to ``numpy.float32`` internally) + coords3 : numpy.ndarray + Coordinate array of 3rd positions in dihedrals (dtype is arbitrary, will + will be converted to ``numpy.float32`` internally) + coords4 : numpy.ndarray + Coordinate array of 4th positions in dihedrals (dtype is arbitrary, will + be converted to ``numpy.float32`` internally) + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + result : numpy.ndarray, optional + Preallocated result array which must be of the same length as the + coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the + array in repeated function calls. + backend : str, optional + Select the type of acceleration; ``'serial'`` is always available. + Another possibility is ``'OpenMP'``. Returns ------- - angles : array - A numpy.array of angles in radians. + dihedrals : numpy.ndarray or float + Array of dtype ``numpy.float64`` containing the dihedral angles formed + by each quadruplet of coordinates. Values are returned in radians (rad). + If four single coordinates were supplied, the dihedral angle is returned + as a single number instead of an array. .. versionadded:: 0.8 .. versionchanged:: 0.9.0 - Added optional box argument to account for periodic boundaries in calculation + Added optional box argument to account for periodic boundaries in + calculation .. versionchanged:: 0.11.0 Renamed from calc_torsions to calc_dihedrals .. versionchanged:: 0.13.0 Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. + Now also accepts single coordinates as input. """ numatom = coords1.shape[0] dihedrals = _check_result_array(result, (numatom,)) @@ -1275,6 +1478,7 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, return dihedrals + @check_coords('coords') def apply_PBC(coords, box, backend="serial"): """Moves coordinates into the primary unit cell. @@ -1282,8 +1486,8 @@ def apply_PBC(coords, box, backend="serial"): Parameters ---------- coords : numpy.ndarray - Coordinate array of shape ``(n, 3)`` (dtype is arbitrary, will be - converted to ``numpy.float32`` internally). + Coordinate array of shape ``(3,)`` or ``(n, 3)`` (dtype is arbitrary, + will be converted to ``numpy.float32`` internally). box : numpy.ndarray The unitcell dimensions of the system, which can be orthogonal or triclinic and must be provided in the same format as returned by @@ -1305,6 +1509,7 @@ def apply_PBC(coords, box, backend="serial"): Added *backend* keyword. .. versionchanged:: 0.19.0 Internal dtype conversion of input coordinates to ``numpy.float32``. + Now also accepts (and, likewise, returns) single coordinates. """ boxtype, box = _check_box(box) if boxtype == 'ortho': @@ -1318,14 +1523,26 @@ def apply_PBC(coords, box, backend="serial"): def calc_distance(a, b, box=None): - """Distance between a and b + """Calculates the distance between positions `a` and `b`. + + If the optional argument `box` is supplied, the minimum image convention is + applied during distance calculation. Either orthogonal or triclinic boxes + are supported. Parameters ---------- - a, b : numpy.ndarray - single coordinate vectors + a,b : numpy.ndarray + Single position vectors of shape ``(3,)``. box : numpy.ndarray, optional - simulation box, if given periodic boundary conditions will be applied + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + + Returns + ------- + distance : float + The distance between positions `a` and `b`. .. versionadded:: 0.18.1 @@ -1334,15 +1551,33 @@ def calc_distance(a, b, box=None): def calc_angle(a, b, c, box=None): - """Angle (in degrees) between a, b and c, where b is apex of angle + """Calculates the angle (in degrees) between the positions `a`, `b`, and + `c`, where `b` represents the apex of the angle:: + + b---c + / + a + + If the optional argument `box` is supplied, periodic boundaries are taken + into account when constructing the connecting vectors between coordinates, + i.e., the minimum image convention is applied for the vectors forming the + angle. Either orthogonal or triclinic boxes are supported. Parameters ---------- - a, b, c : numpy.ndarray - single coordinate vectors - box : numpy.ndarray - simulation box if given periodic boundary conditions will be applied to - the vectors between atoms + a,b,c : numpy.ndarray + Single position vectors of shape ``(3,)``. + box : numpy.ndarray, optional + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + + Returns + ------- + angle : float + The angle between the vectors `b`:math:`\\rightarrow`\ `a` and + `b`:math:`\\rightarrow`\ `c`. .. versionadded:: 0.18.1 @@ -1351,14 +1586,35 @@ def calc_angle(a, b, c, box=None): def calc_dihedral(a, b, c, d, box=None): - """Dihedral angle (in degrees) between planes (a, b, c) and (b, c, d) + """Calculates the dihedral angle (in degrees) between the planes spanned by + the coordinates (`a`, `b`, `c`) and (`b`, `c`, `d`):: + + d + | + b-----c + / + a + + If the optional argument `box` is supplied, periodic boundaries are taken + into account when constructing the connecting vectors between coordinates, + i.e., the minimum image convention is applied for the vectors forming the + dihedral angle. Either orthogonal or triclinic boxes are supported. Parameters ---------- - a, b, c, d : numpy.ndarray - single coordinate vectors + a,b,c,d : numpy.ndarray + Single coordinate vectors of shape ``(3,)``. box : numpy.ndarray, optional - simulation box, if given periodic boundary conditions will be applied + The unitcell dimensions of the system, which can be orthogonal or + triclinic and must be provided in the same format as returned by + :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n + ``[lx, ly, lz, alpha, beta, gamma]``. + + Returns + ------- + dihedral : float + The dihedral angle between the planes spanned by the coordinates + (`a`, `b`, `c`) and (`b`, `c`, `d`). .. versionadded:: 0.18.1 From 1552a8b5c311089fc6068ca7077be80004b38f71 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Tue, 11 Sep 2018 19:59:07 +0100 Subject: [PATCH 430/455] Introduces user defined grid for density calculations (#2005) * Partially addresses #1928 * Add user defined grid to density code * Provides usage documentation user defn grid * Adds tests for user defn grids * Tests to capture Use Defn grid ValueError cases * Comment fixes to density code + new tests --- package/AUTHORS | 4 +- package/CHANGELOG | 7 +- package/MDAnalysis/analysis/density.py | 124 ++++++++++++++++-- .../MDAnalysisTests/analysis/test_density.py | 76 ++++++++++- 4 files changed, 193 insertions(+), 18 deletions(-) diff --git a/package/AUTHORS b/package/AUTHORS index 5e81ea93e55..3214839a3c9 100644 --- a/package/AUTHORS +++ b/package/AUTHORS @@ -106,7 +106,9 @@ Chronological list of authors - Shujie Fan - Andrew R. McCluskey - Henry Mull - + - Irfan Alibay + + External code ------------- diff --git a/package/CHANGELOG b/package/CHANGELOG index 24135804b36..3e85b4910be 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -15,13 +15,11 @@ The rules for this file: ------------------------------------------------------------------------------ ??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull, micaela-matta, - sebastien.buchoux, arm61, p-j-smith + sebastien.buchoux, arm61, p-j-smith, IAlibay * 0.18.1 Enhancements - - * Replaced multiple apply (_apply_distmat, _apply_kdtree) methods in distance based selections with lib.distances.capped_distance for automatic selection of @@ -80,10 +78,13 @@ Enhancements * Added dihedrals.py with Dihedral, Ramachandran, and Janin classes to analysis module (PR #1997, PR #2033) * Added the analysis.data module for reference data used in analysis (PR #2033) + * Added analysis.dihedrals with Ramachandran class to analysis module (PR #1997) + * Added augment functionality to create relevant images of particles * Most functions in `MDanalysis.lib.distances` previously only accepting arrays of coordinates now also accept single coordinates as input (PR #2048) * Performance improvements to make_whole (PR #1965) * Performance improvements to fragment finding (PR #2028) + * Added user defined boxes in density code (PR #2005) Fixes * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) diff --git a/package/MDAnalysis/analysis/density.py b/package/MDAnalysis/analysis/density.py index 80c17c912e3..33588b1c1dd 100644 --- a/package/MDAnalysis/analysis/density.py +++ b/package/MDAnalysis/analysis/density.py @@ -184,7 +184,6 @@ logger = logging.getLogger("MDAnalysis.analysis.density") - class Density(Grid): r"""Class representing a density on a regular cartesian grid. @@ -278,7 +277,6 @@ class Density(Grid): -------- gridData.core.Grid : the base class of :class:`Density`. - Examples -------- Typical use: @@ -497,12 +495,66 @@ def __repr__(self): grid_type = 'histogram' return '' + +def _set_user_grid(gridcenter, xdim, ydim, zdim, smin, smax): + """Helper function to set the grid dimensions to user defined values + + Parameters + ---------- + gridcenter : numpy ndarray, float32 + 3 element ndarray containing the x, y and z coordinates of the grid + box center + xdim : float + Box edge length in the x dimension + ydim : float + Box edge length in the y dimension + zdim : float + Box edge length in the y dimension + smin : numpy ndarray, float32 + Minimum x,y,z coordinates for the input selection + smax : numpy ndarray, float32 + Maximum x,y,z coordinates for the input selection + + Returns + ------- + umin : numpy ndarray, float32 + Minimum x,y,z coordinates of the user defined grid + umax : numpy ndarray, float32 + Maximum x,y,z coordinates of the user defined grid + """ + # Check user inputs + try: + gridcenter = np.asarray(gridcenter, dtype=np.float32) + except ValueError: + raise ValueError("Non-number values assigned to gridcenter") + if gridcenter.shape != (3,): + raise ValueError("gridcenter must be a 3D coordinate") + try: + xyzdim = np.array([xdim, ydim, zdim], dtype=np.float32) + except ValueError: + raise ValueError("xdim, ydim, and zdim must be numbers") + + # Set min/max by shifting by half the edge length of each dimension + umin = gridcenter - xyzdim/2 + umax = gridcenter + xyzdim/2 + + # Here we test if coords of selection fall outside of the defined grid + # if this happens, we warn users they may want to resize their grids + if any(smin < umin) or any(smax > umax): + msg = ("Atom selection does not fit grid --- " + "you may want to define a larger box") + warnings.warn(msg) + logger.warning(msg) + return umin, umax + + def density_from_Universe(universe, delta=1.0, atomselection='name OH2', start=None, stop=None, step=None, metadata=None, padding=2.0, cutoff=0, soluteselection=None, use_kdtree=True, update_selection=False, verbose=None, interval=1, quiet=None, - parameters=None): + parameters=None, + gridcenter=None, xdim=None, ydim=None, zdim=None): """Create a density grid from a :class:`MDAnalysis.Universe` object. The trajectory is read, frame by frame, and the atoms selected with `atomselection` are @@ -527,7 +579,7 @@ def density_from_Universe(universe, delta=1.0, atomselection='name OH2', are passed through as they are. padding : float (optional) increase histogram dimensions by padding (on top of initial box size) - in Angstroem [2.0] + in Angstroem. Padding is ignored when setting a user defined grid. [2.0] soluteselection : str (optional) MDAnalysis selection for the solute, e.g. "protein" [``None``] cutoff : float (optional) @@ -550,6 +602,18 @@ def density_from_Universe(universe, delta=1.0, atomselection='name OH2', Show status update every `interval` frame [1] parameters : dict (optional) `dict` with some special parameters for :class:`Density` (see docs) + gridcenter : numpy ndarray, float32 (optional) + 3 element numpy array detailing the x, y and z coordinates of the + center of a user defined grid box in Angstroem [``None``] + xdim : float (optional) + User defined x dimension box edge in Ã¥ngström; ignored if + gridcenter is ``None`` + ydim : float (optional) + User defined y dimension box edge in Ã¥ngström; ignored if + gridcenter is ``None`` + zdim : float (optional) + User defined z dimension box edge in Ã¥ngström; ignored if + gridcenter is ``None`` Returns ------- @@ -595,6 +659,32 @@ def density_from_Universe(universe, delta=1.0, atomselection='name OH2', (Using the special case for the bulk with `soluteselection` and `cutoff` improves performance over the simple `update_selection` approach.) + If you are interested in explicitly setting a grid box of a given edge size + and origin, you can use the gridcenter and x/y/zdim arguments. For example + to plot the density of waters within 5 Ã… of a ligand (in this case the + ligand has been assigned the residue name "LIG") in a cubic grid with 20 Ã… + edges which is centered on the centre of mass (COM) of the ligand:: + + # Create a selection based on the ligand + ligand_selection = universe.select_atoms("resname LIG") + + # Extract the COM of the ligand + ligand_COM = ligand_selection.center_of_mass() + + # Generate a density of waters on a cubic grid centered on the ligand COM + # In this case, we update the atom selection as shown above. + water_density = density_from_Universe(universe, delta=1.0, + atomselection='name OW around 5 resname LIG', + update_selection=True, + gridcenter=ligand_COM, + xdim=20.0, ydim=20.0, zdim=20.0) + + (It should be noted that the `padding` keyword is not used when a user + defined grid is assigned). + + .. versionchanged:: 0.18.1 + *gridcenter*, *xdim*, *ydim* and *zdim* keywords added to allow for user + defined boxes .. versionchanged:: 0.13.0 *update_selection* and *quiet* keywords added @@ -632,15 +722,23 @@ def current_coordinates(): warnings.warn(msg) logger.warning(msg) - # Make the box bigger to avoid as much as possible 'outlier'. This - # is important if the sites are defined at a high density: in this - # case the bulk regions don't have to be close to 1 * n0 but can - # be less. It's much more difficult to deal with outliers. The - # ideal solution would use images: implement 'looking across the - # periodic boundaries' but that gets complicate when the box - # rotates due to RMS fitting. - smin = np.min(coord, axis=0) - padding - smax = np.max(coord, axis=0) + padding + if gridcenter is not None: + # Generate a copy of smin/smax from coords to later check if the + # defined box might be too small for the selection + smin = np.min(coord, axis=0) + smax = np.max(coord, axis=0) + # Overwrite smin/smax with user defined values + smin, smax = _set_user_grid(gridcenter, xdim, ydim, zdim, smin, smax) + else: + # Make the box bigger to avoid as much as possible 'outlier'. This + # is important if the sites are defined at a high density: in this + # case the bulk regions don't have to be close to 1 * n0 but can + # be less. It's much more difficult to deal with outliers. The + # ideal solution would use images: implement 'looking across the + # periodic boundaries' but that gets complicate when the box + # rotates due to RMS fitting. + smin = np.min(coord, axis=0) - padding + smax = np.max(coord, axis=0) + padding BINS = fixedwidth_bins(delta, smin, smax) arange = np.vstack((BINS['min'], BINS['max'])) diff --git a/testsuite/MDAnalysisTests/analysis/test_density.py b/testsuite/MDAnalysisTests/analysis/test_density.py index c94e86e3c3d..e80fd45db4a 100644 --- a/testsuite/MDAnalysisTests/analysis/test_density.py +++ b/testsuite/MDAnalysisTests/analysis/test_density.py @@ -26,6 +26,7 @@ import numpy as np import pytest import sys +import warnings from numpy.testing import assert_equal, assert_almost_equal @@ -128,12 +129,20 @@ class Test_density_from_Universe(object): {'meandensity': 0.016764271713091212, }, 'static_sliced': {'meandensity': 0.016764270747693617, }, + 'static_defined': + {'meandensity': 0.0025000000000000005, }, + 'static_defined_unequal': + {'meandensity': 0.006125, }, 'dynamic': {'meandensity': 0.0012063418843728784, }, 'notwithin': {'meandensity': 0.015535385132107926, }, } cutoffs = {'notwithin': 4.0, } + gridcenters = {'static_defined': np.array([56.0, 45.0, 35.0]), + 'error1': np.array([56.0, 45.0]), + 'error2': [56.0, 45.0, "MDAnalysis"], + } precision = 5 outfile = 'density.dx' @@ -158,7 +167,6 @@ def check_density_from_Universe(self, atomselection, ref_meandensity, assert_almost_equal(D.grid, D2.grid, decimal=self.precision, err_msg="DX export failed: different grid sizes") - def test_density_from_Universe(self, universe, tmpdir): self.check_density_from_Universe( self.selections['static'], @@ -195,6 +203,72 @@ def test_density_from_Universe_notwithin(self, universe, tmpdir): tmpdir=tmpdir ) + def test_density_from_Universe_userdefn_eqbox(self, universe, tmpdir): + self.check_density_from_Universe( + self.selections['static'], + self.references['static_defined']['meandensity'], + gridcenter=self.gridcenters['static_defined'], + xdim=10.0, + ydim=10.0, + zdim=10.0, + universe=universe, + tmpdir=tmpdir + ) + + def test_density_from_Universe_userdefn_neqbox(self, universe, tmpdir): + self.check_density_from_Universe( + self.selections['static'], + self.references['static_defined_unequal']['meandensity'], + gridcenter=self.gridcenters['static_defined'], + xdim=10.0, + ydim=15.0, + zdim=20.0, + universe=universe, + tmpdir=tmpdir + ) + + def test_density_from_Universe_userdefn_boxshape(self, universe): + import MDAnalysis.analysis.density + D = MDAnalysis.analysis.density.density_from_Universe( + universe, atomselection=self.selections['static'], + delta=1.0, xdim=8.0, ydim=12.0, zdim=17.0, + gridcenter=self.gridcenters['static_defined']) + assert D.grid.shape == (8, 12, 17) + + def test_density_from_Universe_userdefn_selwarning(self, universe): + import MDAnalysis.analysis.density + wmsg = ("Atom selection does not fit grid --- " + "you may want to define a larger box") + with pytest.warns(UserWarning) as record: + D = MDAnalysis.analysis.density.density_from_Universe( + universe, atomselection=self.selections['static'], + delta=1.0, xdim=1.0, ydim=2.0, zdim=2.0, + gridcenter=self.gridcenters['static_defined']) + + assert len(record) == 2 + assert str(record[1].message.args[0]) == wmsg + + def test_density_from_Universe_userdefn_ValueErrors(self, universe): + import MDAnalysis.analysis.density + # Test len(gridcenter) != 3 + with pytest.raises(ValueError): + D = MDAnalysis.analysis.density.density_from_Universe( + universe, atomselection=self.selections['static'], + delta=self.delta, xdim=10.0, ydim=10.0, zdim=10.0, + gridcenter=self.gridcenters['error1']) + # Test gridcenter includes non-numeric strings + with pytest.raises(ValueError): + D = MDAnalysis.analysis.density.density_from_Universe( + universe, atomselection=self.selections['static'], + delta=self.delta, xdim=10.0, ydim=10.0, zdim=10.0, + gridcenter=self.gridcenters['error2']) + # Test xdim != int or float + with pytest.raises(ValueError): + D = MDAnalysis.analysis.density.density_from_Universe( + universe, atomselection=self.selections['static'], + delta=self.delta, xdim="MDAnalysis", ydim=10.0, zdim=10.0, + gridcenter=self.gridcenters['static_defined']) + class TestGridImport(object): From b5ba583f8834b384a596691f36a787a3aeeef9f0 Mon Sep 17 00:00:00 2001 From: Jonathan Barnoud Date: Wed, 12 Sep 2018 00:32:03 +0200 Subject: [PATCH 431/455] Fix SETTLE in TPR parser (#2068) * Fix SETTLE in TPR parser Support for SETTLE interactions in the TPR parser was added in #1953. Though, the support was only added for the older versions of the TPR format, causing errors with the newest files. In practice, when reading the bonds on a recent TPR file containing SETTLE constraints, the indices to the atoms involved in the bonds would be shifted. This is because, the older TPR files use a different format to describe SETTLE constraints. This commit should fix the issue by supporting both the old and the new format for SETTLE. * Adapt the test to make sure the SETTLE issue is caught The test for SETTLE in TPR now checks that the index are not shifted. --- package/MDAnalysis/topology/tpr/utils.py | 26 +++++++++++++------ .../topology/test_tprparser.py | 2 ++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/topology/tpr/utils.py b/package/MDAnalysis/topology/tpr/utils.py index 5c60fbc7b92..724beeda927 100644 --- a/package/MDAnalysis/topology/tpr/utils.py +++ b/package/MDAnalysis/topology/tpr/utils.py @@ -638,14 +638,24 @@ def do_moltype(data, symtab, fver): elif ik_obj.name == 'SETTLE': # SETTLE interactions are optimized triangular constraints for # water molecules. They should be counted as a pair of bonds - # between the oxigen and the hydrogens. The format only - # specifies the index of the oxygen and assumes that the next - # two atoms are the hydrogens. - base_atom = ilist.iatoms[-1] - bonds += [ - [base_atom, base_atom + 1], - [base_atom, base_atom + 2] - ] + # between the oxigen and the hydrogens. In older versions of + # the TPR format only specifies the index of the oxygen and + # assumes that the next two atoms are the hydrogens. + if len(ias) == 2: + # Old format. Only the first atom is specified. + base_atom = ias[1] + bonds += [ + [base_atom, base_atom + 1], + [base_atom, base_atom + 2], + ] + else: + all_settle = ik_obj.process(ias) + for settle in all_settle: + base_atom = settle[0] + bonds += [ + [settle[0], settle[1]], + [settle[0], settle[2]], + ] else: # other interaction types are not interested at the moment pass diff --git a/testsuite/MDAnalysisTests/topology/test_tprparser.py b/testsuite/MDAnalysisTests/topology/test_tprparser.py index dd2f5144d9b..1d99622a7a2 100644 --- a/testsuite/MDAnalysisTests/topology/test_tprparser.py +++ b/testsuite/MDAnalysisTests/topology/test_tprparser.py @@ -233,3 +233,5 @@ def bonds_water(request): def test_settle(bonds_water): # There are 101 water molecule with 2 bonds each assert len(bonds_water) == 202 + # The last index corresponds to the last water atom + assert bonds_water[-1][1] == 2262 From 73ef0ebbca8bfcb83de524a4dce81cb2dbe3c0c7 Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 12 Sep 2018 11:46:44 +0200 Subject: [PATCH 432/455] added back autofunction entries in MDAnalysis/lib/distances.py and removed :embers: in doc/sphinx/source/documentation_pages/lib/distances.rst instead --- package/MDAnalysis/lib/distances.py | 13 +++++++++++++ .../source/documentation_pages/lib/distances.rst | 3 +-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 2e646d9bf14..b45a3a65a25 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -52,6 +52,19 @@ Functions --------- +.. autofunction:: distance_array +.. autofunction:: self_distance_array +.. autofunction:: capped_distance +.. autofunction:: self_capped_distance +.. autofunction:: calc_bonds +.. autofunction:: calc_angles +.. autofunction:: calc_dihedrals +.. autofunction:: calc_distance +.. autofunction:: calc_angle +.. autofunction:: calc_dihedral +.. autofunction:: apply_PBC +.. autofunction:: transform_RtoS +.. autofunction:: transform_StoR .. autofunction:: augment_coordinates(coordinates, box, r) .. autofunction:: undo_augment(results, translation, nreal) """ diff --git a/package/doc/sphinx/source/documentation_pages/lib/distances.rst b/package/doc/sphinx/source/documentation_pages/lib/distances.rst index 8d89a94b09c..c50b85bd1c6 100644 --- a/package/doc/sphinx/source/documentation_pages/lib/distances.rst +++ b/package/doc/sphinx/source/documentation_pages/lib/distances.rst @@ -1,5 +1,4 @@ .. automodule:: MDAnalysis.lib.distances - :members: @@ -16,4 +15,4 @@ the OpenMP-enable functions. :maxdepth: 1 c_distances - c_distances_openmp \ No newline at end of file + c_distances_openmp From 791ecd970eece2ec763cec502efdfae6a0c8adb4 Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 12 Sep 2018 11:48:50 +0200 Subject: [PATCH 433/455] use numpydoc `See Also` sections instead of `.. seealso::` --- package/MDAnalysis/lib/distances.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index b45a3a65a25..75b04cb78c7 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -163,7 +163,11 @@ def _check_box(box): If `box` is not of the form ``[lx, ly, lz, alpha, beta, gamma]`` or contains data that is not convertible to ``numpy.float32``. - .. seealso: :meth:`MDAnalysis.lib.mdamath.triclinic_vectors` + See Also + -------- + MDAnalysis.lib.mdamath.triclinic_vectors + + .. versionchanged: 0.19.0 * Enforced correspondence of `box` with specified format. * Added automatic conversion of input to :class:`numpy.ndarray` with @@ -441,9 +445,11 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, Currently supports brute force, grid-based, and periodic KDtree search methods. - .. seealso:: :meth:`~MDAnalysis.lib.distances.distance_array` - .. seealso:: :meth:`MDAnalysis.lib.pkdtree.PeriodicKDTree.search` - .. seealso:: :meth:`MDAnalysis.lib.nsgrid.FastNS.search` + See Also + -------- + distance_array + MDAnalysis.lib.pkdtree.PeriodicKDTree.search + MDAnalysis.lib.nsgrid.FastNS.search """ if box is not None: box = np.asarray(box, dtype=np.float32) @@ -847,9 +853,11 @@ def self_capped_distance(reference, max_cutoff, min_cutoff=None, box=None, Currently supports brute force, grid-based, and periodic KDtree search methods. - .. seealso:: :meth:`~MDAnalysis.lib.distances.self_distance_array` - .. seealso:: :meth:`MDAnalysis.lib.pkdtree.PeriodicKDTree.search` - .. seealso:: :meth:`MDAnalysis.lib.nsgrid.FastNS.self_search` + See Also + -------- + self_distance_array + MDAnalysis.lib.pkdtree.PeriodicKDTree.search + MDAnalysis.lib.nsgrid.FastNS.self_search """ if box is not None: box = np.asarray(box, dtype=np.float32) From c9567dc5399f8a0ab1bff27e7576dc8c07495a46 Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 12 Sep 2018 11:52:18 +0200 Subject: [PATCH 434/455] numpydoc selections for parameters with fixed value sets --- package/MDAnalysis/lib/distances.py | 64 +++++++++++++---------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 75b04cb78c7..47299e5a2df 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -262,9 +262,8 @@ def distance_array(reference, configuration, box=None, result=None, ``numpy.float64``. Avoids creating the array which saves time when the function is called repeatedly. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- @@ -328,9 +327,8 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): Preallocated result array which must have the shape ``(n*(n-1)/2,)`` and dtype ``numpy.float64``. Avoids creating the array which saves time when the function is called repeatedly. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- @@ -409,9 +407,9 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. - method : str, optional - Keyword to override the automatic guessing ofthe employed search method. - Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. + method : {'bruteforce', 'nsgrid', 'pkdtree'}, optional + Keyword to override the automatic guessing of the employed search + method. return_distances : bool, optional If set to ``True``, distances will also be returned. @@ -496,9 +494,9 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. - method : str, optional - Keyword to override the automatic guessing ofthe employed search method. - Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. + method : {'bruteforce', 'nsgrid', 'pkdtree'}, optional + Keyword to override the automatic guessing of the employed search + method. Returns ------- @@ -821,9 +819,9 @@ def self_capped_distance(reference, max_cutoff, min_cutoff=None, box=None, triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. - method : str, optional - Keyword to override the automatic guessing ofthe employed search method. - Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. + method : {'bruteforce', 'nsgrid', 'pkdtree'}, optional + Keyword to override the automatic guessing of the employed search + method. Returns ------- @@ -892,9 +890,9 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. - method : str, optional - Keyword to override the automatic guessing ofthe employed search method. - Can be ``'bruteforce'``, ``'nsgrid'``, or ``'pkdtree'``. + method : {'bruteforce', 'nsgrid', 'pkdtree'}, optional + Keyword to override the automatic guessing of the employed search + method. Returns ------- @@ -1156,9 +1154,8 @@ def transform_RtoS(coords, box, backend="serial"): triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- @@ -1204,9 +1201,8 @@ def transform_StoR(coords, box, backend="serial"): triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- @@ -1268,9 +1264,8 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): Preallocated result array which must be of the same length ``n`` as the coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the array in repeated function calls. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- @@ -1355,9 +1350,8 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="seria Preallocated result array which must be of the same length ``n`` as the coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the array in repeated function calls. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- @@ -1454,9 +1448,8 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, Preallocated result array which must be of the same length as the coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the array in repeated function calls. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- @@ -1514,9 +1507,8 @@ def apply_PBC(coords, box, backend="serial"): triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. - backend : str, optional - Select the type of acceleration; ``'serial'`` is always available. - Another possibility is ``'OpenMP'``. + backend : {'serial', 'OpenMP'}, optional + Keyword selecting the type of acceleration. Returns ------- From 4caeea27ce6e5f1d5397fbcd43adc111d2d0e77f Mon Sep 17 00:00:00 2001 From: zeman Date: Wed, 12 Sep 2018 14:38:04 +0200 Subject: [PATCH 435/455] moved nsgrid import to top of lib/distances.py --- package/MDAnalysis/lib/distances.py | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index 47299e5a2df..a512d8ef0d2 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -77,8 +77,7 @@ from .util import check_coords from .mdamath import triclinic_vectors, triclinic_box from ._augment import augment_coordinates, undo_augment - - +from .nsgrid import FastNS # hack to select backend with backend= kwarg. Note that # the cython parallel code (prange) in parallel.distances is @@ -502,13 +501,6 @@ def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, ------- function : callable The function implementing the guessed (or deliberatly chosen) method. - - Note - ---- - Currently implemented methods are present in the ``methods`` dictionary - bruteforce : returns ``_bruteforce_capped`` - PKDtree : return ``_pkdtree_capped`` - NSGrid : return ``_nsgrid_capped`` """ methods = {'bruteforce': _bruteforce_capped, 'pkdtree': _pkdtree_capped, @@ -669,7 +661,7 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, coordinates ``reference[pairs[k, 0]]`` and ``configuration[pairs[k, 1]]``. """ - from .pkdtree import PeriodicKDTree + from .pkdtree import PeriodicKDTree # must be here to avoid circular import kdtree = PeriodicKDTree(box=box) cut = max_cutoff if box is not None else None @@ -745,8 +737,6 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, coordinates ``reference[pairs[k, 0]]`` and ``configuration[pairs[k, 1]]``. """ - from .nsgrid import FastNS - if box is None: # create a pseudobox # define the max range @@ -898,13 +888,6 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, ------- function : callable The function implementing the guessed (or deliberatly chosen) method. - - Note - ---- - Currently implemented methods are present in the ``methods`` dictionary - bruteforce : returns ``_bruteforce_capped_self`` - PKDtree : return ``_pkdtree_capped_self`` - NSGrid : return ``_nsgrid_capped_self`` """ methods = {'bruteforce': _bruteforce_capped_self, 'pkdtree': _pkdtree_capped_self, @@ -1035,7 +1018,7 @@ def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, box=None): distance between the coordinates ``reference[pairs[k, 0]]`` and ``reference[pairs[k, 1]]``. """ - from .pkdtree import PeriodicKDTree + from .pkdtree import PeriodicKDTree # must be here to avoid circular import pairs, distance = [], [] kdtree = PeriodicKDTree(box=box) @@ -1092,8 +1075,6 @@ def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, box=None): distance between the coordinates ``reference[pairs[k, 0]]`` and ``reference[pairs[k, 1]]``. """ - from .nsgrid import FastNS - reference = np.asarray(reference, dtype=np.float32) if reference.shape == (3, ) or len(reference) == 1: return [], [] From ec8dd20a8ac5554755d311a395d7f7c75a0092d8 Mon Sep 17 00:00:00 2001 From: IAlibay Date: Wed, 12 Sep 2018 18:08:52 +0100 Subject: [PATCH 436/455] Adding bond/angle reading to PARM7 TOPParser.py (#2052) * Adds support for reading bonds/angles * Adding bond/angle information for PARM7 * Adds support for reading bonds/angles --- package/CHANGELOG | 1 + package/MDAnalysis/topology/TOPParser.py | 387 +++++++++++++++--- .../data/Amber/ace_mbondi3.error1.parm7 | 4 + .../data/Amber/ace_mbondi3.error2.parm7 | 4 + .../data/Amber/ace_mbondi3.error3.parm7 | 14 + .../data/Amber/ace_mbondi3.parm7 | 141 +++++++ testsuite/MDAnalysisTests/datafiles.py | 8 + .../MDAnalysisTests/topology/test_top.py | 287 ++++++++++++- 8 files changed, 783 insertions(+), 63 deletions(-) create mode 100644 testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error1.parm7 create mode 100644 testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error2.parm7 create mode 100644 testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error3.parm7 create mode 100644 testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.parm7 diff --git a/package/CHANGELOG b/package/CHANGELOG index 3e85b4910be..4588549879f 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -20,6 +20,7 @@ The rules for this file: * 0.18.1 Enhancements + * Added bond/angle/dihedral reading in PARM7 TOPParser (PR #2052) * Replaced multiple apply (_apply_distmat, _apply_kdtree) methods in distance based selections with lib.distances.capped_distance for automatic selection of diff --git a/package/MDAnalysis/topology/TOPParser.py b/package/MDAnalysis/topology/TOPParser.py index 2717f6219b5..4c985427155 100644 --- a/package/MDAnalysis/topology/TOPParser.py +++ b/package/MDAnalysis/topology/TOPParser.py @@ -1,5 +1,5 @@ # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # # MDAnalysis --- https://www.mdanalysis.org # Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors @@ -28,28 +28,37 @@ Amber keywords are turned into the following attributes: -+-----------------+----------------------+ -| AMBER flag | MDAnalysis attribute | -+-----------------+----------------------+ -| ATOM_NAME | names | -+-----------------+----------------------+ -| CHARGE | charges | -+-----------------+----------------------+ -| ATOMIC_NUMBER | elements | -+-----------------+----------------------+ -| MASS | masses | -+-----------------+----------------------+ -| ATOM_TYPE_INDEX | type_indices | -+-----------------+----------------------+ -| AMBER_ATOM_TYPE | types | -+-----------------+----------------------+ -| RESIDUE_LABEL | resnames | -+-----------------+----------------------+ -| RESIDUE_POINTER | residues | -+-----------------+----------------------+ ++----------------------------+----------------------+ +| AMBER flag | MDAnalysis attribute | ++----------------------------+----------------------+ +| ATOM_NAME | names | ++----------------------------+----------------------+ +| CHARGE | charges | ++----------------------------+----------------------+ +| ATOMIC_NUMBER | elements | ++----------------------------+----------------------+ +| MASS | masses | ++----------------------------+----------------------+ +| BONDS_INC_HYDROGEN | bonds | +| BONDS_WITHOUT_HYDROGEN | | ++----------------------------+----------------------+ +| ANGLES_INC_HYDROGEN | angles | +| ANGLES_WITHOUT_HYDROGEN | | ++----------------------------+----------------------+ +| DIHEDRALS_INC_HYDROGEN | dihedrals / improper | +| DIHEDRALS_WITHOUT_HYDROGEN | | ++----------------------------+----------------------+ +| ATOM_TYPE_INDEX | type_indices | ++----------------------------+----------------------+ +| AMBER_ATOM_TYPE | types | ++----------------------------+----------------------+ +| RESIDUE_LABEL | resnames | ++----------------------------+----------------------+ +| RESIDUE_POINTER | residues | ++----------------------------+----------------------+ TODO: - Add reading of bonds etc + More stringent tests .. Note:: @@ -74,6 +83,7 @@ import numpy as np import functools from math import ceil +import itertools from . import guessers from .tables import NUMBER_TO_ELEMENT @@ -92,6 +102,10 @@ Resnums, Segids, AtomAttr, + Bonds, + Angles, + Dihedrals, + Impropers ) @@ -113,6 +127,9 @@ class TOPParser(TopologyReaderBase): - Atomtypes - Resnames - Type_indices + - Bonds + - Angles + - Dihedrals (inc. impropers) Guesses the following attributes: - Elements (if not included in topology) @@ -124,8 +141,10 @@ class TOPParser(TopologyReaderBase): .. _`PARM parameter/topology file specification`: http://ambermd.org/formats.html#topology - .. versionchanged:: 0.7.6 + .. versionchanged:: 0.7.6 parses both amber10 and amber12 formats + .. versionchanged:: 0.18.1 + parses bonds, angles, dihedrals, and impropers """ format = ['TOP', 'PRMTOP', 'PARM7'] @@ -145,7 +164,13 @@ def parse(self, **kwargs): "ATOM_TYPE_INDEX": (1, 10, self.parse_type_indices, "type_indices", 0), "AMBER_ATOM_TYPE": (1, 20, self.parse_types, "types", 0), "RESIDUE_LABEL": (1, 20, self.parse_resnames, "resname", 11), - "RESIDUE_POINTER": (2, 10, self.parse_residx, "respoint", 11), + "RESIDUE_POINTER": (1, 10, self.parse_residx, "respoint", 11), + "BONDS_INC_HYDROGEN": (3, 10, self.parse_bonded, "bondh", 2), + "BONDS_WITHOUT_HYDROGEN": (3, 10, self.parse_bonded, "bonda", 3), + "ANGLES_INC_HYDROGEN": (4, 10, self.parse_bonded, "angh", 4), + "ANGLES_WITHOUT_HYDROGEN": (4, 10, self.parse_bonded, "anga", 5), + "DIHEDRALS_INC_HYDROGEN": (5, 10, self.parse_bonded, "dihh", 6), + "DIHEDRALS_WITHOUT_HYDROGEN": (5, 10, self.parse_bonded, "diha", 7) } attrs = {} # empty dict for attrs that we'll fill @@ -176,28 +201,36 @@ def parse(self, **kwargs): while next_section is not None: try: - (atoms_per, per_line, + (num_per_record, per_line, func, name, sect_num) = sections[next_section] except KeyError: def next_getter(): return self.skipper() else: - num = sys_info[sect_num] + num = sys_info[sect_num] * num_per_record numlines = (num // per_line) if num % per_line != 0: numlines += 1 - attrs[name] = func(atoms_per, numlines) + attrs[name] = func(num_per_record, numlines) def next_getter(): return next(self.topfile) try: line = next_getter() + # Capture case where section is empty w/ 1 empty line + if numlines == 0 and not line.strip(): + line = next_getter() except StopIteration: next_section = None else: - next_section = line.split("%FLAG")[1].strip() + try: + next_section = line.split("%FLAG")[1].strip() + except IndexError: + msg = ("%FLAG section not found, formatting error " + "for PARM7 file {0} ".format(self.filename)) + raise IndexError(msg) # strip out a few values to play with them n_atoms = len(attrs['name']) @@ -210,6 +243,16 @@ def next_getter(): n_res = len(attrs['resname']) + # Deal with recreating bonds and angle records here + attrs['bonds'] = Bonds([i for i in itertools.chain( + attrs.pop('bonda'), attrs.pop('bondh'))]) + + attrs['angles'] = Angles([i for i in itertools.chain( + attrs.pop('anga'), attrs.pop('angh'))]) + + attrs['dihedrals'], attrs['impropers'] = self.parse_dihedrals( + attrs.pop('diha'), attrs.pop('dihh')) + # Guess elements if not in topology if not 'elements' in attrs: attrs['elements'] = Elements( @@ -230,73 +273,248 @@ def next_getter(): return top def skipper(self): - """Skip until we find the next %FLAG entry and return that""" + """TOPParser :class: helper function, skips lines of input parm7 file + until we find the next %FLAG entry and return that + + Returns + ------- + line : string + String containing the current line of the parm7 file + """ line = next(self.topfile) while not line.startswith("%FLAG"): line = next(self.topfile) return line - def parse_names(self, atoms_per, numlines): - vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: x) + def parse_names(self, num_per_record, numlines): + """Extracts atoms names from parm7 file + + Parameters + ---------- + num_per_record : int + The number of entries for each record in the section (unused input) + numlines : int + The number of lines to be parsed in current section + + Returns + ------- + attr : :class:`Atomnames` + A :class:`Atomnames` instance containing the names of each atom as + defined in the parm7 file + """ + vals = self.parsesection_mapper(numlines, lambda x: x) attr = Atomnames(np.array(vals, dtype=object)) return attr - def parse_resnames(self, atoms_per, numlines): - vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: x) + def parse_resnames(self, num_per_record, numlines): + """Extracts the names of each residue + + Parameters + ---------- + num_per_record : int + The number of entries for each recrod in section (unused input) + numlines : int + The number of lines to be parsed in current section + + Returns + ------- + attr : :class:`Resnames` + A :class:`Resnames` instance containing the names of each residue + as defined in the parm7 file + """ + vals = self.parsesection_mapper(numlines, lambda x: x) attr = Resnames(np.array(vals, dtype=object)) return attr - def parse_charges(self, atoms_per, numlines): - vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: float(x)) + def parse_charges(self, num_per_record, numlines): + """Extracts the partial charges for each atom + + Parameters + ---------- + num_per_record : int + The number of entries for each record in section (unused input) + numlines : int + The number of lines to be parsed in current section + + Returns + ------- + attr : :class:`Charges` + A :class:`Charges` instance containing the partial charges of each + atom as defined in the parm7 file + """ + vals = self.parsesection_mapper(numlines, lambda x: float(x)) charges = np.array(vals, dtype=np.float32) charges /= 18.2223 # to electron charge units attr = Charges(charges) return attr - def parse_masses(self, atoms_per, numlines): - vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: float(x)) + def parse_masses(self, num_per_record, numlines): + """Extracts the mass of each atom + + Parameters + ---------- + num_per_record : int + The number of entries for each record in section (unused input) + numlines : int + The number of lines to be parsed in current section + + Returns + ------- + attr : :class:`Masses` + A :class:`Masses` instance containing the mass of each atom as + defined in the parm7 file + """ + vals = self.parsesection_mapper(numlines, lambda x: float(x)) attr = Masses(vals) return attr - def parse_elements(self, atoms_per, numlines): + def parse_elements(self, num_per_record, numlines): + """Extracts the atomic numbers of each atom and converts to element type + + Parameters + ---------- + num_per_record : int + The number of entries for each record in section(unused input) + numlines : int + The number of lines to be pasred in current section + + Returns + ------- + attr : :class:`Elements` + A :class:`Elements` instance containing the element of each atom + as defined in the parm7 file + """ vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: NUMBER_TO_ELEMENT[int(x)]) + numlines, lambda x: NUMBER_TO_ELEMENT[int(x)]) attr = Elements(np.array(vals, dtype=object)) return attr - def parse_types(self, atoms_per, numlines): - vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: x) + def parse_types(self, num_per_record, numlines): + """Extracts the force field atom types of each atom + + Parameters + ---------- + num_per_record : int + The number of entries for each record in section (unused input) + numlines : int + The number of lines to be parsed in current section + + Returns + ------- + attr : :class:`Atomtypes` + A :class:`Atomtypes` instance containing the atom types for each + atom as defined in the parm7 file + """ + vals = self.parsesection_mapper(numlines, lambda x: x) attr = Atomtypes(np.array(vals, dtype=object)) return attr - def parse_type_indices(self, atoms_per, numlines): - vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: int(x)) + def parse_type_indices(self, num_per_record, numlines): + """Extracts the index of atom types of the each atom involved in Lennard + Jones (6-12) interactions. + + Parameters + ---------- + num_per_record : int + The number of entries for each record in section (unused input) + numlines : int + The number of lines to be parsed in current section + + Returns + ------- + attr :class:`TypeIndices` + A :class:`TypeIndices` instance containing the LJ 6-12 atom type + index for each atom + """ + vals = self.parsesection_mapper(numlines, lambda x: int(x)) attr = TypeIndices(np.array(vals, dtype=np.int32)) return attr - def parse_residx(self, atoms_per, numlines): - vals = self.parsesection_mapper( - atoms_per, numlines, lambda x: int(x) - 1) + def parse_residx(self, num_per_record, numlines): + """Extracts the residue pointers for each atom + + Parameters + ---------- + num_per_record : int + The number of entries for each record in section (unused input) + numlines : int + The number of lines to be parsed in current section + + Returns + ------- + vals : list of int + A list of zero-formatted residue pointers for each atom + """ + vals = self.parsesection_mapper(numlines, lambda x: int(x) - 1) return vals - def parsebond(self, atoms_per, numlines): - y = next(self.topfile).strip("%FORMAT(") - section = [] - for i in range(numlines): - l = next(self.topfile) - # Subtract 1 from each number to ensure zero-indexing for the atoms - fields = np.int64(l.split()) - 1 - for j in range(0, len(fields), atoms_per): - section.append(tuple(fields[j:j+atoms_per])) + def parse_chunks(self, data, chunksize): + """Helper function to parse AMBER PRMTOP bonds/angles. + + Parameters + ---------- + data : list of int + Input list of the parm7 bond/angle section, zero-indexed + num_per_record : int + The number of entries for each record in the input list + + Returns + ------- + vals : list of int tuples + A list of tuples containing the atoms involved in a given bonded + interaction + + Note + ---- + In the parm7 format this information is structured in the following + format: [ atoms 1:n, internal index ] + Where 1:n represent the ids of the n atoms involved in the bond/angle + and the internal index links to a given set of FF parameters. + Therefore, to extract the required information, we split out the list + into chunks of size num_per_record, and only extract the atom ids. + """ + vals = [tuple(data[x:x+chunksize-1]) + for x in range(0, len(data), chunksize)] + return vals + + def parse_bonded(self, num_per_record, numlines): + """Extracts bond information from PARM7 format files + + Parameters + ---------- + num_per_record : int + The number of entries for each record in section + numlines : int + The number of lines to be parsed for this section + + Note + ---- + For the bond/angle sections of parm7 files, the atom numbers are set to + coordinate array index values. As detailed in + http://ambermd.org/formats.html to recover the actual atom number, one + should divide the values by 3 and add 1. Here, since we want to satisfy + zero-indexing, we only divide by 3. + """ + fields = self.parsesection_mapper(numlines, lambda x: int(x) // 3) + section = self.parse_chunks(fields, num_per_record) return section - def parsesection_mapper(self, atoms_per, numlines, mapper): + def parsesection_mapper(self, numlines, mapper): + """Parses FORTRAN formatted section, and returns a list of all entries + in each line + + Parameters + ---------- + numlines : int + The number of lines to be parsed in this section + mapper : lambda operator + Operator to format entries in current section + + Returns + ------- + section : list + A list of all entries in a given parm7 section + """ section = [] y = next(self.topfile).strip("%FORMAT(") y.strip(")") @@ -308,3 +526,50 @@ def parsesection_mapper(self, atoms_per, numlines, mapper): if val: section.append(mapper(val)) return section + + def parse_dihedrals(self, diha, dihh): + """Combines hydrogen and non-hydrogen containing AMBER dihedral lists + and extracts sublists for conventional dihedrals and improper angles + + Parameters + ---------- + diha : list of tuples + The atom ids of dihedrals not involving hydrogens + dihh : list of tuples + The atom ids of dihedrals involving hydrogens + + Returns + ------- + dihedrals : :class:`Dihedrals` + A :class:`Dihedrals` instance containing a list of all unique + dihedrals as defined by the parm7 file + impropers : :class:`Impropers` + A :class:`Impropers` instance containing a list of all unique + improper dihedrals as defined by the parm7 file + + Note + ---- + As detailed in http://ambermd.org/formats.html, the dihedral sections + of parm7 files contain information about both conventional dihedrals + and impropers. The following must be accounted for: + 1) If the fourth atom in a dihedral entry is given a negative value, + this indicates that it is an improper. + 2) If the third atom in a dihedral entry is given a negative value, + this indicates that it 1-4 NB interactions are ignored for this + dihedrals. This could be due to the dihedral within a ring, or if it is + part of a multi-term dihedral definition or if it is an improper. + """ + improp = [] + dihed = [] + for i in itertools.chain(diha, dihh): + if i[3] < 0: + improp.append(i[:2]+(abs(i[2]),)+(abs(i[3]),)) + elif i[2] < 0: + vals = i[:2] + (abs(i[2]),) + i[3:] + dihed.append(vals) + else: + dihed.append(i) + dihed = sorted(set(dihed)) + dihedrals = Dihedrals(dihed) + impropers = Impropers(improp) + return dihedrals, impropers diff --git a/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error1.parm7 b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error1.parm7 new file mode 100644 index 00000000000..bfd99825c91 --- /dev/null +++ b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error1.parm7 @@ -0,0 +1,4 @@ +%ERROR VERSION_STAMP = V0001.000 DATE = 09/08/18 15:36:17 +%FLAG TITLE +%FORMAT(20a4) +ACE diff --git a/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error2.parm7 b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error2.parm7 new file mode 100644 index 00000000000..d33a6fccbfb --- /dev/null +++ b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error2.parm7 @@ -0,0 +1,4 @@ +%VERSION VERSION_STAMP = V0001.000 DATE = 09/08/18 15:36:17 +%FLAG ERROR +%FORMAT(20a4) +ACE diff --git a/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error3.parm7 b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error3.parm7 new file mode 100644 index 00000000000..f2639661d8a --- /dev/null +++ b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.error3.parm7 @@ -0,0 +1,14 @@ +%VERSION VERSION_STAMP = V0001.000 DATE = 09/08/18 15:36:17 +%FLAG TITLE +%FORMAT(20a4) +ACE +%FLAG POINTERS +%FORMAT(10I8) + 6 4 3 2 6 1 9 0 0 0 + 16 1 2 1 0 3 3 3 4 0 + 0 0 0 0 0 0 0 0 6 0 + 0 +%FLAG ATOM_NAME +%FORMAT(20a4) +HH31CH3 HH32HH33C O +FOO diff --git a/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.parm7 b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.parm7 new file mode 100644 index 00000000000..803a5c161ec --- /dev/null +++ b/testsuite/MDAnalysisTests/data/Amber/ace_mbondi3.parm7 @@ -0,0 +1,141 @@ +%VERSION VERSION_STAMP = V0001.000 DATE = 09/08/18 15:36:17 +%FLAG TITLE +%FORMAT(20a4) +ACE +%FLAG POINTERS +%FORMAT(10I8) + 6 4 3 2 6 1 9 0 0 0 + 16 1 2 1 0 3 3 3 4 0 + 0 0 0 0 0 0 0 0 6 0 + 0 +%FLAG ATOM_NAME +%FORMAT(20a4) +HH31CH3 HH32HH33C O +%FLAG CHARGE +%FORMAT(5E16.8) + 2.04636429E+00 -6.67300626E+00 2.04636429E+00 2.04636429E+00 1.08823576E+01 + -1.03484442E+01 +%FLAG ATOMIC_NUMBER +%FORMAT(10I8) + 1 6 1 1 6 8 +%FLAG MASS +%FORMAT(5E16.8) + 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 + 1.60000000E+01 +%FLAG ATOM_TYPE_INDEX +%FORMAT(10I8) + 1 2 1 1 3 4 +%FLAG NUMBER_EXCLUDED_ATOMS +%FORMAT(10I8) + 5 4 3 2 1 1 +%FLAG NONBONDED_PARM_INDEX +%FORMAT(10I8) + 1 2 4 7 2 3 5 8 4 5 + 6 9 7 8 9 10 +%FLAG RESIDUE_LABEL +%FORMAT(20a4) +ACE +%FLAG RESIDUE_POINTER +%FORMAT(10I8) + 1 +%FLAG BOND_FORCE_CONSTANT +%FORMAT(5E16.8) + 5.70000000E+02 3.40000000E+02 3.17000000E+02 +%FLAG BOND_EQUIL_VALUE +%FORMAT(5E16.8) + 1.22900000E+00 1.09000000E+00 1.52200000E+00 +%FLAG ANGLE_FORCE_CONSTANT +%FORMAT(5E16.8) + 5.00000000E+01 3.50000000E+01 8.00000000E+01 +%FLAG ANGLE_EQUIL_VALUE +%FORMAT(5E16.8) + 1.91113635E+00 1.91113635E+00 2.10137732E+00 +%FLAG DIHEDRAL_FORCE_CONSTANT +%FORMAT(5E16.8) + 8.00000000E-01 0.00000000E+00 8.00000000E-02 +%FLAG DIHEDRAL_PERIODICITY +%FORMAT(5E16.8) + 1.00000000E+00 2.00000000E+00 3.00000000E+00 +%FLAG DIHEDRAL_PHASE +%FORMAT(5E16.8) + 0.00000000E+00 0.00000000E+00 3.14159400E+00 +%FLAG SCEE_SCALE_FACTOR +%FORMAT(5E16.8) + 1.20000000E+00 1.20000000E+00 1.20000000E+00 +%FLAG SCNB_SCALE_FACTOR +%FORMAT(5E16.8) + 2.00000000E+00 2.00000000E+00 2.00000000E+00 +%FLAG SOLTY +%FORMAT(5E16.8) + 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 +%FLAG LENNARD_JONES_ACOEF +%FORMAT(5E16.8) + 7.51607703E+03 9.71708117E+04 1.04308023E+06 8.61541883E+04 9.24822270E+05 + 8.19971662E+05 5.44261042E+04 6.47841731E+05 5.74393458E+05 3.79876399E+05 +%FLAG LENNARD_JONES_BCOEF +%FORMAT(5E16.8) + 2.17257828E+01 1.26919150E+02 6.75612247E+02 1.12529845E+02 5.99015525E+02 + 5.31102864E+02 1.11805549E+02 6.26720080E+02 5.55666448E+02 5.64885984E+02 +%FLAG BONDS_INC_HYDROGEN +%FORMAT(10I8) + 3 6 2 3 9 2 0 3 2 +%FLAG BONDS_WITHOUT_HYDROGEN +%FORMAT(10I8) + 12 15 1 3 12 3 +%FLAG ANGLES_INC_HYDROGEN +%FORMAT(10I8) + 9 3 12 1 6 3 9 2 6 3 + 12 1 0 3 6 2 0 3 9 2 + 0 3 12 1 +%FLAG ANGLES_WITHOUT_HYDROGEN +%FORMAT(10I8) + 3 12 15 3 +%FLAG DIHEDRALS_INC_HYDROGEN +%FORMAT(10I8) + 9 3 12 15 1 9 3 -12 15 2 + 9 3 -12 15 3 6 3 12 15 1 + 6 3 -12 15 2 6 3 -12 15 3 + 0 3 12 15 1 0 3 -12 15 2 + 0 3 -12 15 3 +%FLAG DIHEDRALS_WITHOUT_HYDROGEN +%FORMAT(10I8) + +%FLAG EXCLUDED_ATOMS_LIST +%FORMAT(10I8) + 2 3 4 5 6 3 4 5 6 4 + 5 6 5 6 6 0 +%FLAG HBOND_ACOEF +%FORMAT(5E16.8) + +%FLAG HBOND_BCOEF +%FORMAT(5E16.8) + +%FLAG HBCUT +%FORMAT(5E16.8) + +%FLAG AMBER_ATOM_TYPE +%FORMAT(20a4) +HC CT HC HC C O +%FLAG TREE_CHAIN_CLASSIFICATION +%FORMAT(20a4) +M M E E M E +%FLAG JOIN_ARRAY +%FORMAT(10I8) + 0 0 0 0 0 0 +%FLAG IROTAT +%FORMAT(10I8) + 0 0 0 0 0 0 +%FLAG RADIUS_SET +%FORMAT(1a80) +ArgH and AspGluO modified Bondi2 radii (mbondi3) +%FLAG RADII +%FORMAT(5E16.8) + 1.20000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 + 1.50000000E+00 +%FLAG SCREEN +%FORMAT(5E16.8) + 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 + 8.50000000E-01 +%FLAG IPOL +%FORMAT(1I8) + 0 diff --git a/testsuite/MDAnalysisTests/datafiles.py b/testsuite/MDAnalysisTests/datafiles.py index 9315e7fc436..11c608c88b8 100644 --- a/testsuite/MDAnalysisTests/datafiles.py +++ b/testsuite/MDAnalysisTests/datafiles.py @@ -94,6 +94,8 @@ "PRMncdf", "TRJncdf", "NCDF", # Amber (netcdf) "PFncdf_Top", "PFncdf_Trj", # Amber ncdf with Positions and Forces "PRMcs", # Amber (format, Issue 1331) + "PRMNCRST", # Amber ncrst with positions/forces/velocities + "PRMErr1", "PRMErr2", "PRMErr3", # Amber TOP files to check raised errors "PQR", # PQR v1 "PQR_icodes", # PQR v2 with icodes "PDBQT_input", # PDBQT @@ -321,6 +323,12 @@ PRMcs = resource_filename(__name__, 'data/Amber/chitosan.prmtop') +PRMNCRST = resource_filename(__name__, 'data/Amber/ace_mbondi3.parm7') + +PRMErr1 = resource_filename(__name__, 'data/Amber/ace_mbondi3.error1.parm7') +PRMErr2 = resource_filename(__name__, 'data/Amber/ace_mbondi3.error2.parm7') +PRMErr3 = resource_filename(__name__, 'data/Amber/ace_mbondi3.error3.parm7') + PQR = resource_filename(__name__, 'data/adk_open.pqr') PQR_icodes = resource_filename(__name__, 'data/1A2C.pqr') diff --git a/testsuite/MDAnalysisTests/topology/test_top.py b/testsuite/MDAnalysisTests/topology/test_top.py index d493d72fa0d..29008f30971 100644 --- a/testsuite/MDAnalysisTests/topology/test_top.py +++ b/testsuite/MDAnalysisTests/topology/test_top.py @@ -21,6 +21,7 @@ # from __future__ import absolute_import import MDAnalysis as mda +import pytest from MDAnalysisTests.topology.base import ParserBase from MDAnalysisTests.datafiles import ( @@ -28,13 +29,18 @@ PRM12, # anti.top PRM7, # tz2.truncoct.parm7.bz2 PRMpbc, + PRMNCRST, + PRMErr1, + PRMErr2, + PRMErr3 ) class TOPBase(ParserBase): parser = mda.topology.TOPParser.TOPParser expected_attrs = [ - "names", "types", "type_indices", "charges", "masses", "resnames" + "names", "types", "type_indices", "charges", "masses", "resnames", + "bonds", "angles", "dihedrals", "impropers" ] expected_n_segments = 1 @@ -45,30 +51,232 @@ def test_attr_size(self, top): assert len(top.charges) == self.expected_n_atoms assert len(top.masses) == self.expected_n_atoms assert len(top.resnames) == self.expected_n_residues + assert len(top.bonds.values) == self.expected_n_bonds + assert len(top.angles.values) == self.expected_n_angles + assert len(top.dihedrals.values) == self.expected_n_dihedrals + assert len(top.impropers.values) == self.expected_n_impropers + + def test_bonds_atom_counts(self, filename): + u = mda.Universe(filename) + assert len(u.atoms[[0]].bonds) == self.expected_n_zero_bonds + assert len(u.atoms[[self.atom_i]].bonds) == self.expected_n_i_bonds + + def test_angles_atom_counts(self, filename): + u = mda.Universe(filename) + assert len(u.atoms[[0]].angles) == self.expected_n_zero_angles + assert len(u.atoms[[self.atom_i]].angles) == self.expected_n_i_angles + + def test_dihedrals_atom_counts(self, filename): + u = mda.Universe(filename) + assert len(u.atoms[[0]].dihedrals) == self.expected_n_zero_dihedrals + assert len(u.atoms[[self.atom_i]].dihedrals) == \ + self.expected_n_i_dihedrals + + def test_impropers_atom_counts(self, filename): + u = mda.Universe(filename) + assert len(u.atoms[[0]].impropers) == self.expected_n_zero_impropers + assert len(u.atoms[[self.atom_i]].impropers) == \ + self.expected_n_i_impropers + + def test_bonds_identity(self, top): + vals = top.bonds.values + for bond in self.atom_zero_bond_values: + assert (bond in vals) or (bond[::-1] in vals) + for bond in self.atom_i_bond_values: + assert (bond in vals) or (bond[::-1] in vals) + + def test_angles_identity(self, top): + vals = top.angles.values + for ang in self.atom_zero_angle_values: + assert (ang in vals) or (ang[::-1] in vals) + for ang in self.atom_i_angle_values: + assert (ang in vals) or (ang[::-1] in vals) + + def test_dihedrals_identity(self, top): + vals = top.dihedrals.values + for dih in self.atom_zero_dihedral_values: + assert (dih in vals) or (dih[::-1] in vals) + for dih in self.atom_i_dihedral_values: + assert (dih in vals) or (dih[::-1] in vals) + + def test_impropers_identity(self, top): + vals = top.impropers.values + for imp in self.atom_zero_improper_values: + assert (imp in vals) or (imp[::-1] in vals) + for imp in self.atom_i_improper_values: + assert (imp in vals) or (imp[::-1] in vals) + + def test_angle_atoms_bonded(self, top): + vals = top.bonds.values + for ang in top.angles.values: + for b in ((ang[0], ang[1]), (ang[1], ang[2])): + assert (b in vals) or (b[::-1] in vals) + + def test_dihedral_atoms_bonded(self, top): + vals = top.bonds.values + for dih in top.dihedrals.values: + for b in ((dih[0], dih[1]), (dih[1], dih[2]), (dih[2], dih[3])): + assert (b in vals) or (b[::-1] in vals) + + def test_improper_atoms_bonded(self, top): + vals = top.bonds.values + for imp in top.impropers.values: + for b in ((imp[0], imp[2]), (imp[1], imp[2]), (imp[2], imp[3])): + assert (b in vals) or (b[::-1] in vals) class TestPRMParser(TOPBase): ref_filename = PRM expected_n_atoms = 252 expected_n_residues = 14 + expected_n_bonds = 259 + expected_n_angles = 456 + expected_n_dihedrals = 673 + expected_n_impropers = 66 guessed_attrs = ['elements'] + atom_i = 79 + expected_n_zero_bonds = 4 + expected_n_i_bonds = 3 + expected_n_zero_angles = 9 + expected_n_i_angles = 9 + expected_n_zero_dihedrals = 14 + expected_n_i_dihedrals = 15 + expected_n_zero_impropers = 0 + expected_n_i_impropers = 4 + atom_zero_bond_values = ((0, 4), (0, 1), (0, 2), (0, 3)) + atom_i_bond_values = ((79, 80), (79, 83), (77, 79)) + atom_zero_angle_values = ((0, 4, 6), (0, 4, 10), (3, 0, 4), + (2, 0, 3), (2, 0, 4), (1, 0, 2), + (1, 0, 3), (1, 0, 4), (0, 4, 5)) + atom_i_angle_values = ((80, 79, 83), (77, 79, 80), (77, 79, 83), + (74, 77, 79), (79, 80, 81), (79, 80, 82), + (79, 83, 84), (79, 83, 85), (78, 77, 79)) + atom_zero_dihedral_values = ((0, 4, 10, 11), (0, 4, 10, 12), + (3, 0, 4, 5), (3, 0, 4, 6), + (3, 0, 4, 10), (2, 0, 4, 5), + (2, 0, 4, 6), (2, 0, 4, 10), + (1, 0, 4, 5), (1, 0, 4, 6), + (1, 0, 4, 10), (0, 4, 6, 7), + (0, 4, 6, 8), (0, 4, 6, 9)) + atom_i_dihedral_values = ((71, 74, 77, 79), (74, 77, 79, 80), + (74, 77, 79, 83), (75, 74, 77, 79), + (76, 74, 77, 79), (77, 79, 80, 81), + (77, 79, 80, 82), (77, 79, 83, 84), + (77, 79, 83, 85), (78, 77, 79, 80), + (78, 77, 79, 83), (80, 79, 83, 84), + (80, 79, 83, 85), (81, 80, 79, 83), + (82, 80, 79, 83)) + atom_zero_improper_values = () + atom_i_improper_values = ((74, 79, 77, 78), (77, 80, 79, 83), + (79, 81, 80, 82), (79, 84, 83, 85)) class TestPRM12Parser(TOPBase): ref_filename = PRM12 expected_attrs = [ - "names", "types", "type_indices", "charges", "masses", "resnames" + "names", "types", "type_indices", "charges", "masses", "resnames", + "bonds", "angles", "dihedrals", "impropers" ] expected_n_atoms = 8923 expected_n_residues = 2861 + expected_n_bonds = 8947 + expected_n_angles = 756 + expected_n_dihedrals = 1128 + expected_n_impropers = 72 + expected_n_zero_bonds = 1 + expected_n_i_bonds = 4 + expected_n_zero_angles = 1 + expected_n_i_angles = 12 + expected_n_zero_dihedrals = 3 + expected_n_i_dihedrals = 28 + expected_n_zero_impropers = 0 + expected_n_i_impropers = 1 + atom_i = 335 ref_proteinatoms = 0 + atom_zero_bond_values = ((0, 1),) + atom_i_bond_values = ((335, 337), (335, 354), + (334, 335), (335, 336)) + atom_zero_angle_values = ((0, 1, 2),) + atom_i_angle_values = ((337, 335, 354), (335, 337, 338), + (335, 337, 351), (335, 354, 352), + (334, 335, 337), (334, 335, 354), + (332, 334, 335), (336, 335, 337), + (336, 335, 354), (335, 354, 355), + (335, 354, 356), (334, 335, 336)) + atom_zero_dihedral_values = ((0, 1, 2, 3), (0, 1, 2, 4), + (0, 1, 2, 5)) + atom_i_dihedral_values = ((329, 332, 334, 335), (332, 334, 335, 336), + (332, 334, 335, 337), (332, 334, 335, 354), + (332, 352, 354, 335), (333, 332, 334, 335), + (334, 335, 337, 338), (334, 335, 337, 351), + (334, 335, 354, 352), (334, 335, 354, 355), + (334, 335, 354, 356), (335, 334, 332, 352), + (335, 337, 338, 339), (335, 337, 338, 340), + (335, 337, 351, 341), (335, 337, 351, 350), + (335, 354, 352, 353), (335, 354, 352, 357), + (336, 335, 337, 338), (336, 335, 337, 351), + (336, 335, 354, 352), (336, 335, 354, 355), + (336, 335, 354, 356), (337, 335, 354, 352), + (337, 335, 354, 355), (337, 335, 354, 356), + (338, 337, 335, 354), (351, 337, 335, 354)) + atom_zero_improper_values = () + atom_i_improper_values = ((335, 337, 338, 351),) class TestParm7Parser(TOPBase): ref_filename = PRM7 expected_n_atoms = 5827 expected_n_residues = 1882 + expected_n_bonds = 5834 + expected_n_angles = 402 + expected_n_dihedrals = 602 + expected_n_impropers = 55 guessed_attrs = ['elements'] + atom_i = 135 + expected_n_zero_bonds = 4 + expected_n_i_bonds = 4 + expected_n_zero_angles = 9 + expected_n_i_angles = 13 + expected_n_zero_dihedrals = 14 + expected_n_i_dihedrals = 27 + expected_n_zero_impropers = 0 + expected_n_i_impropers = 2 + atom_zero_bond_values = ((0, 4), (0, 1), (0, 2), (0, 3)) + atom_i_bond_values = ((135, 137), (135, 155), (133, 135), + (135, 136)) + atom_zero_angle_values = ((0, 4, 6), (0, 4, 11), (3, 0, 4), + (2, 0, 3), (2, 0, 4), (1, 0, 2), + (1, 0, 3), (1, 0, 4), (0, 4, 5)) + atom_i_angle_values = ((131, 133, 135), (137, 135, 155), + (135, 137, 140), (135, 155, 156), + (135, 155, 157), (133, 135, 137), + (133, 135, 155), (136, 135, 137), + (136, 135, 155), (135, 137, 138), + (135, 137, 139), (134, 133, 135), + (133, 135, 136)) + atom_zero_dihedral_values = ((0, 4, 6, 7), (0, 4, 6, 8), + (0, 4, 6, 9), (0, 4, 11, 12), + (0, 4, 11, 13), (1, 0, 4, 5), + (1, 0, 4, 6), (1, 0, 4, 11), + (2, 0, 4, 5), (2, 0, 4, 6), + (2, 0, 4, 11), (3, 0, 4, 5), + (3, 0, 4, 6), (3, 0, 4, 11)) + atom_i_dihedral_values = ((113, 131, 133, 135), (131, 133, 135, 136), + (131, 133, 135, 137), (131, 133, 135, 155), + (132, 131, 133, 135), (133, 135, 137, 138), + (133, 135, 137, 139), (133, 135, 137, 140), + (133, 135, 155, 156), (133, 135, 155, 157), + (134, 133, 135, 136), (134, 133, 135, 137), + (134, 133, 135, 155), (135, 137, 140, 141), + (135, 137, 140, 154), (135, 155, 157, 158), + (135, 155, 157, 159), (136, 135, 137, 138), + (136, 135, 137, 139), (136, 135, 137, 140), + (136, 135, 155, 156), (136, 135, 155, 157), + (137, 135, 155, 156), (137, 135, 155, 157), + (138, 137, 135, 155), (139, 137, 135, 155), + (140, 137, 135, 155)) + atom_zero_improper_values = () + atom_i_improper_values = ((131, 135, 133, 134), (135, 157, 155, 156)) class TestPRM2(TOPBase): @@ -76,4 +284,79 @@ class TestPRM2(TOPBase): expected_n_atoms = 5071 expected_n_residues = 1686 ref_proteinatoms = 22 + expected_n_bonds = 5070 + expected_n_angles = 36 + expected_n_dihedrals = 41 + expected_n_impropers = 4 guessed_attrs = ['elements'] + atom_i = 14 + expected_n_zero_bonds = 1 + expected_n_i_bonds = 3 + expected_n_zero_angles = 3 + expected_n_i_angles = 8 + expected_n_zero_dihedrals = 2 + expected_n_i_dihedrals = 18 + expected_n_zero_impropers = 0 + expected_n_i_impropers = 2 + atom_zero_bond_values = ((0, 1),) + atom_i_bond_values = ((14, 15), (14, 16), (8, 14)) + atom_zero_angle_values = ((0, 1, 2), (0, 1, 3), (0, 1, 4)) + atom_i_angle_values = ((15, 14, 16), (14, 16, 18), (10, 8, 14), + (8, 14, 15), (8, 14, 16), (6, 8, 14), + (14, 16, 17), (9, 8, 14)) + atom_zero_dihedral_values = ((0, 1, 4, 5), (0, 1, 4, 6)) + atom_i_dihedral_values = ((4, 6, 8, 14), (6, 8, 14, 15), + (6, 8, 14, 16), (7, 6, 8, 14), + (8, 14, 16, 17), (8, 14, 16, 18), + (9, 8, 14, 15), (9, 8, 14, 16), + (10, 8, 14, 15), (10, 8, 14, 16), + (11, 10, 8, 14), (12, 10, 8, 14), + (13, 10, 8, 14), (14, 16, 18, 19), + (14, 16, 18, 20), (14, 16, 18, 21), + (15, 14, 16, 17), (15, 14, 16, 18)) + atom_zero_improper_values = () + atom_i_improper_values = ((8, 16, 14, 15), (14, 18, 16, 17)) + + +class TestPRMNCRST(TOPBase): + # Test case of PARM7 with no non-hydrogen including dihedrals + ref_filename = PRMNCRST + expected_n_atoms = 6 + expected_n_residues = 1 + ref_proteinatoms = 6 + expected_n_bonds = 5 + expected_n_angles = 7 + expected_n_dihedrals = 3 + expected_n_impropers = 0 + atom_i = 4 + expected_n_zero_bonds = 1 + expected_n_i_bonds = 2 + expected_n_zero_angles = 3 + expected_n_i_angles = 4 + expected_n_zero_dihedrals = 1 + expected_n_i_dihedrals = 3 + expected_n_zero_impropers = 0 + expected_n_i_impropers = 0 + atom_zero_bond_values = ((0, 1),) + atom_i_bond_values = ((1, 4), (4, 5)) + atom_zero_angle_values = ((0, 1, 2), (0, 1, 3), (0, 1, 4)) + atom_i_angle_values = ((0, 1, 4), (1, 4, 5), (2, 1, 4), (3, 1, 4)) + atom_zero_dihedral_values = ((0, 1, 4, 5),) + atom_i_dihedral_values = ((0, 1, 4, 5), (2, 1, 4, 5), (3, 1, 4, 5)) + atom_zero_improper_values = () + atom_i_improper_values = () + + +class TestErrors(object): + # Check Errors being raised + def test_versionline(self): + with pytest.raises(ValueError): + u = mda.Universe(PRMErr1) + + def test_title(self): + with pytest.raises(ValueError): + u = mda.Universe(PRMErr2) + + def test_flag(self): + with pytest.raises(IndexError): + u = mda.Universe(PRMErr3) From fdd326160238b1b9c6d86d92abde613af5a4ff30 Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 10:20:27 +0200 Subject: [PATCH 437/455] removed obsolete functions calc_distance(), calc_angle(), and calc_dihedral() from lib.distances --- package/MDAnalysis/lib/distances.py | 102 +--------------------------- 1 file changed, 1 insertion(+), 101 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index a512d8ef0d2..c9ebafc4096 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -1157,7 +1157,7 @@ def transform_RtoS(coords, box, backend="serial"): # Create inverse matrix of box # need order C here - inv = np.array(np.matrix(box).I, dtype=np.float32, order='C') + inv = np.array(np.linalg.inv(box), dtype=np.float32, order='C') _run("coord_transform", args=(coords, inv), backend=backend) @@ -1514,103 +1514,3 @@ def apply_PBC(coords, box, backend="serial"): _run("triclinic_pbc", args=(coords, box, box_inv), backend=backend) return coords - - -def calc_distance(a, b, box=None): - """Calculates the distance between positions `a` and `b`. - - If the optional argument `box` is supplied, the minimum image convention is - applied during distance calculation. Either orthogonal or triclinic boxes - are supported. - - Parameters - ---------- - a,b : numpy.ndarray - Single position vectors of shape ``(3,)``. - box : numpy.ndarray, optional - The unitcell dimensions of the system, which can be orthogonal or - triclinic and must be provided in the same format as returned by - :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n - ``[lx, ly, lz, alpha, beta, gamma]``. - - Returns - ------- - distance : float - The distance between positions `a` and `b`. - - - .. versionadded:: 0.18.1 - """ - return calc_bonds(a, b, box=box) - - -def calc_angle(a, b, c, box=None): - """Calculates the angle (in degrees) between the positions `a`, `b`, and - `c`, where `b` represents the apex of the angle:: - - b---c - / - a - - If the optional argument `box` is supplied, periodic boundaries are taken - into account when constructing the connecting vectors between coordinates, - i.e., the minimum image convention is applied for the vectors forming the - angle. Either orthogonal or triclinic boxes are supported. - - Parameters - ---------- - a,b,c : numpy.ndarray - Single position vectors of shape ``(3,)``. - box : numpy.ndarray, optional - The unitcell dimensions of the system, which can be orthogonal or - triclinic and must be provided in the same format as returned by - :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n - ``[lx, ly, lz, alpha, beta, gamma]``. - - Returns - ------- - angle : float - The angle between the vectors `b`:math:`\\rightarrow`\ `a` and - `b`:math:`\\rightarrow`\ `c`. - - - .. versionadded:: 0.18.1 - """ - return np.rad2deg(calc_angles(a, b, c, box=box)) - - -def calc_dihedral(a, b, c, d, box=None): - """Calculates the dihedral angle (in degrees) between the planes spanned by - the coordinates (`a`, `b`, `c`) and (`b`, `c`, `d`):: - - d - | - b-----c - / - a - - If the optional argument `box` is supplied, periodic boundaries are taken - into account when constructing the connecting vectors between coordinates, - i.e., the minimum image convention is applied for the vectors forming the - dihedral angle. Either orthogonal or triclinic boxes are supported. - - Parameters - ---------- - a,b,c,d : numpy.ndarray - Single coordinate vectors of shape ``(3,)``. - box : numpy.ndarray, optional - The unitcell dimensions of the system, which can be orthogonal or - triclinic and must be provided in the same format as returned by - :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n - ``[lx, ly, lz, alpha, beta, gamma]``. - - Returns - ------- - dihedral : float - The dihedral angle between the planes spanned by the coordinates - (`a`, `b`, `c`) and (`b`, `c`, `d`). - - - .. versionadded:: 0.18.1 - """ - return np.rad2deg(calc_dihedrals(a, b, c, d, box)) From ef0ee31168e02dfd08699cf1820851a2c7cafd6b Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 10:23:50 +0200 Subject: [PATCH 438/455] replaced obsolete functions calc_distance -> calc_bonds, calc_angle -> calc_angles, calc_dihedral -> calc_dihedrals in analysis.hbonds and in core.topologyobjects --- .../analysis/hbonds/hbond_analysis.py | 18 +++++++----- .../analysis/hbonds/wbridge_analysis.py | 28 +++++++++++-------- package/MDAnalysis/core/topologyobjects.py | 10 +++---- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index f39744b74fe..2a57b6c0559 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -807,7 +807,7 @@ def _get_bonded_hydrogens_list(self, atom, **kwargs): hydrogens = [ a for a in self.u.atoms[atom.index + 1:atom.index + 4] if (a.name.startswith(('H', '1H', '2H', '3H')) and - distances.calc_distance(atom.position, a.position, box) < self.r_cov[atom.name[0]]) + distances.calc_bonds(atom.position, a.position, box=box) < self.r_cov[atom.name[0]]) ] except IndexError: hydrogens = [] # weird corner case that atom is the last one in universe @@ -993,10 +993,12 @@ def _get_timestep(): for h in donor_h_set: res = ns_acceptors.search(h, self.distance) for a in res: - angle = distances.calc_angle(d.position, h.position, - a.position, box=box) + angle = distances.calc_angles(d.position, + h.position, + a.position, box=box) + angle = np.rad2deg(angle) donor_atom = h if self.distance_type != 'heavy' else d - dist = distances.calc_distance(donor_atom.position, a.position, box) + dist = distances.calc_bonds(donor_atom.position, a.position, box=box) if angle >= self.angle and dist <= self.distance: self.logger_debug( "S1-D: {0!s} <-> S2-A: {1!s} {2:f} A, {3:f} DEG".format(h.index, a.index, dist, angle)) @@ -1019,10 +1021,12 @@ def _get_timestep(): (h.index, a.index) in already_found or (a.index, h.index) in already_found): continue - angle = distances.calc_angle(d.position, h.position, - a.position, box=box) + angle = distances.calc_angles(d.position, + h.position, + a.position, box=box) + angle = np.rad2deg(angle) donor_atom = h if self.distance_type != 'heavy' else d - dist = distances.calc_distance(donor_atom.position, a.position, box) + dist = distances.calc_bonds(donor_atom.position, a.position, box=box) if angle >= self.angle and dist <= self.distance: self.logger_debug( "S1-A: {0!s} <-> S2-D: {1!s} {2:f} A, {3:f} DEG".format(a.index, h.index, dist, angle)) diff --git a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py index b6bcc7f9449..419355e33c6 100644 --- a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py @@ -636,11 +636,12 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = distances.calc_distance(donor_atom.position, - a.position) + dist = distances.calc_bonds(donor_atom.position, + a.position) if dist <= self.distance: - angle = distances.calc_angle(d.position, h.position, + angle = distances.calc_angles(d.position, h.position, a.position) + angle = np.rad2deg(angle) if angle >= self.angle: self.logger_debug( "S1-D: {0!s} <-> W-A: {1!s} {2:f} A, {3:f} DEG"\ @@ -662,11 +663,12 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = distances.calc_distance(donor_atom.position, - a.position) + dist = distances.calc_bonds(donor_atom.position, + a.position) if dist <= self.distance: - angle = distances.calc_angle(d.position, h.position, + angle = distances.calc_angles(d.position, h.position, a.position) + angle = np.rad2deg(angle) if angle >= self.angle: self.logger_debug( "S1-A: {0!s} <-> W-D: {1!s} {2:f} A, {3:f} DEG"\ @@ -712,11 +714,12 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = distances.calc_distance(donor_atom.position, - a.position) + dist = distances.calc_bonds(donor_atom.position, + a.position) if dist <= self.distance: - angle = distances.calc_angle(d.position, h.position, + angle = distances.calc_angles(d.position, h.position, a.position) + angle = np.rad2deg(angle) if angle >= self.angle: self.logger_debug( "WB-D: {0!s} <-> S2-A: {1!s} {2:f} A, {3:f} DEG"\ @@ -736,11 +739,12 @@ def run(self, **kwargs): res = ns_acceptors.search(h, self.distance) for a in res: donor_atom = h if self.distance_type != 'heavy' else d - dist = distances.calc_distance(donor_atom.position, - a.position) + dist = distances.calc_bonds(donor_atom.position, + a.position) if dist <= self.distance: - angle = distances.calc_angle(d.position, h.position, + angle = distances.calc_angles(d.position, h.position, a.position) + angle = np.rad2deg(angle) if angle >= self.angle: self.logger_debug( "WB-A: {0!s} <-> S2-D: {1!s} {2:f} A, {3:f} DEG"\ diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index ef707f90555..f57e3346dfe 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -201,7 +201,7 @@ def length(self, pbc=True): """ box = self.universe.dimensions if pbc else None - return distances.calc_distance(self[0].position, self[1].position, box) + return distances.calc_bonds(self[0].position, self[1].position, box) value = length @@ -241,8 +241,8 @@ def angle(self, pbc=True): """ box = self.universe.dimensions if pbc else None - return distances.calc_angle( - self[0].position, self[1].position, self[2].position, box) + return np.rad2deg(distances.calc_angles( + self[0].position, self[1].position, self[2].position, box)) value = angle @@ -291,8 +291,8 @@ def dihedral(self, pbc=True): box = self.universe.dimensions if pbc else None A, B, C, D = self.atoms - return distances.calc_dihedral( - A.position, B.position, C.position, D.position, box) + return np.rad2deg(distances.calc_dihedrals( + A.position, B.position, C.position, D.position, box)) value = dihedral From 0a9105ed01de38aab070a225da4432c9979839c2 Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 10:27:25 +0200 Subject: [PATCH 439/455] transformed tests for obsolete functions calc_distance, calc_angle, and calc_dihedral into tests for single coordinate input of calc_bonds, calc_angles, and calc_dihedrals --- .../MDAnalysisTests/lib/test_distances.py | 99 ------------------- .../MDAnalysisTests/utils/test_distances.py | 89 +++++++++++++++-- 2 files changed, 81 insertions(+), 107 deletions(-) diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 46ae02aa018..930c4b24450 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -287,102 +287,3 @@ def test_method_selection(box, npoints, cutoff, meth): size=(npoints, 3)).astype(np.float32)) method = mda.lib.distances._determine_method(points, points, cutoff, box=box) assert_equal(method.__name__, meth) - - -# different boxlengths to shift a coordinate -shifts = [ - ((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)), # no shifting - ((1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 0)), # single box lengths - ((-1, 0, 1), (0, -1, 0), (1, 0, 1), (-1, -1, -1)), # negative single - ((4, 3, -2), (-2, 2, 2), (-5, 2, 2), (0, 2, 2)), # multiple boxlengths -] - - -@pytest.mark.parametrize('shift', shifts) -@pytest.mark.parametrize('periodic', [True, False]) -def test_calc_distance(shift, periodic): - box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) - - coords = np.array([[1, 1, 1], [3, 1, 1]], dtype=np.float32) - - shift1, shift2, _, _ = shift - - coords[0] += shift1 * box[:3] - coords[1] += shift2 * box[:3] - - box = box if periodic else None - result = mda.lib.distances.calc_distance(coords[0], coords[1], box) - - reference = 2.0 if periodic else np.linalg.norm(coords[0] - coords[1]) - - assert_almost_equal(result, reference, decimal=3) - - -@pytest.mark.parametrize('case', [ - # 90 degree angle - (np.array([[1, 1, 1], [1, 2, 1], [2, 2, 1]], dtype=np.float32), 90.), - # straight line / 180. - (np.array([[1, 1, 1], [1, 2, 1], [1, 3, 1]], dtype=np.float32), 180.), - # 45 - (np.array([[1, 1, 1], [1, 2, 1], [2, 1, 1]], dtype=np.float32), 45.), -]) -@pytest.mark.parametrize('shift', shifts) -@pytest.mark.parametrize('periodic', [True, False]) -def test_calc_angle(case, shift, periodic): - def manual_angle(x, y, z): - return np.rad2deg(mda.lib.mdamath.angle(y - x, y - z)) - - box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) - (a, b, c), ref = case - - shift1, shift2, shift3, _ = shift - - a += shift1 * box[:3] - b += shift2 * box[:3] - c += shift3 * box[:3] - - box = box if periodic else None - result = mda.lib.distances.calc_angle(a, b, c, box) - - reference = ref if periodic else manual_angle(a, b, c) - - assert_almost_equal(result, reference, decimal=3) - - -@pytest.mark.parametrize('case', [ - # 0 degree angle (cis) - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 1]], dtype=np.float32), 0.), - # 180 degree (trans) - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 1]], dtype=np.float32), 180.), - # 90 degree - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 2]], dtype=np.float32), 90.), - # other 90 degree - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 0]], dtype=np.float32), 90.), - # 45 degree - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 2]], dtype=np.float32), 45.), - # 135 - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 2]], dtype=np.float32), 135.), -]) -@pytest.mark.parametrize('shift', shifts) -@pytest.mark.parametrize('periodic', [True, False]) -def test_calc_dihedral(case, shift, periodic): - def manual_dihedral(a, b, c, d): - return np.rad2deg(mda.lib.mdamath.dihedral(b - a, c - b, d - c)) - - box = np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) - - (a, b, c, d), ref = case - - shift1, shift2, shift3, shift4 = shift - - a += shift1 * box[:3] - b += shift2 * box[:3] - c += shift3 * box[:3] - d += shift4 * box[:3] - - box = box if periodic else None - result = mda.lib.distances.calc_dihedral(a, b, c, d, box) - - reference = ref if periodic else manual_dihedral(a, b, c, d) - - assert_almost_equal(abs(result), abs(reference), decimal=3) diff --git a/testsuite/MDAnalysisTests/utils/test_distances.py b/testsuite/MDAnalysisTests/utils/test_distances.py index b5b7f6c0f99..bda8e9f83ba 100644 --- a/testsuite/MDAnalysisTests/utils/test_distances.py +++ b/testsuite/MDAnalysisTests/utils/test_distances.py @@ -383,7 +383,6 @@ def triclinic_box(): @pytest.fixture() def positions(): # dummy atom data - a = np.array([[0., 0., 0.], [0., 0., 0.], [0., 11., 0.], [1., 1., 1.]], dtype=np.float32) b = np.array([[0., 0., 0.], [1., 1., 1.], [0., 0., 0.], [29., -21., 99.]], dtype=np.float32) c = np.array([[0., 0., 0.], [2., 2., 2.], [11., 0., 0.], [1., 9., 9.]], dtype=np.float32) @@ -394,13 +393,6 @@ def positions(): def convert_position_dtype(a, b, c, d, dtype): return a.astype(dtype), b.astype(dtype), c.astype(dtype), d.astype(dtype) - @staticmethod - @pytest.fixture() - def wrongtype(): - # declared as float64 and should raise TypeError - return np.array([[0., 0., 0.], [3., 3., 3.], [3., 3., 3.], [3., 3., 3.]], - dtype=np.float64) - @staticmethod @pytest.fixture() def wronglength(): @@ -408,6 +400,12 @@ def wronglength(): return np.array([[0., 0., 0.], [3., 3., 3.]], dtype=np.float32) + # coordinate shifts for single coord tests + shifts = [((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)), # no shifting + ((1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 0)), # single box lengths + ((-1, 0, 1), (0, -1, 0), (1, 0, 1), (-1, -1, -1)), # negative single + ((4, 3, -2), (-2, 2, 2), (-5, 2, 2), (0, 2, 2))] # multiple boxlengths + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) def test_bonds(self, positions, box, backend, dtype): a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) @@ -457,6 +455,26 @@ def test_bonds_triclinic(self, positions, triclinic_box, backend): reference = np.array([0.0, 1.7320508, 1.4142136, 2.82842712]) assert_almost_equal(dists, reference, self.prec, err_msg="calc_bonds with triclinic box failed") + @pytest.mark.parametrize('shift', shifts) + @pytest.mark.parametrize('periodic', [True, False]) + def test_bonds_single_coords(self, shift, periodic, backend): + box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) + + coords = np.array([[1, 1, 1], [3, 1, 1]], dtype=np.float32) + + shift1, shift2, _, _ = shift + + coords[0] += shift1 * box[:3] + coords[1] += shift2 * box[:3] + + box = box if periodic else None + result = MDAnalysis.lib.distances.calc_bonds(coords[0], coords[1], box, + backend=backend) + + reference = 2.0 if periodic else np.linalg.norm(coords[0] - coords[1]) + + assert_almost_equal(result, reference, decimal=self.prec) + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) def test_angles(self, positions, backend, dtype): a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) @@ -480,6 +498,32 @@ def test_angles_bad_result(self, positions, backend): MDAnalysis.lib.distances.calc_angles( a, b, c, result=badresult, backend=backend) # Bad result array + @pytest.mark.parametrize('case', [ + (np.array([[1, 1, 1], [1, 2, 1], [2, 2, 1]], dtype=np.float32), 0.5 * np.pi), # 90 degree angle + (np.array([[1, 1, 1], [1, 2, 1], [1, 3, 1]], dtype=np.float32), np.pi), # straight line / 180. + (np.array([[1, 1, 1], [1, 2, 1], [2, 1, 1]], dtype=np.float32), 0.25 * np.pi), # 45 + ]) + @pytest.mark.parametrize('shift', shifts) + @pytest.mark.parametrize('periodic', [True, False]) + def test_angles_single_coords(self, case, shift, periodic, backend): + def manual_angle(x, y, z): + return MDAnalysis.lib.mdamath.angle(y - x, y - z) + + box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) + (a, b, c), ref = case + + shift1, shift2, shift3, _ = shift + + a += shift1 * box[:3] + b += shift2 * box[:3] + c += shift3 * box[:3] + + box = box if periodic else None + result = MDAnalysis.lib.distances.calc_angles(a, b, c, box, + backend=backend) + reference = ref if periodic else manual_angle(a, b, c) + assert_almost_equal(result, reference, decimal=self.prec) + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) def test_dihedrals(self, positions, backend, dtype): a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) @@ -525,7 +569,36 @@ def test_dihedrals_bad_result(self, positions, backend): a, b, c, d, result=badresult, backend=backend) # Bad result array + @pytest.mark.parametrize('case', [ + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 1]], dtype=np.float32), 0.), # 0 degree angle (cis) + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 1]], dtype=np.float32), np.pi), # 180 degree (trans) + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 2]], dtype=np.float32), 0.5 * np.pi), # 90 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 0]], dtype=np.float32), 0.5 * np.pi), # other 90 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 2]], dtype=np.float32), 0.25 * np.pi), # 45 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 2]], dtype=np.float32), 0.75 * np.pi), # 135 + ]) + @pytest.mark.parametrize('shift', shifts) + @pytest.mark.parametrize('periodic', [True, False]) + def test_dihedrals_single_coords(self, case, shift, periodic, backend): + def manual_dihedral(a, b, c, d): + return MDAnalysis.lib.mdamath.dihedral(b - a, c - b, d - c) + + box = np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) + + (a, b, c, d), ref = case + shift1, shift2, shift3, shift4 = shift + + a += shift1 * box[:3] + b += shift2 * box[:3] + c += shift3 * box[:3] + d += shift4 * box[:3] + + box = box if periodic else None + result = MDAnalysis.lib.distances.calc_dihedrals(a, b, c, d, box, + backend=backend) + reference = ref if periodic else manual_dihedral(a, b, c, d) + assert_almost_equal(abs(result), abs(reference), decimal=self.prec) def test_numpy_compliance(self, positions, backend): a, b, c, d = positions From eb875da491df9a5dd53ccf81d0da9943daedab6c Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 11:36:55 +0200 Subject: [PATCH 440/455] improved docstrings of calc_bonds, calc_angles, and calc_dihedrals in lib.distances to better reflect the possibility of single coordinate input --- package/MDAnalysis/lib/distances.py | 85 +++++++++++++++-------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index c9ebafc4096..b2562078199 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -1209,9 +1209,10 @@ def transform_StoR(coords, box, backend="serial"): @check_coords('coords1', 'coords2', enforce_copy=False) def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): """Calculates the bond lengths between pairs of atom positions from the two - coordinate arrays `coords1` and `coords2`. Both coordinate arrays must be of - the same length, so that ``coords1[i]`` and ``coords2[i]`` represent the - positions of atoms connected by the ``i``-th bond. + coordinate arrays `coords1` and `coords2`, which must contain the same + number of coordinates. ``coords1[i]`` and ``coords2[i]`` represent the + positions of atoms connected by the ``i``-th bond. If single coordinates are + supplied, a single distance will be returned. In comparison to :meth:`distance_array` and :meth:`self_distance_array`, which calculate distances between all possible combinations of coordinates, @@ -1224,27 +1225,29 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): applied when calculating distances. Either orthogonal or triclinic boxes are supported. - If a 1D numpy array of dtype ``numpy.float64`` with ``len(coords1)`` - elements is provided in `result`, then this preallocated array is filled. - This can speed up calculations. + If a numpy array of dtype ``numpy.float64`` with shape ``(n,)`` (for ``n`` + coordinate pairs) is provided in `result`, then this preallocated array is + filled. This can speed up calculations. Parameters ---------- coords1 : numpy.ndarray - Coordinate array of shape ``(n, 3)`` for one half of ``n`` bonds (dtype - is arbitrary, will be converted to ``numpy.float32`` internally). + Coordinate array of shape ``(3,)`` or ``(n, 3)`` for one half of a + single or ``n`` bonds, respectively (dtype is arbitrary, will be + converted to ``numpy.float32`` internally). coords2 : numpy.ndarray - Coordinate array of shape ``(n, 3)`` for the other half of ``n`` bonds - (dtype is arbitrary, will be converted to ``numpy.float32`` internally). + Coordinate array of shape ``(3,)`` or ``(n, 3)`` for the other half of + a single or ``n`` bonds, respectively (dtype is arbitrary, will be + converted to ``numpy.float32`` internally). box : numpy.ndarray, optional The unitcell dimensions of the system, which can be orthogonal or triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. result : numpy.ndarray, optional - Preallocated result array which must be of the same length ``n`` as the - coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the - array in repeated function calls. + Preallocated result array of dtype ``numpy.float64`` and shape ``(n,)`` + (for ``n`` coordinate pairs). Avoids recreating the array in repeated + function calls. backend : {'serial', 'OpenMP'}, optional Keyword selecting the type of acceleration. @@ -1285,52 +1288,54 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): @check_coords('coords1', 'coords2', 'coords3', enforce_copy=False) -def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="serial"): +def calc_angles(coords1, coords2, coords3, box=None, result=None, + backend="serial"): """Calculates the angles formed between triplets of atom positions from the three coordinate arrays `coords1`, `coords2`, and `coords3`. All coordinate - arrays must be of equal length, with the coordinates in `coords2` - representing the apices of the angles:: + arrays must contain the same number of coordinates. + + The coordinates in `coords2` represent the apices of the angles:: 2---3 / 1 Configurations where the angle is undefined (e.g., when coordinates 1 or 3 - of a triplet coincide with coordinate 2) result in a value of zero for that - angle. + of a triplet coincide with coordinate 2) result in a value of **zero** for + that angle. If the optional argument `box` is supplied, periodic boundaries are taken into account when constructing the connecting vectors between coordinates, i.e., the minimum image convention is applied for the vectors forming the angles. Either orthogonal or triclinic boxes are supported. - If a 1D numpy array of dtype ``numpy.float64`` with ``len(coords1)`` - elements is provided in `result`, then this preallocated array is filled. - This can speed up calculations. + If a numpy array of dtype ``numpy.float64`` with shape ``(n,)`` (for ``n`` + coordinate triplets) is provided in `result`, then this preallocated array + is filled. This can speed up calculations. Parameters ---------- coords1 : numpy.ndarray - Array of shape ``(n, 3)`` containing the coordinates of one side of - ``n`` angles (dtype is arbitrary, will be converted to ``numpy.float32`` - internally) + Array of shape ``(3,)`` or ``(n, 3)`` containing the coordinates of one + side of a single or ``n`` angles, respectively (dtype is arbitrary, will + be converted to ``numpy.float32`` internally) coords2 : numpy.ndarray - Array of shape ``(n, 3)`` containing the coordinates of the apices of - ``n`` angles (dtype is arbitrary, will be converted to ``numpy.float32`` - internally) + Array of shape ``(3,)`` or ``(n, 3)`` containing the coordinates of the + apices of a single or ``n`` angles, respectively (dtype is arbitrary, + will be converted to ``numpy.float32`` internally) coords3 : numpy.ndarray - Array of shape ``(n, 3)`` containing the coordinates of the other side - of ``n`` angles (dtype is arbitrary, will be converted to - ``numpy.float32`` internally) + Array of shape ``(3,)`` or ``(n, 3)`` containing the coordinates of the + other side of a single or ``n`` angles, respectively (dtype is + arbitrary, will be converted to ``numpy.float32`` internally) box : numpy.ndarray, optional The unitcell dimensions of the system, which can be orthogonal or triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. result : numpy.ndarray, optional - Preallocated result array which must be of the same length ``n`` as the - coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the - array in repeated function calls. + Preallocated result array of dtype ``numpy.float64`` and shape ``(n,)`` + (for ``n`` coordinate triplets). Avoids recreating the array in repeated + function calls. backend : {'serial', 'OpenMP'}, optional Keyword selecting the type of acceleration. @@ -1379,7 +1384,7 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, backend="serial"): """Calculates the dihedral angles formed between quadruplets of positions from the four coordinate arrays `coords1`, `coords2`, `coords3`, and - `coords4`, which must be of equal length. + `coords4`, which must contain the same number of coordinates. The dihedral angle formed by a quadruplet of positions (1,2,3,4) is calculated around the axis connecting positions 2 and 3 (i.e., the angle @@ -1402,9 +1407,9 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, i.e., the minimum image convention is applied for the vectors forming the dihedral angles. Either orthogonal or triclinic boxes are supported. - If a 1D numpy array of dtype ``numpy.float64`` with ``len(coords1)`` - elements is provided in `result` then this preallocated array is filled. - This can speed up calculations. + If a numpy array of dtype ``numpy.float64`` with shape ``(n,)`` (for ``n`` + coordinate quadruplets) is provided in `result` then this preallocated array + is filled. This can speed up calculations. Parameters ---------- @@ -1426,9 +1431,9 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. result : numpy.ndarray, optional - Preallocated result array which must be of the same length as the - coordinate arrays and of dtype ``numpy.float64``. Avoids recreating the - array in repeated function calls. + Preallocated result array of dtype ``numpy.float64`` and shape ``(n,)`` + (for ``n`` coordinate quadruplets). Avoids recreating the array in + repeated function calls. backend : {'serial', 'OpenMP'}, optional Keyword selecting the type of acceleration. From 16011c40f7dcb802510c48c36e3e71fd9f6b9eea Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 11:38:51 +0200 Subject: [PATCH 441/455] updated changelog (issue #2072) --- package/CHANGELOG | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 3e85b4910be..176f2cb7716 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -67,8 +67,6 @@ Enhancements * Calculations in *Group.center() are performed in double precision (#PR1936) * Functions in lib.distances accept coordinate arrays of arbitrary dtype (PR #1936) - * Added calc_distance, calc_angle and calc_dihedral to lib.distances - (Issue #1262 #1938) * Added pbc kwarg to Bond/Angle/Dihedral/Improper object value method, default True. (Issue #1938) * ChainReader can correctly handle continuous trajectories split into multiple files, @@ -81,7 +79,8 @@ Enhancements * Added analysis.dihedrals with Ramachandran class to analysis module (PR #1997) * Added augment functionality to create relevant images of particles * Most functions in `MDanalysis.lib.distances` previously only accepting - arrays of coordinates now also accept single coordinates as input (PR #2048) + arrays of coordinates now also accept single coordinates as input (PR #2048, + Issues #1262 #1938) * Performance improvements to make_whole (PR #1965) * Performance improvements to fragment finding (PR #2028) * Added user defined boxes in density code (PR #2005) From 52ba2ca1eb92eb208662a7795818ec1a1f6db032 Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 11:43:27 +0200 Subject: [PATCH 442/455] removed `.. autofunction` entries of obsolete functions in lib/distances.py --- package/MDAnalysis/lib/distances.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index b2562078199..bfccdf7181e 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -59,9 +59,6 @@ .. autofunction:: calc_bonds .. autofunction:: calc_angles .. autofunction:: calc_dihedrals -.. autofunction:: calc_distance -.. autofunction:: calc_angle -.. autofunction:: calc_dihedral .. autofunction:: apply_PBC .. autofunction:: transform_RtoS .. autofunction:: transform_StoR From f92e072b5ded2a6db3afe725ed88243dd8b5c535 Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 11:53:10 +0200 Subject: [PATCH 443/455] improved docstring of lib.distances.calc_dihedrals --- package/MDAnalysis/lib/distances.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index bfccdf7181e..f3ef9365185 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -1411,17 +1411,21 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, Parameters ---------- coords1 : numpy.ndarray - Coordinate array of 1st positions in dihedrals (dtype is arbitrary, will - be converted to ``numpy.float32`` internally) + Coordinate array of shape ``(3,)`` or ``(n, 3)`` containing the 1st + positions in dihedrals (dtype is arbitrary, will be converted to + ``numpy.float32`` internally) coords2 : numpy.ndarray - Coordinate array of 2nd positions in dihedrals (dtype is arbitrary, will - be converted to ``numpy.float32`` internally) + Coordinate array of shape ``(3,)`` or ``(n, 3)`` containing the 2nd + positions in dihedrals (dtype is arbitrary, will be converted to + ``numpy.float32`` internally) coords3 : numpy.ndarray - Coordinate array of 3rd positions in dihedrals (dtype is arbitrary, will - will be converted to ``numpy.float32`` internally) + Coordinate array of shape ``(3,)`` or ``(n, 3)`` containing the 3rd + positions in dihedrals (dtype is arbitrary, will be converted to + ``numpy.float32`` internally) coords4 : numpy.ndarray - Coordinate array of 4th positions in dihedrals (dtype is arbitrary, will - be converted to ``numpy.float32`` internally) + Coordinate array of shape ``(3,)`` or ``(n, 3)`` containing the 4th + positions in dihedrals (dtype is arbitrary, will be converted to + ``numpy.float32`` internally) box : numpy.ndarray, optional The unitcell dimensions of the system, which can be orthogonal or triclinic and must be provided in the same format as returned by From cdcf09354a3c6b7dfaada30b5c7b1edb337dbb61 Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 13:22:33 +0200 Subject: [PATCH 444/455] reduced precision in angle and dihedral tests to 4 decimals --- testsuite/MDAnalysisTests/utils/test_distances.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testsuite/MDAnalysisTests/utils/test_distances.py b/testsuite/MDAnalysisTests/utils/test_distances.py index bda8e9f83ba..ef879c81879 100644 --- a/testsuite/MDAnalysisTests/utils/test_distances.py +++ b/testsuite/MDAnalysisTests/utils/test_distances.py @@ -522,7 +522,7 @@ def manual_angle(x, y, z): result = MDAnalysis.lib.distances.calc_angles(a, b, c, box, backend=backend) reference = ref if periodic else manual_angle(a, b, c) - assert_almost_equal(result, reference, decimal=self.prec) + assert_almost_equal(result, reference, decimal=4) @pytest.mark.parametrize('dtype', (np.float32, np.float64)) def test_dihedrals(self, positions, backend, dtype): @@ -598,7 +598,7 @@ def manual_dihedral(a, b, c, d): result = MDAnalysis.lib.distances.calc_dihedrals(a, b, c, d, box, backend=backend) reference = ref if periodic else manual_dihedral(a, b, c, d) - assert_almost_equal(abs(result), abs(reference), decimal=self.prec) + assert_almost_equal(abs(result), abs(reference), decimal=4) def test_numpy_compliance(self, positions, backend): a, b, c, d = positions From bab34da68133e01d0165b444734668c8e0f15bbe Mon Sep 17 00:00:00 2001 From: zeman Date: Thu, 13 Sep 2018 16:22:45 +0200 Subject: [PATCH 445/455] moved all tests from utils/test_distances.py to lib/test_distances.py --- .../MDAnalysisTests/lib/test_distances.py | 760 ++++++++++++++++- .../MDAnalysisTests/utils/test_distances.py | 770 ------------------ 2 files changed, 715 insertions(+), 815 deletions(-) delete mode 100644 testsuite/MDAnalysisTests/utils/test_distances.py diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index 930c4b24450..cb531792291 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -20,13 +20,15 @@ # J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 # -from __future__ import absolute_import +from __future__ import division, absolute_import import pytest import numpy as np from numpy.testing import assert_equal, assert_almost_equal -import MDAnalysis as mda - +import MDAnalysis +from MDAnalysis.lib import distances +from MDAnalysis.lib import mdamath +from MDAnalysis.tests.datafiles import PSF, DCD, TRIC class TestCheckBox(object): @@ -46,7 +48,7 @@ class TestCheckBox(object): np.array([1, 1, 1, 1, 1, 1, 90, 90, 90, 90, 90, 90], dtype=np.float32)[::2])) def test_ckeck_box_ortho(self, box): - boxtype, checked_box = mda.lib.distances._check_box(box) + boxtype, checked_box = distances._check_box(box) assert boxtype == 'ortho' assert_equal(checked_box, self.ref_ortho) assert checked_box.dtype == np.float32 @@ -63,7 +65,7 @@ def test_ckeck_box_ortho(self, box): np.array([1, 1, 1, 1, 2, 2, 45, 45, 90, 90, 90, 90], dtype=np.float32)[::2])) def test_check_box_tri_vecs(self, box): - boxtype, checked_box = mda.lib.distances._check_box(box) + boxtype, checked_box = distances._check_box(box) assert boxtype == 'tri_vecs' assert_almost_equal(checked_box, self.ref_tri_vecs, self.prec) assert checked_box.dtype == np.float32 @@ -72,12 +74,12 @@ def test_check_box_tri_vecs(self, box): def test_check_box_wrong_data(self): with pytest.raises(ValueError): wrongbox = ['invalid', 1, 1, 90, 90, 90] - boxtype, checked_box = mda.lib.distances._check_box(wrongbox) + boxtype, checked_box = distances._check_box(wrongbox) def test_check_box_wrong_shape(self): with pytest.raises(ValueError): wrongbox = np.ones((3, 3), dtype=np.float32) - boxtype, checked_box = mda.lib.distances._check_box(wrongbox) + boxtype, checked_box = distances._check_box(wrongbox) class TestCheckResultArray(object): @@ -86,17 +88,17 @@ class TestCheckResultArray(object): def test_check_result_array_pass(self): # Assert input array is returned if it has correct shape and dtype: - res = mda.lib.distances._check_result_array(self.ref, self.ref.shape) + res = distances._check_result_array(self.ref, self.ref.shape) assert res is self.ref # Assert correct array is returned if input is None: - res = mda.lib.distances._check_result_array(None, self.ref.shape) + res = distances._check_result_array(None, self.ref.shape) assert_equal(res, self.ref) assert res.dtype == np.float64 def test_check_result_array_wrong_shape(self): wrong_shape = (1,) + self.ref.shape with pytest.raises(ValueError) as err: - res = mda.lib.distances._check_result_array(self.ref, wrong_shape) + res = distances._check_result_array(self.ref, wrong_shape) assert err.msg == ("Result array has incorrect shape, should be " "{0}, got {1}.".format(self.ref.shape, wrong_shape)) @@ -105,8 +107,7 @@ def test_check_result_array_wrong_dtype(self): wrong_dtype = np.int64 ref_wrong_dtype = self.ref.astype(wrong_dtype) with pytest.raises(TypeError) as err: - res = mda.lib.distances._check_result_array(ref_wrong_dtype, - self.ref.shape) + res = distances._check_result_array(ref_wrong_dtype, self.ref.shape) assert err.msg == ("Result array must be of type numpy.float64, " "got {}.".format(wrong_dtype)) @@ -118,7 +119,7 @@ def test_transform_StoR_pass(coord_dtype): original_r = np.array([[ 5.75, 0.36066014, 0.75000012]], dtype=np.float32) - test_r = mda.lib.distances.transform_StoR(s, box) + test_r = distances.transform_StoR(s, box) assert_equal(original_r, test_r) @@ -127,9 +128,7 @@ def test_capped_distance_noresults(): point1 = np.array([0.1, 0.1, 0.1], dtype=np.float32) point2 = np.array([0.95, 0.1, 0.1], dtype=np.float32) - pairs, distances = mda.lib.distances.capped_distance(point1, - point2, - max_cutoff=0.2) + pairs, dists = distances.capped_distance(point1, point2, max_cutoff=0.2) assert_equal(len(pairs), 0) @@ -163,12 +162,9 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): max_cutoff = 0.3 # capped distance should be able to handle array of vectors # as well as single vectors. - pairs, dist = mda.lib.distances.capped_distance(query, - points, - max_cutoff, - min_cutoff=min_cutoff, - box=box, - method=method) + pairs, dist = distances.capped_distance(query, points, max_cutoff, + min_cutoff=min_cutoff, box=box, + method=method) if pairs.shape != (0, ): found_pairs = pairs[:, 1] @@ -178,12 +174,11 @@ def test_capped_distance_checkbrute(npoints, box, query, method, min_cutoff): if(query.shape[0] == 3): query = query.reshape((1, 3)) - distances = mda.lib.distances.distance_array(query, - points, box=box) + dists = distances.distance_array(query, points, box=box) if min_cutoff is None: min_cutoff = 0. - indices = np.where((distances < max_cutoff) & (distances > min_cutoff)) + indices = np.where((dists < max_cutoff) & (dists > min_cutoff)) assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1], axis=0)) @@ -200,13 +195,9 @@ def test_capped_distance_return(npoints, box, query, method, min_cutoff): max_cutoff = 0.3 # capped distance should be able to handle array of vectors # as well as single vectors. - pairs = mda.lib.distances.capped_distance(query, - points, - max_cutoff, - min_cutoff=min_cutoff, - box=box, - method=method, - return_distances=False) + pairs = distances.capped_distance(query, points, max_cutoff, + min_cutoff=min_cutoff, box=box, + method=method, return_distances=False) if pairs.shape != (0, ): found_pairs = pairs[:, 1] @@ -216,12 +207,11 @@ def test_capped_distance_return(npoints, box, query, method, min_cutoff): if(query.shape[0] == 3): query = query.reshape((1, 3)) - distances = mda.lib.distances.distance_array(query, - points, box=box) + dists = distances.distance_array(query, points, box=box) if min_cutoff is None: min_cutoff = 0. - indices = np.where((distances < max_cutoff) & (distances > min_cutoff)) + indices = np.where((dists < max_cutoff) & (dists > min_cutoff)) assert_equal(np.sort(found_pairs, axis=0), np.sort(indices[1], axis=0)) @@ -235,16 +225,12 @@ def test_self_capped_distance(npoints, box, method, min_cutoff): points = (np.random.uniform(low=0, high=1.0, size=(npoints, 3))*(boxes_1[0][:3])).astype(np.float32) max_cutoff = 0.2 - pairs, distance = mda.lib.distances.self_capped_distance(points, - max_cutoff, - min_cutoff=min_cutoff, - box=box, - method=method) + pairs, distance = distances.self_capped_distance(points, max_cutoff, + min_cutoff=min_cutoff, + box=box, method=method) found_pairs, found_distance = [], [] for i, coord in enumerate(points): - dist = mda.lib.distances.distance_array(coord[None, :], - points[i+1:], - box=box) + dist = distances.distance_array(coord, points[i+1:], box=box) if min_cutoff is not None: idx = np.where((dist < max_cutoff) & (dist > min_cutoff))[1] else: @@ -268,7 +254,7 @@ def test_method_selfselection(box, npoints, cutoff, meth): np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(npoints, 3))).astype(np.float32) - method = mda.lib.distances._determine_method_self(points, cutoff, box=box) + method = distances._determine_method_self(points, cutoff, box=box) assert_equal(method.__name__, meth) @@ -285,5 +271,689 @@ def test_method_selection(box, npoints, cutoff, meth): np.random.seed(90003) points = (np.random.uniform(low=0, high=1.0, size=(npoints, 3)).astype(np.float32)) - method = mda.lib.distances._determine_method(points, points, cutoff, box=box) + method = distances._determine_method(points, points, cutoff, box=box) assert_equal(method.__name__, meth) + + +@pytest.fixture() +def ref_system(): + box = np.array([1., 1., 2., 90., 90., 90], dtype=np.float32) + points = np.array( + [ + [0, 0, 0], [1, 1, 2], [1, 0, 2], # identical under PBC + [0.5, 0.5, 1.5], + ], dtype=np.float32) + ref = points[0:1] + conf = points[1:] + + return box, points, ref, conf + + +@pytest.mark.parametrize('backend', ['serial', 'openmp']) +class TestDistanceArray(object): + @staticmethod + def _dist(x, ref): + ref = np.asarray(ref, dtype=np.float32) + r = x - ref + return np.sqrt(np.dot(r, r)) + + def test_noPBC(self, backend, ref_system): + box, points, ref, conf = ref_system + + d = distances.distance_array(ref, points, backend=backend) + + assert_almost_equal(d, np.array([[ + self._dist(points[0], ref[0]), + self._dist(points[1], ref[0]), + self._dist(points[2], ref[0]), + self._dist(points[3], ref[0])] + ])) + + def test_PBC(self, backend, ref_system): + box, points, ref, conf = ref_system + + d = distances.distance_array(ref, points, box=box, backend=backend) + + assert_almost_equal(d, np.array([[0., 0., 0., self._dist(points[3], ref=[1, 1, 2])]])) + + def test_PBC2(self, backend): + a = np.array([7.90146923, -13.72858524, 3.75326586], dtype=np.float32) + b = np.array([-1.36250901, 13.45423985, -0.36317623], dtype=np.float32) + box = np.array([5.5457325, 5.5457325, 5.5457325, 90., 90., 90.], dtype=np.float32) + + def mindist(a, b, box): + x = a - b + return np.linalg.norm(x - np.rint(x / box) * box) + + ref = mindist(a, b, box[:3]) + val = distances.distance_array(a, b, box=box, backend=backend)[0, 0] + + assert_almost_equal(val, ref, decimal=6, + err_msg="Issue 151 not correct (PBC in distance array)") + + +@pytest.fixture() +def DCD_Universe(): + universe = MDAnalysis.Universe(PSF, DCD) + trajectory = universe.trajectory + + return universe, trajectory + +@pytest.mark.parametrize('backend', ['serial', 'openmp']) +class TestDistanceArrayDCD(object): + # reasonable precision so that tests succeed on 32 and 64 bit machines + # (the reference values were obtained on 64 bit) + # Example: + # Items are not equal: wrong maximum distance value + # ACTUAL: 52.470254967456412 + # DESIRED: 52.470257062419059 + prec = 5 + + def test_simple(self, DCD_Universe, backend): + U, trajectory = DCD_Universe + trajectory.rewind() + x0 = U.atoms.positions + trajectory[10] + x1 = U.atoms.positions + d = distances.distance_array(x0, x1, backend=backend) + assert_equal(d.shape, (3341, 3341), "wrong shape (should be (Natoms,Natoms))") + assert_almost_equal(d.min(), 0.11981228170520701, self.prec, + err_msg="wrong minimum distance value") + assert_almost_equal(d.max(), 53.572192429459619, self.prec, + err_msg="wrong maximum distance value") + + def test_outarray(self, DCD_Universe, backend): + U, trajectory = DCD_Universe + trajectory.rewind() + x0 = U.atoms.positions + trajectory[10] + x1 = U.atoms.positions + natoms = len(U.atoms) + d = np.zeros((natoms, natoms), np.float64) + distances.distance_array(x0, x1, result=d, backend=backend) + assert_equal(d.shape, (natoms, natoms), "wrong shape, shoud be (Natoms,Natoms) entries") + assert_almost_equal(d.min(), 0.11981228170520701, self.prec, + err_msg="wrong minimum distance value") + assert_almost_equal(d.max(), 53.572192429459619, self.prec, + err_msg="wrong maximum distance value") + + def test_periodic(self, DCD_Universe, backend): + # boring with the current dcd as that has no PBC + U, trajectory = DCD_Universe + trajectory.rewind() + x0 = U.atoms.positions + trajectory[10] + x1 = U.atoms.positions + d = distances.distance_array(x0, x1, box=U.coord.dimensions, + backend=backend) + assert_equal(d.shape, (3341, 3341), "should be square matrix with Natoms entries") + assert_almost_equal(d.min(), 0.11981228170520701, self.prec, + err_msg="wrong minimum distance value with PBC") + assert_almost_equal(d.max(), 53.572192429459619, self.prec, + err_msg="wrong maximum distance value with PBC") + + + +@pytest.mark.parametrize('backend', ['serial', 'openmp']) +class TestSelfDistanceArrayDCD(object): + prec = 5 + + def test_simple(self, DCD_Universe, backend): + U, trajectory = DCD_Universe + trajectory.rewind() + x0 = U.atoms.positions + d = distances.self_distance_array(x0, backend=backend) + N = 3341 * (3341 - 1) / 2 + assert_equal(d.shape, (N,), "wrong shape (should be (Natoms*(Natoms-1)/2,))") + assert_almost_equal(d.min(), 0.92905562402529318, self.prec, + err_msg="wrong minimum distance value") + assert_almost_equal(d.max(), 52.4702570624190590, self.prec, + err_msg="wrong maximum distance value") + + def test_outarray(self, DCD_Universe, backend): + U, trajectory = DCD_Universe + trajectory.rewind() + x0 = U.atoms.positions + natoms = len(U.atoms) + N = natoms * (natoms - 1) // 2 + d = np.zeros((N,), np.float64) + distances.self_distance_array(x0, result=d, backend=backend) + assert_equal(d.shape, (N,), "wrong shape (should be (Natoms*(Natoms-1)/2,))") + assert_almost_equal(d.min(), 0.92905562402529318, self.prec, + err_msg="wrong minimum distance value") + assert_almost_equal(d.max(), 52.4702570624190590, self.prec, + err_msg="wrong maximum distance value") + + def test_periodic(self, DCD_Universe, backend): + # boring with the current dcd as that has no PBC + U, trajectory = DCD_Universe + trajectory.rewind() + x0 = U.atoms.positions + natoms = len(U.atoms) + N = natoms * (natoms - 1) / 2 + d = distances.self_distance_array(x0, box=U.coord.dimensions, + backend=backend) + assert_equal(d.shape, (N,), "wrong shape (should be (Natoms*(Natoms-1)/2,))") + assert_almost_equal(d.min(), 0.92905562402529318, self.prec, + err_msg="wrong minimum distance value with PBC") + assert_almost_equal(d.max(), 52.4702570624190590, self.prec, + err_msg="wrong maximum distance value with PBC") + + +@pytest.mark.parametrize('backend', ['serial', 'openmp']) +class TestTriclinicDistances(object): + """Unit tests for the Triclinic PBC functions. + Tests: + # transforming to and from S space (fractional coords) + MDAnalysis.lib.distances.transform_StoR + MDAnalysis.lib.distances.transform_RtoS + # distance calculations with PBC + MDAnalysis.lib.distances.self_distance_array + MDAnalysis.lib.distances.distance_array + """ + + prec = 2 + + @staticmethod + @pytest.fixture() + def TRIC(): + return MDAnalysis.Universe(TRIC) + + @staticmethod + @pytest.fixture() + def tri_vec_box(TRIC): + return MDAnalysis.coordinates.core.triclinic_vectors(TRIC.dimensions) + + @staticmethod + @pytest.fixture() + def box(TRIC): + return TRIC.dimensions + + @staticmethod + @pytest.fixture() + def S_mol(TRIC): + S_mol1 = np.array([TRIC.atoms[383].position]) + S_mol2 = np.array([TRIC.atoms[390].position]) + + return S_mol1, S_mol2 + + @staticmethod + @pytest.fixture() + def S_mol_single(TRIC): + S_mol1 = TRIC.atoms[383].position + S_mol2 = TRIC.atoms[390].position + return S_mol1, S_mol2 + + @pytest.mark.parametrize('S_mol', [S_mol, S_mol_single], indirect=True) + def test_transforms(self, S_mol, tri_vec_box, box, backend): + # To check the cython coordinate transform, the same operation is done in numpy + # Is a matrix multiplication of Coords x tri_vec_box = NewCoords, so can use np.dot + S_mol1, S_mol2 = S_mol + # Test transformation + R_mol1 = distances.transform_StoR(S_mol1, box, backend=backend) + R_np1 = np.dot(S_mol1, tri_vec_box) + R_mol2 = distances.transform_StoR(S_mol2, box, backend=backend) + R_np2 = np.dot(S_mol2, tri_vec_box) + + assert_almost_equal(R_mol1, R_np1, self.prec, err_msg="StoR transform failed for S_mol1") + assert_almost_equal(R_mol2, R_np2, self.prec, err_msg="StoR transform failed for S_mol2") + + # Round trip test + S_test1 = distances.transform_RtoS(R_mol1, box, backend=backend) + S_test2 = distances.transform_RtoS(R_mol2, box, backend=backend) + + assert_almost_equal(S_test1, S_mol1, self.prec, err_msg="Round trip 1 failed in transform") + assert_almost_equal(S_test2, S_mol2, self.prec, err_msg="Round trip 2 failed in transform") + + def test_selfdist(self, S_mol, box, tri_vec_box, backend): + S_mol1, S_mol2 = S_mol + R_coords = distances.transform_StoR(S_mol1, box, backend=backend) + # Transform functions are tested elsewhere so taken as working here + dists = distances.self_distance_array(R_coords, box=box, backend=backend) + # Manually calculate self_distance_array + manual = np.zeros(len(dists), dtype=np.float64) + distpos = 0 + for i, Ri in enumerate(R_coords): + for Rj in R_coords[i + 1:]: + Rij = Rj - Ri + Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] + Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] + Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] + Rij = np.linalg.norm(Rij) # find norm of Rij vector + manual[distpos] = Rij # and done, phew + distpos += 1 + + assert_almost_equal(dists, manual, self.prec, + err_msg="self_distance_array failed with input 1") + + # Do it again for input 2 (has wider separation in points) + R_coords = distances.transform_StoR(S_mol2, box, backend=backend) + # Transform functions are tested elsewhere so taken as working here + dists = distances.self_distance_array(R_coords, box=box, backend=backend) + # Manually calculate self_distance_array + manual = np.zeros(len(dists), dtype=np.float64) + distpos = 0 + for i, Ri in enumerate(R_coords): + for Rj in R_coords[i + 1:]: + Rij = Rj - Ri + Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] + Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] + Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] + Rij = np.linalg.norm(Rij) # find norm of Rij vector + manual[distpos] = Rij # and done, phew + distpos += 1 + + assert_almost_equal(dists, manual, self.prec, + err_msg="self_distance_array failed with input 2") + + def test_distarray(self, S_mol, tri_vec_box, box, backend): + S_mol1, S_mol2 = S_mol + + R_mol1 = distances.transform_StoR(S_mol1, box, backend=backend) + R_mol2 = distances.transform_StoR(S_mol2, box, backend=backend) + + # Try with box + dists = distances.distance_array(R_mol1, R_mol2, box=box, backend=backend) + # Manually calculate distance_array + manual = np.zeros((len(R_mol1), len(R_mol2))) + for i, Ri in enumerate(R_mol1): + for j, Rj in enumerate(R_mol2): + Rij = Rj - Ri + Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] + Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] + Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] + Rij = np.linalg.norm(Rij) # find norm of Rij vector + manual[i][j] = Rij + + assert_almost_equal(dists, manual, self.prec, + err_msg="distance_array failed with box") + + def test_pbc_dist(self, S_mol, box, backend): + S_mol1, S_mol2 = S_mol + results = np.array([[37.629944]]) + dists = distances.distance_array(S_mol1, S_mol2, box=box, backend=backend) + + assert_almost_equal(dists, results, self.prec, + err_msg="distance_array failed to retrieve PBC distance") + + def test_pbc_wrong_wassenaar_distance(self, backend): + box = [2, 2, 2, 60, 60, 60] + tri_vec_box = mdamath.triclinic_vectors(box) + a, b, c = tri_vec_box + point_a = a + b + point_b = .5 * point_a + dist = distances.distance_array(point_a, point_b, box=box, backend=backend) + assert_almost_equal(dist[0, 0], 1) + # check that our distance is different from the wassenaar distance as + # expected. + assert np.linalg.norm(point_a - point_b) != dist[0, 0] + + +@pytest.mark.parametrize('backend', ['serial', 'openmp']) +class TestCythonFunctions(object): + # Unit tests for calc_bonds calc_angles and calc_dihedrals in lib.distances + # Tests both numerical results as well as input types as Cython will silently + # produce nonsensical results if given wrong data types otherwise. + prec = 5 + + @staticmethod + @pytest.fixture() + def box(): + return np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) + + @staticmethod + @pytest.fixture() + def triclinic_box(): + box_vecs = np.array([[10., 0., 0.], [1., 10., 0., ], [1., 0., 10.]], + dtype=np.float32) + return mdamath.triclinic_box(box_vecs[0], box_vecs[1], box_vecs[2]) + + @staticmethod + @pytest.fixture() + def positions(): + # dummy atom data + a = np.array([[0., 0., 0.], [0., 0., 0.], [0., 11., 0.], [1., 1., 1.]], dtype=np.float32) + b = np.array([[0., 0., 0.], [1., 1., 1.], [0., 0., 0.], [29., -21., 99.]], dtype=np.float32) + c = np.array([[0., 0., 0.], [2., 2., 2.], [11., 0., 0.], [1., 9., 9.]], dtype=np.float32) + d = np.array([[0., 0., 0.], [3., 3., 3.], [11., -11., 0.], [65., -65., 65.]], dtype=np.float32) + return a, b, c, d + + @staticmethod + def convert_position_dtype(a, b, c, d, dtype): + return a.astype(dtype), b.astype(dtype), c.astype(dtype), d.astype(dtype) + + @staticmethod + @pytest.fixture() + def wronglength(): + # has a different length to other inputs and should raise ValueError + return np.array([[0., 0., 0.], [3., 3., 3.]], + dtype=np.float32) + + # coordinate shifts for single coord tests + shifts = [((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)), # no shifting + ((1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 0)), # single box lengths + ((-1, 0, 1), (0, -1, 0), (1, 0, 1), (-1, -1, -1)), # negative single + ((4, 3, -2), (-2, 2, 2), (-5, 2, 2), (0, 2, 2))] # multiple boxlengths + + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) + def test_bonds(self, positions, box, backend, dtype): + a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) + dists = distances.calc_bonds(a, b, backend=backend) + assert_equal(len(dists), 4, err_msg="calc_bonds results have wrong length") + dists_pbc = distances.calc_bonds(a, b, box=box, backend=backend) + #tests 0 length + assert_almost_equal(dists[0], 0.0, self.prec, err_msg="Zero length calc_bonds fail") + assert_almost_equal(dists[1], 1.7320508075688772, self.prec, + err_msg="Standard length calc_bonds fail") # arbitrary length check + # PBC checks, 2 without, 2 with + assert_almost_equal(dists[2], 11.0, self.prec, + err_msg="PBC check #1 w/o box") # pbc check 1, subtract single box length + assert_almost_equal(dists_pbc[2], 1.0, self.prec, + err_msg="PBC check #1 with box") + assert_almost_equal(dists[3], 104.26888318, self.prec, # pbc check 2, subtract multiple box + err_msg="PBC check #2 w/o box") # lengths in all directions + assert_almost_equal(dists_pbc[3], 3.46410072, self.prec, + err_msg="PBC check #w with box") + + def test_bonds_badbox(self, positions, backend): + a, b, c, d = positions + badbox1 = np.array([10., 10., 10.], dtype=np.float64) + badbox2 = np.array([[10., 10.], [10., 10., ]], dtype=np.float32) + + with pytest.raises(ValueError): + distances.calc_bonds(a, b, box=badbox1, backend=backend) + + with pytest.raises(ValueError): + distances.calc_bonds(a, b, box=badbox2, backend=backend) + + def test_bonds_badresult(self, positions, backend): + a, b, c, d = positions + badresult = np.zeros(len(a) - 1) # Bad result array + with pytest.raises(ValueError): + distances.calc_bonds(a, b, result=badresult, backend=backend) + + def test_bonds_triclinic(self, positions, triclinic_box, backend): + a, b, c, d = positions + dists = distances.calc_bonds(a, b, box=triclinic_box, backend=backend) + reference = np.array([0.0, 1.7320508, 1.4142136, 2.82842712]) + assert_almost_equal(dists, reference, self.prec, err_msg="calc_bonds with triclinic box failed") + + @pytest.mark.parametrize('shift', shifts) + @pytest.mark.parametrize('periodic', [True, False]) + def test_bonds_single_coords(self, shift, periodic, backend): + box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) + + coords = np.array([[1, 1, 1], [3, 1, 1]], dtype=np.float32) + + shift1, shift2, _, _ = shift + + coords[0] += shift1 * box[:3] + coords[1] += shift2 * box[:3] + + box = box if periodic else None + result = distances.calc_bonds(coords[0], coords[1], box, backend=backend) + + reference = 2.0 if periodic else np.linalg.norm(coords[0] - coords[1]) + + assert_almost_equal(result, reference, decimal=self.prec) + + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) + def test_angles(self, positions, backend, dtype): + a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) + angles = distances.calc_angles(a, b, c, backend=backend) + # Check calculated values + assert_equal(len(angles), 4, err_msg="calc_angles results have wrong length") + # assert_almost_equal(angles[0], 0.0, self.prec, + # err_msg="Zero length angle calculation failed") # What should this be? + assert_almost_equal(angles[1], np.pi, self.prec, + err_msg="180 degree angle calculation failed") + assert_almost_equal(np.rad2deg(angles[2]), 90., self.prec, + err_msg="Ninety degree angle in calc_angles failed") + assert_almost_equal(angles[3], 0.098174833, self.prec, + err_msg="Small angle failed in calc_angles") + + def test_angles_bad_result(self, positions, backend): + a, b, c, d = positions + badresult = np.zeros(len(a) - 1) # Bad result array + with pytest.raises(ValueError): + distances.calc_angles(a, b, c, result=badresult, backend=backend) + + @pytest.mark.parametrize('case', [ + (np.array([[1, 1, 1], [1, 2, 1], [2, 2, 1]], dtype=np.float32), 0.5 * np.pi), # 90 degree angle + (np.array([[1, 1, 1], [1, 2, 1], [1, 3, 1]], dtype=np.float32), np.pi), # straight line / 180. + (np.array([[1, 1, 1], [1, 2, 1], [2, 1, 1]], dtype=np.float32), 0.25 * np.pi), # 45 + ]) + @pytest.mark.parametrize('shift', shifts) + @pytest.mark.parametrize('periodic', [True, False]) + def test_angles_single_coords(self, case, shift, periodic, backend): + def manual_angle(x, y, z): + return mdamath.angle(y - x, y - z) + + box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) + (a, b, c), ref = case + + shift1, shift2, shift3, _ = shift + + a += shift1 * box[:3] + b += shift2 * box[:3] + c += shift3 * box[:3] + + box = box if periodic else None + result = distances.calc_angles(a, b, c, box, backend=backend) + reference = ref if periodic else manual_angle(a, b, c) + assert_almost_equal(result, reference, decimal=4) + + @pytest.mark.parametrize('dtype', (np.float32, np.float64)) + def test_dihedrals(self, positions, backend, dtype): + a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) + dihedrals = distances.calc_dihedrals(a, b, c, d, backend=backend) + # Check calculated values + assert_equal(len(dihedrals), 4, err_msg="calc_dihedrals results have wrong length") + assert np.isnan(dihedrals[0]), "Zero length dihedral failed" + assert np.isnan(dihedrals[1]), "Straight line dihedral failed" + assert_almost_equal(dihedrals[2], np.pi, self.prec, err_msg="180 degree dihedral failed") + assert_almost_equal(dihedrals[3], -0.50714064, self.prec, + err_msg="arbitrary dihedral angle failed") + + def test_dihedrals_wronglength(self, positions, wronglength, backend): + a, b, c, d = positions + with pytest.raises(ValueError): + distances.calc_dihedrals(a, wronglength, c, d, backend=backend) + + with pytest.raises(ValueError): + distances.calc_dihedrals(wronglength, b, c, d, backend=backend) + + with pytest.raises(ValueError): + distances.calc_dihedrals(a, b, wronglength, d, backend=backend) + + with pytest.raises(ValueError): + distances.calc_dihedrals(a, b, c, wronglength, backend=backend) + + def test_dihedrals_bad_result(self, positions, backend): + a, b, c, d = positions + badresult = np.zeros(len(a) - 1) # Bad result array + + with pytest.raises(ValueError): + distances.calc_dihedrals(a, b, c, d, result=badresult, backend=backend) + + @pytest.mark.parametrize('case', [ + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 1]], dtype=np.float32), 0.), # 0 degree angle (cis) + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 1]], dtype=np.float32), np.pi), # 180 degree (trans) + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 2]], dtype=np.float32), 0.5 * np.pi), # 90 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 0]], dtype=np.float32), 0.5 * np.pi), # other 90 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 2]], dtype=np.float32), 0.25 * np.pi), # 45 degree + (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 2]], dtype=np.float32), 0.75 * np.pi), # 135 + ]) + @pytest.mark.parametrize('shift', shifts) + @pytest.mark.parametrize('periodic', [True, False]) + def test_dihedrals_single_coords(self, case, shift, periodic, backend): + def manual_dihedral(a, b, c, d): + return mdamath.dihedral(b - a, c - b, d - c) + + box = np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) + + (a, b, c, d), ref = case + + shift1, shift2, shift3, shift4 = shift + + a += shift1 * box[:3] + b += shift2 * box[:3] + c += shift3 * box[:3] + d += shift4 * box[:3] + + box = box if periodic else None + result = distances.calc_dihedrals(a, b, c, d, box, backend=backend) + reference = ref if periodic else manual_dihedral(a, b, c, d) + assert_almost_equal(abs(result), abs(reference), decimal=4) + + def test_numpy_compliance(self, positions, backend): + a, b, c, d = positions + # Checks that the cython functions give identical results to the numpy versions + bonds = distances.calc_bonds(a, b, backend=backend) + angles = distances.calc_angles(a, b, c, backend=backend) + dihedrals = distances.calc_dihedrals(a, b, c, d, backend=backend) + + bonds_numpy = np.array([mdamath.norm(y - x) for x, y in zip(a, b)]) + vec1 = a - b + vec2 = c - b + angles_numpy = np.array([mdamath.angle(x, y) for x, y in zip(vec1, vec2)]) + ab = a - b + bc = b - c + cd = c - d + dihedrals_numpy = np.array([mdamath.dihedral(x, y, z) for x, y, z in zip(ab, bc, cd)]) + + assert_almost_equal(bonds, bonds_numpy, self.prec, + err_msg="Cython bonds didn't match numpy calculations") + # numpy 0 angle returns NaN rather than 0 + assert_almost_equal(angles[1:], angles_numpy[1:], self.prec, + err_msg="Cython angles didn't match numpy calcuations") + assert_almost_equal(dihedrals, dihedrals_numpy, self.prec, + err_msg="Cython dihedrals didn't match numpy calculations") + + +@pytest.mark.parametrize('backend', ['serial', 'openmp']) +class Test_apply_PBC(object): + prec = 6 + + def test_ortho_PBC(self, backend): + U = MDAnalysis.Universe(PSF, DCD) + atoms = U.atoms.positions + box = np.array([2.5, 2.5, 3.5, 90., 90., 90.], dtype=np.float32) + with pytest.raises(ValueError): + cyth1 = distances.apply_PBC(atoms, box[:3], backend=backend) + cyth2 = distances.apply_PBC(atoms, box, backend=backend) + reference = atoms - np.floor(atoms / box[:3]) * box[:3] + + assert_almost_equal(cyth2, reference, self.prec, + err_msg="Ortho apply_PBC #2 failed comparison with np") + + def test_tric_PBC(self, backend): + U = MDAnalysis.Universe(TRIC) + atoms = U.atoms.positions + box = U.dimensions + + def numpy_PBC(coords, box): + # move to fractional coordinates + fractional = distances.transform_RtoS(coords, box) + # move fractional coordinates to central cell + fractional -= np.floor(fractional) + # move back to real coordinates + return distances.transform_StoR(fractional, box) + + cyth1 = distances.apply_PBC(atoms, box, backend=backend) + reference = numpy_PBC(atoms, box) + + assert_almost_equal(cyth1, reference, decimal=4, + err_msg="Triclinic apply_PBC failed comparison with np") + + box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) + r = np.array([5.75, 0.36066014, 0.75], dtype=np.float32) + r_in_cell = distances.apply_PBC(r, box) + + assert_almost_equal([5.75, 7.3606596, 0.75], r_in_cell, self.prec) + +@pytest.mark.parametrize('backend', ['serial', 'openmp']) +class TestPeriodicAngles(object): + """Test case for properly considering minimum image convention when calculating angles and dihedrals + (Issue 172) + """ + @staticmethod + @pytest.fixture() + def positions(): + a = np.array([[0.0, 1.0, 0.0]], dtype=np.float32) + b = np.array([[0.0, 0.0, 0.0]], dtype=np.float32) + c = np.array([[1.0, 0.0, 0.0]], dtype=np.float32) + d = np.array([[1.0, 0.0, 1.0]], dtype=np.float32) + box = np.array([10.0, 10.0, 10.0], dtype=np.float32) + return a, b, c, d, box + + prec = 5 + + def test_angles(self, positions, backend): + # Shift atom coordinates a few box lengths in random directions and see if we still get same results + a, b, c, d, box = positions + a2 = a + box * (-1, 0, 0) + b2 = b + box * (1, 0, 1) + c2 = c + box * (-2, 5, -7) + + ref = distances.calc_angles(a, b, c, backend=backend) + + box = np.append(box, [90, 90, 90]) + test1 = distances.calc_angles(a2, b, c, box=box, backend=backend) + test2 = distances.calc_angles(a, b2, c, box=box, backend=backend) + test3 = distances.calc_angles(a, b, c2, box=box, backend=backend) + test4 = distances.calc_angles(a2, b2, c2, box=box, backend=backend) + + for val in [test1, test2, test3, test4]: + assert_almost_equal(ref, val, self.prec, err_msg="Min image in angle calculation failed") + + def test_dihedrals(self, positions, backend): + a, b, c, d, box = positions + a2 = a + box * (-1, 0, 0) + b2 = b + box * (1, 0, 1) + c2 = c + box * (-2, 5, -7) + d2 = d + box * (0, -5, 0) + + ref = distances.calc_dihedrals(a, b, c, d, backend=backend) + + box = np.append(box, [90, 90, 90]) + test1 = distances.calc_dihedrals(a2, b, c, d, box=box, backend=backend) + test2 = distances.calc_dihedrals(a, b2, c, d, box=box, backend=backend) + test3 = distances.calc_dihedrals(a, b, c2, d, box=box, backend=backend) + test4 = distances.calc_dihedrals(a, b, c, d2, box=box, backend=backend) + test5 = distances.calc_dihedrals(a2, b2, c2, d2, box=box, backend=backend) + + for val in [test1, test2, test3, test4, test5]: + assert_almost_equal(ref, val, self.prec, err_msg="Min image in dihedral calculation failed") + + +class TestDistanceBackendSelection(object): + @staticmethod + @pytest.fixture() + def backend_selection_pos(): + positions = np.random.rand(10, 3) + N = positions.shape[0] + result = np.empty(N * (N - 1) // 2, dtype=np.float64) + + return positions, result + + @pytest.mark.parametrize('backend', [ + "serial", "Serial", "SeRiAL", "SERIAL", + "openmp", "OpenMP", "oPENmP", "OPENMP", + ]) + def test_case_insensitivity(self, backend, backend_selection_pos): + positions, result = backend_selection_pos + try: + distances._run("calc_self_distance_array", args=(positions, result), + backend=backend) + except RuntimeError: + pytest.fail("Failed to understand backend {0}".format(backend)) + + def test_wront_backend(self, backend_selection_pos): + positions, result = backend_selection_pos + with pytest.raises(ValueError): + distances._run("calc_self_distance_array", args=(positions, result), + backend="not implemented stuff") + +def test_used_openmpflag(): + assert isinstance(distances.USED_OPENMP, bool) diff --git a/testsuite/MDAnalysisTests/utils/test_distances.py b/testsuite/MDAnalysisTests/utils/test_distances.py deleted file mode 100644 index ef879c81879..00000000000 --- a/testsuite/MDAnalysisTests/utils/test_distances.py +++ /dev/null @@ -1,770 +0,0 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 -# -# MDAnalysis --- https://www.mdanalysis.org -# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors -# (see the file AUTHORS for the full list of names) -# -# Released under the GNU Public Licence, v2 or any higher version -# -# Please cite your use of MDAnalysis in published work: -# -# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, -# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. -# MDAnalysis: A Python package for the rapid analysis of molecular dynamics -# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th -# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. -# -# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. -# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. -# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 -# -from __future__ import division, absolute_import -import MDAnalysis -import MDAnalysis.lib.distances - -import numpy as np -import pytest -from numpy.testing import assert_almost_equal, assert_equal - -from MDAnalysis.tests.datafiles import PSF, DCD, TRIC -from MDAnalysis.lib import mdamath - - -@pytest.fixture() -def ref_system(): - box = np.array([1., 1., 2., 90., 90., 90], dtype=np.float32) - points = np.array( - [ - [0, 0, 0], [1, 1, 2], [1, 0, 2], # identical under PBC - [0.5, 0.5, 1.5], - ], dtype=np.float32) - ref = points[0:1] - conf = points[1:] - - return box, points, ref, conf - - -@pytest.mark.parametrize('backend', ['serial', 'openmp']) -class TestDistanceArray(object): - @staticmethod - def _dist(x, ref): - ref = np.asarray(ref, dtype=np.float32) - r = x - ref - return np.sqrt(np.dot(r, r)) - - def test_noPBC(self, backend, ref_system): - box, points, ref, conf = ref_system - - d = MDAnalysis.lib.distances.distance_array(ref, points, backend=backend) - - assert_almost_equal(d, np.array([[ - self._dist(points[0], ref[0]), - self._dist(points[1], ref[0]), - self._dist(points[2], ref[0]), - self._dist(points[3], ref[0])] - ])) - - def test_PBC(self, backend, ref_system): - box, points, ref, conf = ref_system - - d = MDAnalysis.lib.distances.distance_array(ref, points, box=box, backend=backend) - - assert_almost_equal(d, np.array([[0., 0., 0., self._dist(points[3], ref=[1, 1, 2])]])) - - def test_PBC2(self, backend): - a = np.array([7.90146923, -13.72858524, 3.75326586], dtype=np.float32) - b = np.array([-1.36250901, 13.45423985, -0.36317623], dtype=np.float32) - box = np.array([5.5457325, 5.5457325, 5.5457325, 90., 90., 90.], dtype=np.float32) - - def mindist(a, b, box): - x = a - b - return np.linalg.norm(x - np.rint(x / box) * box) - - ref = mindist(a, b, box[:3]) - val = MDAnalysis.lib.distances.distance_array(np.array([a]), np.array([b]), - box=box, backend=backend)[0, 0] - - assert_almost_equal(val, ref, decimal=6, - err_msg="Issue 151 not correct (PBC in distance array)") - -@pytest.fixture() -def DCD_Universe(): - universe = MDAnalysis.Universe(PSF, DCD) - trajectory = universe.trajectory - - return universe, trajectory - -@pytest.mark.parametrize('backend', ['serial', 'openmp']) -class TestDistanceArrayDCD(object): - # reasonable precision so that tests succeed on 32 and 64 bit machines - # (the reference values were obtained on 64 bit) - # Example: - # Items are not equal: wrong maximum distance value - # ACTUAL: 52.470254967456412 - # DESIRED: 52.470257062419059 - prec = 5 - - def test_simple(self, DCD_Universe, backend): - U, trajectory = DCD_Universe - trajectory.rewind() - x0 = U.atoms.positions - trajectory[10] - x1 = U.atoms.positions - d = MDAnalysis.lib.distances.distance_array(x0, x1, backend=backend) - assert_equal(d.shape, (3341, 3341), "wrong shape (should be (Natoms,Natoms))") - assert_almost_equal(d.min(), 0.11981228170520701, self.prec, - err_msg="wrong minimum distance value") - assert_almost_equal(d.max(), 53.572192429459619, self.prec, - err_msg="wrong maximum distance value") - - def test_outarray(self, DCD_Universe, backend): - U, trajectory = DCD_Universe - trajectory.rewind() - x0 = U.atoms.positions - trajectory[10] - x1 = U.atoms.positions - natoms = len(U.atoms) - d = np.zeros((natoms, natoms), np.float64) - MDAnalysis.lib.distances.distance_array(x0, x1, result=d, backend=backend) - assert_equal(d.shape, (natoms, natoms), "wrong shape, shoud be (Natoms,Natoms) entries") - assert_almost_equal(d.min(), 0.11981228170520701, self.prec, - err_msg="wrong minimum distance value") - assert_almost_equal(d.max(), 53.572192429459619, self.prec, - err_msg="wrong maximum distance value") - - def test_periodic(self, DCD_Universe, backend): - # boring with the current dcd as that has no PBC - U, trajectory = DCD_Universe - trajectory.rewind() - x0 = U.atoms.positions - trajectory[10] - x1 = U.atoms.positions - d = MDAnalysis.lib.distances.distance_array(x0, x1, box=U.coord.dimensions, - backend=backend) - assert_equal(d.shape, (3341, 3341), "should be square matrix with Natoms entries") - assert_almost_equal(d.min(), 0.11981228170520701, self.prec, - err_msg="wrong minimum distance value with PBC") - assert_almost_equal(d.max(), 53.572192429459619, self.prec, - err_msg="wrong maximum distance value with PBC") - - - -@pytest.mark.parametrize('backend', ['serial', 'openmp']) -class TestSelfDistanceArrayDCD(object): - prec = 5 - - def test_simple(self, DCD_Universe, backend): - U, trajectory = DCD_Universe - trajectory.rewind() - x0 = U.atoms.positions - d = MDAnalysis.lib.distances.self_distance_array(x0, backend=backend) - N = 3341 * (3341 - 1) / 2 - assert_equal(d.shape, (N,), "wrong shape (should be (Natoms*(Natoms-1)/2,))") - assert_almost_equal(d.min(), 0.92905562402529318, self.prec, - err_msg="wrong minimum distance value") - assert_almost_equal(d.max(), 52.4702570624190590, self.prec, - err_msg="wrong maximum distance value") - - def test_outarray(self, DCD_Universe, backend): - U, trajectory = DCD_Universe - trajectory.rewind() - x0 = U.atoms.positions - natoms = len(U.atoms) - N = natoms * (natoms - 1) // 2 - d = np.zeros((N,), np.float64) - MDAnalysis.lib.distances.self_distance_array(x0, result=d, backend=backend) - assert_equal(d.shape, (N,), "wrong shape (should be (Natoms*(Natoms-1)/2,))") - assert_almost_equal(d.min(), 0.92905562402529318, self.prec, - err_msg="wrong minimum distance value") - assert_almost_equal(d.max(), 52.4702570624190590, self.prec, - err_msg="wrong maximum distance value") - - def test_periodic(self, DCD_Universe, backend): - # boring with the current dcd as that has no PBC - U, trajectory = DCD_Universe - trajectory.rewind() - x0 = U.atoms.positions - natoms = len(U.atoms) - N = natoms * (natoms - 1) / 2 - d = MDAnalysis.lib.distances.self_distance_array(x0, box=U.coord.dimensions, - backend=backend) - assert_equal(d.shape, (N,), "wrong shape (should be (Natoms*(Natoms-1)/2,))") - assert_almost_equal(d.min(), 0.92905562402529318, self.prec, - err_msg="wrong minimum distance value with PBC") - assert_almost_equal(d.max(), 52.4702570624190590, self.prec, - err_msg="wrong maximum distance value with PBC") - - -@pytest.mark.parametrize('backend', ['serial', 'openmp']) -class TestTriclinicDistances(object): - """Unit tests for the Triclinic PBC functions. - Tests: - # transforming to and from S space (fractional coords) - mda.lib.distances.transform_StoR - mda.lib.distances.transform_RtoS - # distance calculations with PBC - mda.lib.distances.self_distance_array - mda.lib.distances.distance_array - """ - - prec = 2 - - @staticmethod - @pytest.fixture() - def TRIC(): - return MDAnalysis.Universe(TRIC) - - @staticmethod - @pytest.fixture() - def tri_vec_box(TRIC): - return MDAnalysis.coordinates.core.triclinic_vectors(TRIC.dimensions) - - @staticmethod - @pytest.fixture() - def box(TRIC): - return TRIC.dimensions - - @staticmethod - @pytest.fixture() - def S_mol(TRIC): - S_mol1 = np.array([TRIC.atoms[383].position]) - S_mol2 = np.array([TRIC.atoms[390].position]) - - return S_mol1, S_mol2 - - @staticmethod - @pytest.fixture() - def S_mol_single(TRIC): - S_mol1 = TRIC.atoms[383].position - S_mol2 = TRIC.atoms[390].position - return S_mol1, S_mol2 - - @pytest.mark.parametrize('S_mol', [S_mol, S_mol_single], indirect=True) - def test_transforms(self, S_mol, tri_vec_box, box, backend): - from MDAnalysis.lib.distances import transform_StoR, transform_RtoS - # To check the cython coordinate transform, the same operation is done in numpy - # Is a matrix multiplication of Coords x tri_vec_box = NewCoords, so can use np.dot - S_mol1, S_mol2 = S_mol - # Test transformation - R_mol1 = transform_StoR(S_mol1, box, backend=backend) - R_np1 = np.dot(S_mol1, tri_vec_box) - R_mol2 = transform_StoR(S_mol2, box, backend=backend) - R_np2 = np.dot(S_mol2, tri_vec_box) - - assert_almost_equal(R_mol1, R_np1, self.prec, err_msg="StoR transform failed for S_mol1") - assert_almost_equal(R_mol2, R_np2, self.prec, err_msg="StoR transform failed for S_mol2") - - # Round trip test - S_test1 = transform_RtoS(R_mol1, box, backend=backend) - S_test2 = transform_RtoS(R_mol2, box, backend=backend) - - assert_almost_equal(S_test1, S_mol1, self.prec, err_msg="Round trip 1 failed in transform") - assert_almost_equal(S_test2, S_mol2, self.prec, err_msg="Round trip 2 failed in transform") - - def test_selfdist(self, S_mol, box, tri_vec_box, backend): - from MDAnalysis.lib.distances import self_distance_array - from MDAnalysis.lib.distances import transform_StoR - - S_mol1, S_mol2 = S_mol - - R_coords = transform_StoR(S_mol1, box, backend=backend) - # Transform functions are tested elsewhere so taken as working here - dists = self_distance_array(R_coords, box=box, backend=backend) - # Manually calculate self_distance_array - manual = np.zeros(len(dists), dtype=np.float64) - distpos = 0 - for i, Ri in enumerate(R_coords): - for Rj in R_coords[i + 1:]: - Rij = Rj - Ri - Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] - Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] - Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] - Rij = np.linalg.norm(Rij) # find norm of Rij vector - manual[distpos] = Rij # and done, phew - distpos += 1 - - assert_almost_equal(dists, manual, self.prec, - err_msg="self_distance_array failed with input 1") - - # Do it again for input 2 (has wider separation in points) - R_coords = transform_StoR(S_mol2, box, backend=backend) - # Transform functions are tested elsewhere so taken as working here - dists = self_distance_array(R_coords, box=box, backend=backend) - # Manually calculate self_distance_array - manual = np.zeros(len(dists), dtype=np.float64) - distpos = 0 - for i, Ri in enumerate(R_coords): - for Rj in R_coords[i + 1:]: - Rij = Rj - Ri - Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] - Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] - Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] - Rij = np.linalg.norm(Rij) # find norm of Rij vector - manual[distpos] = Rij # and done, phew - distpos += 1 - - assert_almost_equal(dists, manual, self.prec, - err_msg="self_distance_array failed with input 2") - - def test_distarray(self, S_mol, tri_vec_box, box, backend): - from MDAnalysis.lib.distances import distance_array - from MDAnalysis.lib.distances import transform_StoR - - S_mol1, S_mol2 = S_mol - - R_mol1 = transform_StoR(S_mol1, box, backend=backend) - R_mol2 = transform_StoR(S_mol2, box, backend=backend) - - # Try with box - dists = distance_array(R_mol1, R_mol2, box=box, backend=backend) - # Manually calculate distance_array - manual = np.zeros((len(R_mol1), len(R_mol2))) - for i, Ri in enumerate(R_mol1): - for j, Rj in enumerate(R_mol2): - Rij = Rj - Ri - Rij -= round(Rij[2] / tri_vec_box[2][2]) * tri_vec_box[2] - Rij -= round(Rij[1] / tri_vec_box[1][1]) * tri_vec_box[1] - Rij -= round(Rij[0] / tri_vec_box[0][0]) * tri_vec_box[0] - Rij = np.linalg.norm(Rij) # find norm of Rij vector - manual[i][j] = Rij - - assert_almost_equal(dists, manual, self.prec, - err_msg="distance_array failed with box") - - def test_pbc_dist(self, S_mol, box, backend): - from MDAnalysis.lib.distances import distance_array - S_mol1, S_mol2 = S_mol - - results = np.array([[37.629944]]) - dists = distance_array(S_mol1, S_mol2, box=box, - backend=backend) - - assert_almost_equal(dists, results, self.prec, - err_msg="distance_array failed to retrieve PBC distance") - - def test_pbc_wrong_wassenaar_distance(self, backend): - from MDAnalysis.lib.distances import distance_array - box = [2, 2, 2, 60, 60, 60] - tri_vec_box = MDAnalysis.lib.mdamath.triclinic_vectors(box) - a, b, c = tri_vec_box - point_a = a + b - point_b = .5 * point_a - dist = distance_array(point_a[np.newaxis, :], point_b[np.newaxis, :], - box=box, backend=backend) - assert_almost_equal(dist[0, 0], 1) - # check that our distance is different from the wassenaar distance as - # expected. - assert np.linalg.norm(point_a - point_b) != dist[0, 0] - - - -@pytest.mark.parametrize('backend', ['serial', 'openmp']) -class TestCythonFunctions(object): - # Unit tests for calc_bonds calc_angles and calc_dihedrals in lib.distances - # Tests both numerical results as well as input types as Cython will silently - # produce nonsensical results if given wrong data types otherwise. - prec = 5 - - @staticmethod - @pytest.fixture() - def box(): - return np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) - - @staticmethod - @pytest.fixture() - def triclinic_box(): - box_vecs = np.array([[10., 0., 0.], [1., 10., 0., ], [1., 0., 10.]], - dtype=np.float32) - return MDAnalysis.lib.mdamath.triclinic_box(box_vecs[0], box_vecs[1], - box_vecs[2]) - - @staticmethod - @pytest.fixture() - def positions(): - # dummy atom data - a = np.array([[0., 0., 0.], [0., 0., 0.], [0., 11., 0.], [1., 1., 1.]], dtype=np.float32) - b = np.array([[0., 0., 0.], [1., 1., 1.], [0., 0., 0.], [29., -21., 99.]], dtype=np.float32) - c = np.array([[0., 0., 0.], [2., 2., 2.], [11., 0., 0.], [1., 9., 9.]], dtype=np.float32) - d = np.array([[0., 0., 0.], [3., 3., 3.], [11., -11., 0.], [65., -65., 65.]], dtype=np.float32) - return a, b, c, d - - @staticmethod - def convert_position_dtype(a, b, c, d, dtype): - return a.astype(dtype), b.astype(dtype), c.astype(dtype), d.astype(dtype) - - @staticmethod - @pytest.fixture() - def wronglength(): - # has a different length to other inputs and should raise ValueError - return np.array([[0., 0., 0.], [3., 3., 3.]], - dtype=np.float32) - - # coordinate shifts for single coord tests - shifts = [((0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)), # no shifting - ((1, 0, 0), (0, 1, 1), (0, 0, 1), (1, 1, 0)), # single box lengths - ((-1, 0, 1), (0, -1, 0), (1, 0, 1), (-1, -1, -1)), # negative single - ((4, 3, -2), (-2, 2, 2), (-5, 2, 2), (0, 2, 2))] # multiple boxlengths - - @pytest.mark.parametrize('dtype', (np.float32, np.float64)) - def test_bonds(self, positions, box, backend, dtype): - a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) - dists = MDAnalysis.lib.distances.calc_bonds(a, b, - backend=backend) - assert_equal(len(dists), 4, err_msg="calc_bonds results have wrong length") - dists_pbc = MDAnalysis.lib.distances.calc_bonds(a, b, box=box, - backend=backend) - #tests 0 length - assert_almost_equal(dists[0], 0.0, self.prec, err_msg="Zero length calc_bonds fail") - assert_almost_equal(dists[1], 1.7320508075688772, self.prec, - err_msg="Standard length calc_bonds fail") # arbitrary length check - # PBC checks, 2 without, 2 with - assert_almost_equal(dists[2], 11.0, self.prec, - err_msg="PBC check #1 w/o box") # pbc check 1, subtract single box length - assert_almost_equal(dists_pbc[2], 1.0, self.prec, - err_msg="PBC check #1 with box") - assert_almost_equal(dists[3], 104.26888318, self.prec, # pbc check 2, subtract multiple box - err_msg="PBC check #2 w/o box") # lengths in all directions - assert_almost_equal(dists_pbc[3], 3.46410072, self.prec, - err_msg="PBC check #w with box") - - def test_bonds_badbox(self, positions, backend): - a, b, c, d = positions - badbox1 = np.array([10., 10., 10.], dtype=np.float64) - badbox2 = np.array([[10., 10.], [10., 10., ]], dtype=np.float32) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_bonds(a, b, box=badbox1, - backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_bonds(a, b, box=badbox2, - backend=backend) - - def test_bonds_badresult(self, positions, backend): - a, b, c, d = positions - badresult = np.zeros(len(a) - 1) - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_bonds( - a, b, result=badresult, backend=backend) # Bad result array - - def test_bonds_triclinic(self, positions, triclinic_box, backend): - a, b, c, d = positions - dists = MDAnalysis.lib.distances.calc_bonds(a, b, - box=triclinic_box, backend=backend) - reference = np.array([0.0, 1.7320508, 1.4142136, 2.82842712]) - assert_almost_equal(dists, reference, self.prec, err_msg="calc_bonds with triclinic box failed") - - @pytest.mark.parametrize('shift', shifts) - @pytest.mark.parametrize('periodic', [True, False]) - def test_bonds_single_coords(self, shift, periodic, backend): - box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) - - coords = np.array([[1, 1, 1], [3, 1, 1]], dtype=np.float32) - - shift1, shift2, _, _ = shift - - coords[0] += shift1 * box[:3] - coords[1] += shift2 * box[:3] - - box = box if periodic else None - result = MDAnalysis.lib.distances.calc_bonds(coords[0], coords[1], box, - backend=backend) - - reference = 2.0 if periodic else np.linalg.norm(coords[0] - coords[1]) - - assert_almost_equal(result, reference, decimal=self.prec) - - @pytest.mark.parametrize('dtype', (np.float32, np.float64)) - def test_angles(self, positions, backend, dtype): - a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) - angles = MDAnalysis.lib.distances.calc_angles(a, b, c, - backend=backend) - # Check calculated values - assert_equal(len(angles), 4, err_msg="calc_angles results have wrong length") - # assert_almost_equal(angles[0], 0.0, self.prec, - # err_msg="Zero length angle calculation failed") # What should this be? - assert_almost_equal(angles[1], np.pi, self.prec, - err_msg="180 degree angle calculation failed") - assert_almost_equal(np.rad2deg(angles[2]), 90., self.prec, - err_msg="Ninety degree angle in calc_angles failed") - assert_almost_equal(angles[3], 0.098174833, self.prec, - err_msg="Small angle failed in calc_angles") - - def test_angles_bad_result(self, positions, backend): - a, b, c, d = positions - badresult = np.zeros(len(a) - 1) - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_angles( - a, b, c, result=badresult, backend=backend) # Bad result array - - @pytest.mark.parametrize('case', [ - (np.array([[1, 1, 1], [1, 2, 1], [2, 2, 1]], dtype=np.float32), 0.5 * np.pi), # 90 degree angle - (np.array([[1, 1, 1], [1, 2, 1], [1, 3, 1]], dtype=np.float32), np.pi), # straight line / 180. - (np.array([[1, 1, 1], [1, 2, 1], [2, 1, 1]], dtype=np.float32), 0.25 * np.pi), # 45 - ]) - @pytest.mark.parametrize('shift', shifts) - @pytest.mark.parametrize('periodic', [True, False]) - def test_angles_single_coords(self, case, shift, periodic, backend): - def manual_angle(x, y, z): - return MDAnalysis.lib.mdamath.angle(y - x, y - z) - - box = np.array([10, 20, 30, 90., 90., 90.], dtype=np.float32) - (a, b, c), ref = case - - shift1, shift2, shift3, _ = shift - - a += shift1 * box[:3] - b += shift2 * box[:3] - c += shift3 * box[:3] - - box = box if periodic else None - result = MDAnalysis.lib.distances.calc_angles(a, b, c, box, - backend=backend) - reference = ref if periodic else manual_angle(a, b, c) - assert_almost_equal(result, reference, decimal=4) - - @pytest.mark.parametrize('dtype', (np.float32, np.float64)) - def test_dihedrals(self, positions, backend, dtype): - a, b, c, d = self.convert_position_dtype(*positions, dtype=dtype) - dihedrals = MDAnalysis.lib.distances.calc_dihedrals(a, b, - c, d, - backend=backend) - # Check calculated values - assert_equal(len(dihedrals), 4, err_msg="calc_dihedrals results have wrong length") - assert np.isnan(dihedrals[0]), "Zero length dihedral failed" - assert np.isnan(dihedrals[1]), "Straight line dihedral failed" - assert_almost_equal(dihedrals[2], np.pi, self.prec, err_msg="180 degree dihedral failed") - assert_almost_equal(dihedrals[3], -0.50714064, self.prec, - err_msg="arbitrary dihedral angle failed") - - def test_dihedrals_wronglength(self, positions, wronglength, backend): - a, b, c, d = positions - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_dihedrals( - a, wronglength, c, d, - backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_dihedrals( - wronglength, b, c, d, - backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_dihedrals( - a, b, wronglength, d, - backend=backend) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_dihedrals( - a, b, c, wronglength, - backend=backend) - - def test_dihedrals_bad_result(self, positions, backend): - a, b, c, d = positions - badresult = np.zeros(len(a) - 1) - - with pytest.raises(ValueError): - MDAnalysis.lib.distances.calc_dihedrals( - a, b, c, d, result=badresult, - backend=backend) # Bad result array - - @pytest.mark.parametrize('case', [ - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 1]], dtype=np.float32), 0.), # 0 degree angle (cis) - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 1]], dtype=np.float32), np.pi), # 180 degree (trans) - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 2]], dtype=np.float32), 0.5 * np.pi), # 90 degree - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 1, 0]], dtype=np.float32), 0.5 * np.pi), # other 90 degree - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 2, 2]], dtype=np.float32), 0.25 * np.pi), # 45 degree - (np.array([[1, 2, 1], [1, 1, 1], [2, 1, 1], [2, 0, 2]], dtype=np.float32), 0.75 * np.pi), # 135 - ]) - @pytest.mark.parametrize('shift', shifts) - @pytest.mark.parametrize('periodic', [True, False]) - def test_dihedrals_single_coords(self, case, shift, periodic, backend): - def manual_dihedral(a, b, c, d): - return MDAnalysis.lib.mdamath.dihedral(b - a, c - b, d - c) - - box = np.array([10., 10., 10., 90., 90., 90.], dtype=np.float32) - - (a, b, c, d), ref = case - - shift1, shift2, shift3, shift4 = shift - - a += shift1 * box[:3] - b += shift2 * box[:3] - c += shift3 * box[:3] - d += shift4 * box[:3] - - box = box if periodic else None - result = MDAnalysis.lib.distances.calc_dihedrals(a, b, c, d, box, - backend=backend) - reference = ref if periodic else manual_dihedral(a, b, c, d) - assert_almost_equal(abs(result), abs(reference), decimal=4) - - def test_numpy_compliance(self, positions, backend): - a, b, c, d = positions - # Checks that the cython functions give identical results to the numpy versions - bonds = MDAnalysis.lib.distances.calc_bonds(a, b, - backend=backend) - angles = MDAnalysis.lib.distances.calc_angles(a, b, c, - backend=backend) - dihedrals = MDAnalysis.lib.distances.calc_dihedrals(a, b, - c, d, - backend=backend) - - bonds_numpy = np.array([mdamath.norm(y - x) for x, y in zip(a, b)]) - vec1 = a - b - vec2 = c - b - angles_numpy = np.array([mdamath.angle(x, y) for x, y in zip(vec1, vec2)]) - ab = a - b - bc = b - c - cd = c - d - dihedrals_numpy = np.array([mdamath.dihedral(x, y, z) for x, y, z in zip(ab, bc, cd)]) - - assert_almost_equal(bonds, bonds_numpy, self.prec, - err_msg="Cython bonds didn't match numpy calculations") - # numpy 0 angle returns NaN rather than 0 - assert_almost_equal(angles[1:], angles_numpy[1:], self.prec, - err_msg="Cython angles didn't match numpy calcuations") - assert_almost_equal(dihedrals, dihedrals_numpy, self.prec, - err_msg="Cython dihedrals didn't match numpy calculations") - - -@pytest.mark.parametrize('backend', ['serial', 'openmp']) -class Test_apply_PBC(object): - prec = 6 - - def test_ortho_PBC(self, backend): - from MDAnalysis.lib.distances import apply_PBC - - U = MDAnalysis.Universe(PSF, DCD) - atoms = U.atoms.positions - box = np.array([2.5, 2.5, 3.5, 90., 90., 90.], dtype=np.float32) - with pytest.raises(ValueError): - cyth1 = apply_PBC(atoms, box[:3], backend=backend) - cyth2 = apply_PBC(atoms, box, backend=backend) - reference = atoms - np.floor(atoms / box[:3]) * box[:3] - - assert_almost_equal(cyth2, reference, self.prec, - err_msg="Ortho apply_PBC #2 failed comparison with np") - - def test_tric_PBC(self, backend): - from MDAnalysis.lib.distances import apply_PBC - - U = MDAnalysis.Universe(TRIC) - atoms = U.atoms.positions - box = U.dimensions - - def numpy_PBC(coords, box): - # move to fractional coordinates - fractional = MDAnalysis.lib.distances.transform_RtoS(coords, box) - # move fractional coordinates to central cell - fractional -= np.floor(fractional) - # move back to real coordinates - return MDAnalysis.lib.distances.transform_StoR(fractional, box) - - cyth1 = apply_PBC(atoms, box, backend=backend) - reference = numpy_PBC(atoms, box) - - assert_almost_equal(cyth1, reference, decimal=4, - err_msg="Triclinic apply_PBC failed comparison with np") - - box = np.array([10, 7, 3, 45, 60, 90], dtype=np.float32) - r = np.array([[5.75, 0.36066014, 0.75]], dtype=np.float32) - r_in_cell = MDAnalysis.lib.distances.apply_PBC(r, box)[0] - assert_almost_equal([5.75, 7.3606596, 0.75], - r_in_cell, self.prec) - -@pytest.mark.parametrize('backend', ['serial', 'openmp']) -class TestPeriodicAngles(object): - """Test case for properly considering minimum image convention when calculating angles and dihedrals - (Issue 172) - """ - @staticmethod - @pytest.fixture() - def positions(): - a = np.array([[0.0, 1.0, 0.0]], dtype=np.float32) - b = np.array([[0.0, 0.0, 0.0]], dtype=np.float32) - c = np.array([[1.0, 0.0, 0.0]], dtype=np.float32) - d = np.array([[1.0, 0.0, 1.0]], dtype=np.float32) - box = np.array([10.0, 10.0, 10.0], dtype=np.float32) - return a, b, c, d, box - - prec = 5 - - def test_angles(self, positions, backend): - from MDAnalysis.lib.distances import calc_angles - # Shift atom coordinates a few box lengths in random directions and see if we still get same results - a, b, c, d, box = positions - a2 = (a + box * (-1, 0, 0)).astype(np.float32) # seem to get converted to float64 otherwise - b2 = (b + box * (1, 0, 1)).astype(np.float32) - c2 = (c + box * (-2, 5, -7)).astype(np.float32) - - ref = calc_angles(a, b, c, backend=backend) - - box = np.append(box, [90, 90, 90]) - test1 = calc_angles(a2, b, c, box=box, backend=backend) - test2 = calc_angles(a, b2, c, box=box, backend=backend) - test3 = calc_angles(a, b, c2, box=box, backend=backend) - test4 = calc_angles(a2, b2, c2, box=box, backend=backend) - - for val in [test1, test2, test3, test4]: - assert_almost_equal(ref, val, self.prec, err_msg="Min image in angle calculation failed") - - def test_dihedrals(self, positions, backend): - from MDAnalysis.lib.distances import calc_dihedrals - a, b, c, d, box = positions - a2 = (a + box * (-1, 0, 0)).astype(np.float32) - b2 = (b + box * (1, 0, 1)).astype(np.float32) - c2 = (c + box * (-2, 5, -7)).astype(np.float32) - d2 = (d + box * (0, -5, 0)).astype(np.float32) - - ref = calc_dihedrals(a, b, c, d, backend=backend) - - box = np.append(box, [90, 90, 90]) - test1 = calc_dihedrals(a2, b, c, d, box=box, - backend=backend) - test2 = calc_dihedrals(a, b2, c, d, box=box, - backend=backend) - test3 = calc_dihedrals(a, b, c2, d, box=box, - backend=backend) - test4 = calc_dihedrals(a, b, c, d2, box=box, - backend=backend) - test5 = calc_dihedrals(a2, b2, c2, d2, box=box, - backend=backend) - - for val in [test1, test2, test3, test4, test5]: - assert_almost_equal(ref, val, self.prec, err_msg="Min image in dihedral calculation failed") - - -class TestDistanceBackendSelection(object): - @staticmethod - @pytest.fixture() - def backend_selection_pos(): - positions = np.random.rand(10, 3) - N = positions.shape[0] - result = np.empty(N * (N - 1) // 2, dtype=np.float64) - - return positions, result - - @pytest.mark.parametrize('backend', [ - "serial", "Serial", "SeRiAL", "SERIAL", - "openmp", "OpenMP", "oPENmP", "OPENMP", - ]) - def test_case_insensitivity(self, backend, backend_selection_pos): - positions, result = backend_selection_pos - try: - MDAnalysis.lib.distances._run("calc_self_distance_array", - args=(positions, result), - backend=backend) - except RuntimeError: - pytest.fail("Failed to understand backend {0}".format(backend)) - - def test_wront_backend(self, backend_selection_pos): - positions, result = backend_selection_pos - with pytest.raises(ValueError): - MDAnalysis.lib.distances._run("calc_self_distance_array", - args=(positions, result), - backend="not implemented stuff") - -def test_used_openmpflag(): - assert isinstance(MDAnalysis.lib.distances.USED_OPENMP, bool) From ec246c59e8b26a4ff96bbcc8fd93adfe746be37c Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Thu, 13 Sep 2018 08:09:37 -0700 Subject: [PATCH 446/455] allow import of WaterBridgeAnalysis from analysis.hbonds (#2071) fixes #2064 --- package/CHANGELOG | 15 ++++++++------- package/MDAnalysis/analysis/hbonds/__init__.py | 6 ++++-- .../MDAnalysisTests/analysis/test_wbridge.py | 8 ++++++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 4588549879f..e71af0ad3f8 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -53,10 +53,10 @@ Enhancements * Added a rotation coordinate transformation (PR #1937) * Added a box centering trajectory transformation (PR #1946) * Added a on-the-fly trajectory transformations API and a coordinate translation - function (Issue #786) + function (Issue #786) * Added various duecredit stubs * Import time reduced by a factor two (PR #1881) - * added compound kwarg to center, centroid, center_of_geometry, center_of_mass (PR #1903) + * Added compound kwarg to center, centroid, center_of_geometry, center_of_mass (PR #1903) * Added rdf.InterRDF_s to calculate site-specific pair distribution functions (PR #1815) * Increased performance of (repeated) calls to AtomGroup.pack_into_box() @@ -85,10 +85,10 @@ Enhancements arrays of coordinates now also accept single coordinates as input (PR #2048) * Performance improvements to make_whole (PR #1965) * Performance improvements to fragment finding (PR #2028) - * Added user defined boxes in density code (PR #2005) + * Added user-defined boxes in density code (PR #2005) Fixes - * rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) + * Rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) * Fixed order of indices in Angle/Dihedral/Improper repr * coordinates.memory.MemoryReader now takes np.ndarray only (Issue #1685) * Silenced warning when duecredit is not installed (Issue #1872) @@ -106,6 +106,7 @@ Fixes * Added periodic boundary box support to the Tinker file reader (Issue #2001) * Modifying coordinates by assignation is consistently persistent when using the memory reader (Issue #2018) + * Allow import of WaterBridgeAnalysis from analysis.hbonds (#2064) Changes * TopologyAttrs are now statically typed (Issue #1876) @@ -121,7 +122,7 @@ Changes * The TPR parser reads SETTLE constraints as bonds. (Issue #1949) * Indexing a trajectory with a slice or an array now returns an iterable (Issue #1894) - * removed unused function MDAnalysis.lb.mdamath.one_to_many_pointers() + * Removed unused function MDAnalysis.lb.mdamath.one_to_many_pointers() (issue #2010) * Box input for functions in `MDAnalysis.lib.distances` is now consistently enforced to be of the form ``[lx, ly, lz, alpha, beta, gamma]`` as required @@ -129,10 +130,10 @@ Changes * Added periodic keyword to select_atoms (#759) Deprecations - * almost all "save()", "save_results()", "save_table()" methods in + * Almost all "save()", "save_results()", "save_table()" methods in analysis classes were deprecated and will be removed in 1.0 (Issue #1972 and #1745) - * deprecated use of core.flags. For use_pbc, the pbc keyword should + * Deprecated use of core.flags. For use_pbc, the pbc keyword should be used, use_KDTree_routines is obsolete as all distance calculations select the fastest method, all other uses of flags are deprecated. (#782) diff --git a/package/MDAnalysis/analysis/hbonds/__init__.py b/package/MDAnalysis/analysis/hbonds/__init__.py index 13548db2059..5a1bacf2071 100644 --- a/package/MDAnalysis/analysis/hbonds/__init__.py +++ b/package/MDAnalysis/analysis/hbonds/__init__.py @@ -1,5 +1,5 @@ # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 # # MDAnalysis --- https://www.mdanalysis.org # Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors @@ -21,7 +21,9 @@ # from __future__ import absolute_import -__all__ = ['HydrogenBondAnalysis', 'HydrogenBondAutoCorrel'] +__all__ = ['HydrogenBondAnalysis', 'HydrogenBondAutoCorrel', + 'WaterBridgeAnalysis'] from .hbond_analysis import HydrogenBondAnalysis from .hbond_autocorrel import HydrogenBondAutoCorrel +from .wbridge_analysis import WaterBridgeAnalysis diff --git a/testsuite/MDAnalysisTests/analysis/test_wbridge.py b/testsuite/MDAnalysisTests/analysis/test_wbridge.py index af66337cbfe..eae136fc3d7 100644 --- a/testsuite/MDAnalysisTests/analysis/test_wbridge.py +++ b/testsuite/MDAnalysisTests/analysis/test_wbridge.py @@ -6,6 +6,14 @@ import MDAnalysis from MDAnalysis.analysis.hbonds.wbridge_analysis import WaterBridgeAnalysis +def test_import_from_hbonds(): + try: + from MDAnalysis.analysis.hbonds import WaterBridgeAnalysis + except ImportError: + raise AssertionError("Issue #2064 not fixed: " + "importing WaterBridgeAnalysis from " + "MDAnalysis.analysis.hbonds failed.'") + class TestWaterBridgeAnalysis(object): def test_acceptor_water_accepter(self): '''Test case where the hydrogen bond acceptor from selection 1 form From 55e747504e51f873dfffdf8356ce425cdfbc6f08 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Fri, 21 Sep 2018 10:22:37 -0500 Subject: [PATCH 447/455] fixes #1795 (#2074) * fixes #1795 SphericalZone and SphericalLayer no longer shift atoms to inside primary unit cell when calculating center of reference group * additional tests for sphzone --- package/CHANGELOG | 3 +++ package/MDAnalysis/core/selection.py | 6 ++---- testsuite/MDAnalysisTests/core/test_atomselections.py | 10 ++++++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 96122d3e129..078aea20630 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -106,6 +106,9 @@ Fixes * Modifying coordinates by assignation is consistently persistent when using the memory reader (Issue #2018) * Allow import of WaterBridgeAnalysis from analysis.hbonds (#2064) + * Fixed SphericalLayer and SphericalZone selections with pbc=True. Previously + these shifted all atoms to inside the primary unit cell when calculating the + center of the reference group (Issue #1795) Changes * TopologyAttrs are now statically typed (Issue #1876) diff --git a/package/MDAnalysis/core/selection.py b/package/MDAnalysis/core/selection.py index 828cfbb594f..4c471419957 100644 --- a/package/MDAnalysis/core/selection.py +++ b/package/MDAnalysis/core/selection.py @@ -288,8 +288,7 @@ def apply(self, group): sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) periodic = box is not None - ref = sel.center_of_geometry(pbc=periodic).reshape(1, 3).astype( - np.float32) + ref = sel.center_of_geometry().reshape(1, 3).astype(np.float32) pairs = distances.capped_distance(ref, group.positions, self.exRadius, min_cutoff=self.inRadius, box=box, @@ -314,8 +313,7 @@ def apply(self, group): sel = self.sel.apply(group) box = self.validate_dimensions(group.dimensions) periodic = box is not None - ref = sel.center_of_geometry(pbc=periodic).reshape(1, 3).astype( - np.float32) + ref = sel.center_of_geometry().reshape(1, 3).astype(np.float32) pairs = distances.capped_distance(ref, group.positions, self.cutoff, box=box, return_distances=False) diff --git a/testsuite/MDAnalysisTests/core/test_atomselections.py b/testsuite/MDAnalysisTests/core/test_atomselections.py index c60e094aee5..952469ce3f4 100644 --- a/testsuite/MDAnalysisTests/core/test_atomselections.py +++ b/testsuite/MDAnalysisTests/core/test_atomselections.py @@ -530,7 +530,7 @@ def test_spherical_layer(self, u, periodic): r1 = u.select_atoms('resid 1') box = u.dimensions if periodic else None - cog = r1.center_of_geometry(pbc=periodic).reshape(1, 3) + cog = r1.center_of_geometry().reshape(1, 3) d = distance_array(u.atoms.positions, cog, box=box) ref = set(np.where((d > 2.4) & (d < 6.0))[0]) @@ -548,7 +548,7 @@ def test_spherical_zone(self, u, periodic): r1 = u.select_atoms('resid 1') box = u.dimensions if periodic else None - cog = r1.center_of_geometry(pbc=periodic).reshape(1, 3) + cog = r1.center_of_geometry().reshape(1, 3) d = distance_array(u.atoms.positions, cog, box=box) ref = set(np.where(d < 5.0)[0]) @@ -603,6 +603,12 @@ def test_cyzone(self, u, meth, periodic): assert ref == set(result.indices) + @pytest.mark.parametrize('periodic,expected', ([True, 33], [False, 25])) + def test_sphzone(self, u, periodic, expected): + sel = u.select_atoms('sphzone 5.0 resid 1', periodic=periodic) + + assert len(sel) == expected + class TestTriclinicDistanceSelections(BaseDistanceSelection): @pytest.fixture() From 00cf3b783c779bf9320bdaab1f3436ec0734d7b2 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Wed, 22 Aug 2018 13:50:16 -0500 Subject: [PATCH 448/455] removed quiet in favour of verbose updated usage of Analysis API, start/stop/step now deprecated in __init__ and should be given in run method made PCA setup respect start frame more, if start is given then initial weights are from that frame not frame 0 --- benchmarks/benchmarks/analysis/rms.py | 5 +- package/CHANGELOG | 11 ++- package/MDAnalysis/analysis/base.py | 88 ++++++++++++------- package/MDAnalysis/analysis/contacts.py | 8 -- package/MDAnalysis/analysis/density.py | 4 +- package/MDAnalysis/analysis/diffusionmap.py | 44 +++++----- .../analysis/hbonds/hbond_analysis.py | 68 ++++++-------- .../analysis/hbonds/wbridge_analysis.py | 52 +++++------ package/MDAnalysis/analysis/helanal.py | 5 +- package/MDAnalysis/analysis/pca.py | 51 +++++------ package/MDAnalysis/analysis/rms.py | 25 +----- package/MDAnalysis/analysis/waterdynamics.py | 7 +- package/MDAnalysis/core/universe.py | 6 +- package/MDAnalysis/lib/log.py | 61 +------------ .../MDAnalysisTests/analysis/test_align.py | 2 +- .../MDAnalysisTests/analysis/test_base.py | 57 ++++++------ .../MDAnalysisTests/analysis/test_contacts.py | 4 +- .../analysis/test_diffusionmap.py | 8 +- .../analysis/test_dihedrals.py | 8 +- .../MDAnalysisTests/analysis/test_pca.py | 12 ++- .../MDAnalysisTests/analysis/test_rms.py | 45 +++------- testsuite/MDAnalysisTests/utils/test_log.py | 41 --------- 22 files changed, 239 insertions(+), 373 deletions(-) diff --git a/benchmarks/benchmarks/analysis/rms.py b/benchmarks/benchmarks/analysis/rms.py index 882eaafcef8..c9811a5984d 100644 --- a/benchmarks/benchmarks/analysis/rms.py +++ b/benchmarks/benchmarks/analysis/rms.py @@ -96,13 +96,10 @@ def setup(self, n_atoms, step, weights): self.u = MDAnalysis.Universe(PSF, DCD) self.ag = self.u.atoms[:n_atoms] self.RMSF_inst = rms.RMSF(atomgroup=self.ag, - start=None, - stop=None, - step=step, weights=weights) def time_RMSF(self, n_atoms, step, weights): """Benchmark RMSF.run() method, which parses over the entire trajectory. """ - self.RMSF_inst.run() + self.RMSF_inst.run(step=step) diff --git a/package/CHANGELOG b/package/CHANGELOG index 078aea20630..acb0c32cbb5 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -78,7 +78,7 @@ Enhancements analysis module (PR #1997, PR #2033) * Added the analysis.data module for reference data used in analysis (PR #2033) * Added analysis.dihedrals with Ramachandran class to analysis module (PR #1997) - * Added augment functionality to create relevant images of particles + * Added augment functionality to create relevant images of particles * Most functions in `MDanalysis.lib.distances` previously only accepting arrays of coordinates now also accept single coordinates as input (PR #2048, Issues #1262 #1938) @@ -109,6 +109,8 @@ Fixes * Fixed SphericalLayer and SphericalZone selections with pbc=True. Previously these shifted all atoms to inside the primary unit cell when calculating the center of the reference group (Issue #1795) + * PCA analysis now uses start frame as reference frame rather than 0th frame + (PR #2055) Changes * TopologyAttrs are now statically typed (Issue #1876) @@ -130,8 +132,15 @@ Changes enforced to be of the form ``[lx, ly, lz, alpha, beta, gamma]`` as required by the docs (Issue #2046, PR #2048) * Added periodic keyword to select_atoms (#759) + * PCA.transform now requires that PCA.run() has already been called + otherwise a ValueError is raised (PR #2055) + * The quiet keyword has been removed and replaced with verbose (Issue #1975 + PR #2055) Deprecations + * start/stop/step are deprecated in the initialization of Analysis classes. + These parameters should instead be given to the run() method of the class. + (Issue #1463 #1979 PR #2055) * Almost all "save()", "save_results()", "save_table()" methods in analysis classes were deprecated and will be removed in 1.0 (Issue #1972 and #1745) diff --git a/package/MDAnalysis/analysis/base.py b/package/MDAnalysis/analysis/base.py index ddf45904029..0d41b1dc2c9 100644 --- a/package/MDAnalysis/analysis/base.py +++ b/package/MDAnalysis/analysis/base.py @@ -32,11 +32,12 @@ from six.moves import range, zip import inspect import logging +import warnings import numpy as np from MDAnalysis import coordinates from MDAnalysis.core.groups import AtomGroup -from MDAnalysis.lib.log import ProgressMeter, _set_verbose +from MDAnalysis.lib.log import ProgressMeter logger = logging.getLogger(__name__) @@ -84,30 +85,34 @@ def _conclude(self): .. code-block:: python - na = NewAnalysis(u.select_atoms('name CA'), 35).run() + na = NewAnalysis(u.select_atoms('name CA'), 35).run(start=10, stop=20) print(na.result) """ - def __init__(self, trajectory, start=None, - stop=None, step=None, verbose=None, quiet=None): + def __init__(self, trajectory, verbose=False, **kwargs): """ Parameters ---------- trajectory : mda.Reader A trajectory Reader - start : int, optional - start frame of analysis - stop : int, optional - stop frame of analysis - step : int, optional - number of frames to skip between each analysed frame verbose : bool, optional - Turn on verbosity + Turn on more logging and debugging, default ``False`` """ - self._verbose = _set_verbose(verbose, quiet, default=False) - self._quiet = not self._verbose - self._setup_frames(trajectory, start, stop, step) + self._trajectory = trajectory + self._verbose = verbose + # do deprecated kwargs + # remove in 1.0 + deps = [] + for arg in ['start', 'stop', 'step']: + if arg in kwargs and not kwargs[arg] is None: + deps.append(arg) + setattr(self, arg, kwargs[arg]) + if deps: + warnings.warn('Setting the following kwargs should be ' + 'done in the run() method: {}'.format( + ', '.join(deps)), + DeprecationWarning) def _setup_frames(self, trajectory, start=None, stop=None, step=None): """ @@ -126,6 +131,11 @@ def _setup_frames(self, trajectory, start=None, stop=None, step=None): number of frames to skip between each analysed frame """ self._trajectory = trajectory + # TODO: Remove once start/stop/step are deprecated from init + # See if these have been set as class attributes, and use that + start = getattr(self, 'start', start) + stop = getattr(self, 'stop', stop) + step = getattr(self, 'step', step) start, stop, step = trajectory.check_slice_indices(start, stop, step) self.start = start self.stop = stop @@ -135,21 +145,9 @@ def _setup_frames(self, trajectory, start=None, stop=None, step=None): if interval == 0: interval = 1 - # ensure _verbose is set when __init__ wasn't called, this is to not - # break pre 0.16.0 API usage of AnalysisBase - if not hasattr(self, '_verbose'): - if hasattr(self, '_quiet'): - # Here, we are in the odd case where a children class defined - # self._quiet without going through AnalysisBase.__init__. - warnings.warn("The *_quiet* attribute of analyses is " - "deprecated (from 0.16)use *_verbose* instead.", - DeprecationWarning) - self._verbose = not self._quiet - else: - self._verbose = True - self._quiet = not self._verbose + verbose = getattr(self, '_verbose', False) self._pm = ProgressMeter(self.n_frames if self.n_frames else 1, - interval=interval, verbose=self._verbose) + interval=interval, verbose=verbose) def _single_frame(self): """Calculate data from a single frame of trajectory @@ -169,8 +167,25 @@ def _conclude(self): """ pass - def run(self): - """Perform the calculation""" + def run(self, start=None, stop=None, step=None, verbose=None): + """Perform the calculation + + Parameters + ---------- + start : int, optional + start frame of analysis + stop : int, optional + stop frame of analysis + step : int, optional + number of frames to skip between each analysed frame + verbose : bool, optional + Turn on verbosity + """ + logger.info("Choosing frames to analyze") + # if verbose unchanged, use class default + verbose = getattr(self, '_verbose', False) if verbose is None else verbose + + self._setup_frames(self._trajectory, start, stop, step) logger.info("Starting preparation") self._prepare() for i, ts in enumerate( @@ -241,10 +256,15 @@ def __init__(self, function, trajectory=None, *args, **kwargs): self.function = function self.args = args - base_kwargs, self.kwargs = _filter_baseanalysis_kwargs(self.function, - kwargs) - super(AnalysisFromFunction, self).__init__(trajectory, **base_kwargs) + # TODO: Remove in 1.0 + my_kwargs = {} + for depped_arg in ['start', 'stop', 'step']: + if depped_arg in kwargs: + my_kwargs[depped_arg] = kwargs.pop(depped_arg) + self.kwargs = kwargs + + super(AnalysisFromFunction, self).__init__(trajectory, **my_kwargs) def _prepare(self): self.results = [] @@ -272,7 +292,7 @@ def analysis_class(function): >>> def RotationMatrix(mobile, ref): >>> return mda.analysis.align.rotation_matrix(mobile, ref)[0] - >>> rot = RotationMatrix(u.trajectory, mobile, ref, step=2).run() + >>> rot = RotationMatrix(u.trajectory, mobile, ref).run(step=2) >>> print(rot.results) """ diff --git a/package/MDAnalysis/analysis/contacts.py b/package/MDAnalysis/analysis/contacts.py index a982160145c..66f8d0470ff 100644 --- a/package/MDAnalysis/analysis/contacts.py +++ b/package/MDAnalysis/analysis/contacts.py @@ -388,14 +388,6 @@ def __init__(self, u, selection, refgroup, method="hard_cut", radius=4.5, kwargs : dict, optional dictionary of additional kwargs passed to `method`. Check respective functions for reasonable values. - start : int, optional - First frame of trajectory to analyse, Default: None becomes 0. - stop : int, optional - Frame index to stop analysis. Default: None becomes - n_frames. Iteration stops *before* this frame number, - which means that the trajectory would be read until the end. - step : int, optional - Step between frames to analyse, Default: None becomes 1. verbose : bool (optional) Show detailed progress of the calculation if set to ``True``; the default is ``False``. diff --git a/package/MDAnalysis/analysis/density.py b/package/MDAnalysis/analysis/density.py index 33588b1c1dd..b9a71deb340 100644 --- a/package/MDAnalysis/analysis/density.py +++ b/package/MDAnalysis/analysis/density.py @@ -552,7 +552,7 @@ def density_from_Universe(universe, delta=1.0, atomselection='name OH2', start=None, stop=None, step=None, metadata=None, padding=2.0, cutoff=0, soluteselection=None, use_kdtree=True, update_selection=False, - verbose=None, interval=1, quiet=None, + verbose=False, interval=1, quiet=None, parameters=None, gridcenter=None, xdim=None, ydim=None, zdim=None): """Create a density grid from a :class:`MDAnalysis.Universe` object. @@ -751,7 +751,7 @@ def current_coordinates(): h = grid.copy() pm = ProgressMeter(u.trajectory.n_frames, interval=interval, - verbose=verbose, quiet=quiet, + verbose=verbose, format="Histogramming %(n_atoms)6d atoms in frame " "%(step)5d/%(numsteps)d [%(percentage)5.1f%%]\r") start, stop, step = u.trajectory.check_slice_indices(start, stop, step) diff --git a/package/MDAnalysis/analysis/diffusionmap.py b/package/MDAnalysis/analysis/diffusionmap.py index aac0cc94576..0de2c618b9c 100644 --- a/package/MDAnalysis/analysis/diffusionmap.py +++ b/package/MDAnalysis/analysis/diffusionmap.py @@ -198,8 +198,7 @@ class DistanceMatrix(AnalysisBase): """ def __init__(self, u, select='all', metric=rmsd, cutoff=1E0-5, - weights=None, start=None, stop=None, step=None, - **kwargs): + weights=None, **kwargs): """ Parameters ---------- @@ -226,14 +225,6 @@ def __init__(self, u, select='all', metric=rmsd, cutoff=1E0-5, Default: 1EO-5 weights : array, optional Weights to be given to coordinates for metric calculation - start : int, optional - First frame of trajectory to analyse, Default: None becomes 0. - stop : int, optional - Frame index to stop analysis. Default: None becomes - n_frames. Iteration stops *before* this frame number, - which means that the trajectory would be read until the end. - step : int, optional - Step between frames to analyse, Default: None becomes 1. verbose : bool (optional) Show detailed progress of the calculation if set to ``True``; the default is ``False``. @@ -242,8 +233,7 @@ def __init__(self, u, select='all', metric=rmsd, cutoff=1E0-5, traj = self._u.trajectory # remember that this must be called before referencing self.n_frames - super(DistanceMatrix, self).__init__(self._u.trajectory, - start=start, stop=stop, step=step, **kwargs) + super(DistanceMatrix, self).__init__(self._u.trajectory, **kwargs) self.atoms = self._u.select_atoms(select) self._metric = metric @@ -325,7 +315,7 @@ def __init__(self, u, epsilon=1, **kwargs): **kwargs Parameters to be passed for the initialization of a :class:`DistanceMatrix`. - """ + """ if isinstance(u, Universe): self._dist_matrix = DistanceMatrix(u, **kwargs) elif isinstance(u, DistanceMatrix): @@ -334,20 +324,32 @@ def __init__(self, u, epsilon=1, **kwargs): raise ValueError("U is not a Universe or DistanceMatrix and" " so the DiffusionMap has no data to work with.") self._epsilon = epsilon + + def run(self, start=None, stop=None, step=None): + """ Create and decompose the diffusion matrix in preparation + for a diffusion map. + + Parameters + ---------- + start : int, optional + start frame of analysis + stop : int, optional + stop frame of analysis + step : int, optional + number of frames to skip between each analysed frame + + .. versionchanged:: 0.19.0 + Added start/stop/step kwargs + """ + # run only if distance matrix not already calculated + if not self._dist_matrix._calculated: + self._dist_matrix.run(start=start, stop=stop, step=step) # important for transform function and length of .run() method self._n_frames = self._dist_matrix.n_frames if self._n_frames > 5000: warnings.warn("The distance matrix is very large, and can " "be very slow to compute. Consider picking a larger " "step size in distance matrix initialization.") - - - def run(self): - """ Create and decompose the diffusion matrix in preparation - for a diffusion map.""" - # run only if distance matrix not already calculated - if not self._dist_matrix._calculated: - self._dist_matrix.run() self._scaled_matrix = (self._dist_matrix.dist_matrix ** 2 / self._epsilon) # take negative exponent of scaled matrix to create Isotropic kernel diff --git a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py index 2a57b6c0559..29d58e78574 100644 --- a/package/MDAnalysis/analysis/hbonds/hbond_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/hbond_analysis.py @@ -326,7 +326,8 @@ class HydrogenBondAnalysis_OtherFF(HydrogenBondAnalysis): import numpy as np from MDAnalysis import MissingDataWarning, NoDataError, SelectionError, SelectionWarning -from MDAnalysis.lib.log import ProgressMeter, _set_verbose +from .. import base +from MDAnalysis.lib.log import ProgressMeter from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch from MDAnalysis.lib import distances from MDAnalysis.lib.util import deprecate @@ -335,7 +336,7 @@ class HydrogenBondAnalysis_OtherFF(HydrogenBondAnalysis): logger = logging.getLogger('MDAnalysis.analysis.hbonds') -class HydrogenBondAnalysis(object): +class HydrogenBondAnalysis(base.AnalysisBase): """Perform a hydrogen bond analysis The analysis of the trajectory is performed with the @@ -406,8 +407,7 @@ def __init__(self, universe, selection1='protein', selection2='all', selection1_ update_selection1=True, update_selection2=True, filter_first=True, distance_type='hydrogen', distance=3.0, angle=120.0, forcefield='CHARMM27', donors=None, acceptors=None, - start=None, stop=None, step=None, - debug=None, detect_hydrogens='distance', verbose=None, pbc=False): + debug=False, detect_hydrogens='distance', verbose=False, pbc=False, **kwargs): """Set up calculation of hydrogen bonds between two selections in a universe. The timeseries is accessible as the attribute :attr:`HydrogenBondAnalysis.timeseries`. @@ -470,15 +470,6 @@ def __init__(self, universe, selection1='protein', selection2='all', selection1_ acceptors : sequence (optional) Extra H acceptor atom types (in addition to those in :attr:`~HydrogenBondAnalysis.DEFAULT_ACCEPTORS`), must be a sequence. - start : int (optional) - starting frame-index for analysis, ``None`` is the first one, 0. - `start` and `stop` are 0-based frame indices and are used to slice - the trajectory (if supported) [``None``] - stop : int (optional) - last trajectory frame for analysis, ``None`` is the last one [``None``] - step : int (optional) - read every `step` between `start` (included) and `stop` (excluded), - ``None`` selects 1. [``None``] detect_hydrogens : {"distance", "heuristic"} (optional) Determine the algorithm to find hydrogens connected to donor atoms. Can be "distance" (default; finds all hydrogens in the @@ -496,7 +487,7 @@ def __init__(self, universe, selection1='protein', selection2='all', selection1_ If set to ``True`` enables per-frame debug logging. This is disabled by default because it generates a very large amount of output in the log file. (Note that a logger must have been started to see - the output, e.g. using :func:`MDAnalysis.start_logging`.) + the output, e.g. using :func:`MDAnalysis.start_logging`.) [``False``] verbose : bool (optional) Toggle progress output. (Can also be given as keyword argument to :meth:`run`.) @@ -564,6 +555,9 @@ def __init__(self, universe, selection1='protein', selection2='all', selection1_ .. _`Issue 138`: https://github.com/MDAnalysis/mdanalysis/issues/138 """ + super(HydrogenBondAnalysis, self).__init__(universe.trajectory, **kwargs) + # per-frame debugging output? + self.debug = debug self._get_bonded_hydrogens_algorithms = { "distance": self._get_bonded_hydrogens_dist, # 0.7.6 default @@ -584,7 +578,6 @@ def __init__(self, universe, selection1='protein', selection2='all', selection1_ self.distance = distance self.distance_type = distance_type # note: everything except 'heavy' will give the default behavior self.angle = angle - self.traj_slice = slice(start, stop, step) self.pbc = pbc and all(self.u.dimensions[:3]) # set up the donors/acceptors lists @@ -606,19 +599,8 @@ def __init__(self, universe, selection1='protein', selection2='all', selection1_ self.table = None # placeholder for output table - self.debug = True # always enable debug output for initial selection update self._update_selection_1() self._update_selection_2() - # per-frame debugging output? - # This line must be changed at the end of the deprecation period for - # the *quiet* keyword argument. Then it must become: - # self.debug = debug - # In the signature, *verbose* must be removed and the default value - # for *debug* must be set to False. - # See the docstring for lib.log._set_verbose, the pull request #1150, - # and the issue #903. - self.debug = _set_verbose(debug, verbose, default=False, - was='verbose', now='debug') self._log_parameters() @@ -635,7 +617,6 @@ def __init__(self, universe, selection1='protein', selection2='all', selection1_ self._sanity_check(2, 'donors') logger.info("HBond analysis: initial checks passed.") - def _sanity_check(self, selection, htype): """sanity check the selections 1 and 2 @@ -873,7 +854,7 @@ def logger_debug(self, *args): if self.debug: logger.debug(*args) - def run(self, **kwargs): + def run(self, start=None, stop=None, step=None, verbose=None, **kwargs): """Analyze trajectory and produce timeseries. Stores the hydrogen bond data per frame as @@ -882,6 +863,15 @@ def run(self, **kwargs): Parameters ---------- + start : int (optional) + starting frame-index for analysis, ``None`` is the first one, 0. + `start` and `stop` are 0-based frame indices and are used to slice + the trajectory (if supported) [``None``] + stop : int (optional) + last trajectory frame for analysis, ``None`` is the last one [``None``] + step : int (optional) + read every `step` between `start` (included) and `stop` (excluded), + ``None`` selects 1. [``None``] verbose : bool (optional) toggle progress meter output :class:`~MDAnalysis.lib.log.ProgressMeter` [``True``] @@ -919,6 +909,9 @@ def run(self, **kwargs): argument `debug`. """ + # sets self.start/stop/step and _pm + self._setup_frames(self._trajectory, start, stop, step) + logger.info("HBond analysis: starting") logger.debug("HBond analysis: donors %r", self.donors) logger.debug("HBond analysis: acceptors %r", self.acceptors) @@ -937,19 +930,9 @@ def run(self, **kwargs): self._timeseries = [] self.timesteps = [] - logger.info("checking trajectory...") # n_frames can take a while! - try: - frames = np.arange(self.u.trajectory.n_frames)[self.traj_slice] - except: - logger.error("Problem reading trajectory or trajectory slice incompatible.") - logger.exception() - raise - verbose = _set_verbose(verbose=kwargs.get('verbose', None), - quiet=kwargs.get('quiet', None), - default=True) - pm = ProgressMeter(len(frames), + pm = ProgressMeter(self.n_frames, format="HBonds frame {current_step:5d}: {step:5d}/{numsteps} [{percentage:5.1f}%]\r", - verbose=verbose) + verbose=kwargs.get('verbose', False)) try: self.u.trajectory.time @@ -963,10 +946,9 @@ def _get_timestep(): logger.warning("HBond analysis is recording frame number instead of time step") logger.info("Starting analysis (frame index start=%d stop=%d, step=%d)", - (self.traj_slice.start or 0), - (self.traj_slice.stop or self.u.trajectory.n_frames), self.traj_slice.step or 1) + self.start, self.stop, self.step) - for progress, ts in enumerate(self.u.trajectory[self.traj_slice]): + for progress, ts in enumerate(self.u.trajectory[self.start:self.stop:self.step]): # all bonds for this timestep frame_results = [] # dict of tuples (atom.index, atom.index) for quick check if diff --git a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py index 419355e33c6..6f81b22c029 100644 --- a/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py +++ b/package/MDAnalysis/analysis/hbonds/wbridge_analysis.py @@ -292,7 +292,7 @@ class WaterBridgeAnalysis_OtherFF(WaterBridgeAnalysis): from .hbond_analysis import HydrogenBondAnalysis from MDAnalysis.lib.NeighborSearch import AtomNeighborSearch -from MDAnalysis.lib.log import ProgressMeter, _set_verbose +from MDAnalysis.lib.log import ProgressMeter from MDAnalysis.lib import distances from MDAnalysis import SelectionWarning @@ -319,8 +319,7 @@ def __init__(self, universe, selection1='protein', update_selection2=False, update_water_selection=True, filter_first=True, distance_type='hydrogen', distance=3.0, angle=120.0, forcefield='CHARMM27', donors=None, - acceptors=None, start=None, stop=None, step=None, debug=None, - verbose=None): + acceptors=None, debug=None, verbose=False, **kwargs): """Set up the calculation of water bridges between two selections in a universe. @@ -406,16 +405,6 @@ def __init__(self, universe, selection1='protein', Extra H acceptor atom types (in addition to those in :attr:`~HydrogenBondAnalysis.DEFAULT_ACCEPTORS`), must be a sequence. - start : int (optional) - starting frame-index for analysis, ``None`` is the first one, 0. - `start` and `stop` are 0-based frame indices and are used to slice - the trajectory (if supported) [``None``] - stop : int (optional) - last trajectory frame for analysis, ``None`` is the last one - [``None``] - step : int (optional) - read every `step` between `start` (included) and `stop` (excluded), - ``None`` selects 1. [``None``] distance_type : {"hydrogen", "heavy"} (optional) Measure hydrogen bond lengths between donor and acceptor heavy attoms ("heavy") or between donor hydrogen and acceptor heavy @@ -451,7 +440,7 @@ def __init__(self, universe, selection1='protein', update_selection2=update_selection2, filter_first=filter_first, distance_type=distance_type, distance=distance, angle=angle, forcefield=forcefield, donors=donors, acceptors=acceptors, - start=start, stop=stop, step=step, debug=debug, verbose=verbose) + debug=debug, verbose=verbose, **kwargs) self._update_water_selection() def _log_parameters(self): @@ -547,7 +536,7 @@ def _update_water_selection(self): 'name {0}'.format(' '.join(self.acceptors))) self.logger_debug("Water acceptors: {0}".format(len(self._water_acceptors))) - def run(self, **kwargs): + def run(self, start=None, stop=None, step=None, verbose=None, debug=None): """Analyze trajectory and produce timeseries. Stores the water bridge data per frame as @@ -556,6 +545,16 @@ def run(self, **kwargs): Parameters ---------- + start : int (optional) + starting frame-index for analysis, ``None`` is the first one, 0. + `start` and `stop` are 0-based frame indices and are used to slice + the trajectory (if supported) [``None``] + stop : int (optional) + last trajectory frame for analysis, ``None`` is the last one + [``None``] + step : int (optional) + read every `step` between `start` (included) and `stop` (excluded), + ``None`` selects 1. [``None``] verbose : bool (optional) toggle progress meter output :class:`~MDAnalysis.lib.log.ProgressMeter` [``True``] @@ -571,12 +570,13 @@ def run(self, **kwargs): :meth:`WaterBridgeAnalysis.generate_table` : processing the data into a different format. """ + self._setup_frames(self.u.trajectory, start, stop, step) + logger.info("WBridge analysis: starting") logger.debug("WBridge analysis: donors %r", self.donors) logger.debug("WBridge analysis: acceptors %r", self.acceptors) logger.debug("WBridge analysis: water bridge %r", self.water_selection) - debug = kwargs.pop('debug', None) if debug is not None and debug != self.debug: self.debug = debug logger.debug("Toggling debug to %r", self.debug) @@ -587,26 +587,16 @@ def run(self, **kwargs): self.timesteps = [] self._water_network = [] - logger.info("checking trajectory...") # n_frames can take a while! - try: - frames = np.arange(self.u.trajectory.n_frames)[self.traj_slice] - except: - logger.error("Problem reading trajectory or trajectory slice incompatible.") - logger.exception() - raise - verbose = _set_verbose(verbose=kwargs.get('verbose', None), - quiet=kwargs.get('quiet', None), - default=True) - pm = ProgressMeter(len(frames), + if verbose is None: + verbose = self._verbose + pm = ProgressMeter(self.n_frames, format="WBridge frame {current_step:5d}: {step:5d}/{numsteps} [{percentage:5.1f}%]\r", verbose=verbose) logger.info("Starting analysis (frame index start=%d stop=%d, step=%d)", - (self.traj_slice.start or 0), - (self.traj_slice.stop or self.u.trajectory.n_frames), - self.traj_slice.step or 1) + self.start, self.stop, self.step) - for progress, ts in enumerate(self.u.trajectory[self.traj_slice]): + for progress, ts in enumerate(self.u.trajectory[self.start:self.stop:self.step]): # all bonds for this timestep # dict of tuples (atom.index, atom.index) for quick check if diff --git a/package/MDAnalysis/analysis/helanal.py b/package/MDAnalysis/analysis/helanal.py index d1b88f89a10..963c628a9b6 100644 --- a/package/MDAnalysis/analysis/helanal.py +++ b/package/MDAnalysis/analysis/helanal.py @@ -124,7 +124,7 @@ import MDAnalysis from MDAnalysis import FinishTimeException -from MDAnalysis.lib.log import ProgressMeter, _set_verbose +from MDAnalysis.lib.log import ProgressMeter from MDAnalysis.lib import mdamath import logging @@ -168,7 +168,7 @@ def helanal_trajectory(universe, selection="name CA", bend_filename="local_bend.xvg", twist_filename="unit_twist.xvg", prefix="helanal_", ref_axis=None, - verbose=None, quiet=None): + verbose=False): """Perform HELANAL helix analysis on all frames in `universe`. Parameters @@ -236,7 +236,6 @@ def helanal_trajectory(universe, selection="name CA", `verbose` one. """ - verbose = _set_verbose(verbose, quiet, default=True) if ref_axis is None: ref_axis = np.array([0., 0., 1.]) else: diff --git a/package/MDAnalysis/analysis/pca.py b/package/MDAnalysis/analysis/pca.py index 7d7c82a88e1..370c11dcb9b 100644 --- a/package/MDAnalysis/analysis/pca.py +++ b/package/MDAnalysis/analysis/pca.py @@ -160,6 +160,10 @@ class PCA(AnalysisBase): Notes ----- Computation can be speed up by supplying a precalculated mean structure + + .. versionchanged:: 0.19.0 + The start frame is used when performing selections and calculating + mean positions. Previously the 0th frame was always used. """ def __init__(self, universe, select='all', align=False, mean=None, @@ -181,46 +185,39 @@ def __init__(self, universe, select='all', align=False, mean=None, n_components : int, optional The number of principal components to be saved, default saves all principal components, Default: None - start : int, optional - First frame of trajectory to use for generation - of covariance matrix, Default: None - stop : int, optional - Last frame of trajectory to use for generation - of covariance matrix, Default: None - step : int, optional - Step between frames of trajectory to use for generation - of covariance matrix, Default: None verbose : bool (optional) Show detailed progress of the calculation if set to ``True``; the default is ``False``. """ - super(PCA, self).__init__(universe.trajectory, - **kwargs) - if self.n_frames == 1: - raise ValueError('No covariance information can be gathered from a' - 'single trajectory frame.\n') - + super(PCA, self).__init__(universe.trajectory, **kwargs) self._u = universe # for transform function self.align = align - # access 0th index - self._u.trajectory[0] - # reference will be 0th index - self._reference = self._u.select_atoms(select) - self._atoms = self._u.select_atoms(select) + + self._calculated = False self.n_components = n_components + self._select = select + self._mean = mean + + def _prepare(self): + # access start index + self._u.trajectory[self.start] + # reference will be start index + self._reference = self._u.select_atoms(self._select) + self._atoms = self._u.select_atoms(self._select) self._n_atoms = self._atoms.n_atoms - self._calculated = False - if mean is None: + if self._mean is None: self.mean = np.zeros(self._n_atoms*3) self._calc_mean = True else: - self.mean = mean.positions + self.mean = self._mean.positions self._calc_mean = False - def _prepare(self): + if self.n_frames == 1: + raise ValueError('No covariance information can be gathered from a' + 'single trajectory frame.\n') n_dim = self._n_atoms * 3 self.cov = np.zeros((n_dim, n_dim)) self._ref_atom_positions = self._reference.positions @@ -303,9 +300,13 @@ def transform(self, atomgroup, n_components=None, start=None, stop=None, Returns ------- pca_space : array, shape (number of frames, number of components) + + .. versionchanged:: 0.19.0 + Transform now requires that :meth:`run` has been called before, + otherwise a :exc:`ValueError` is raised. """ if not self._calculated: - self.run() + raise ValueError('Call run() on the PCA before using transform') if isinstance(atomgroup, Universe): atomgroup = atomgroup.atoms diff --git a/package/MDAnalysis/analysis/rms.py b/package/MDAnalysis/analysis/rms.py index 21fd9efcf3f..1e3fefd29d1 100644 --- a/package/MDAnalysis/analysis/rms.py +++ b/package/MDAnalysis/analysis/rms.py @@ -145,7 +145,7 @@ import MDAnalysis.lib.qcprot as qcp from MDAnalysis.analysis.base import AnalysisBase from MDAnalysis.exceptions import SelectionError, NoDataError -from MDAnalysis.lib.log import ProgressMeter, _set_verbose +from MDAnalysis.lib.log import ProgressMeter from MDAnalysis.lib.util import asiterable, iterable, get_weights, deprecate @@ -370,15 +370,6 @@ def __init__(self, atomgroup, reference=None, select='all', .. Note:: Experimental feature. Only limited error checking implemented. - - start : int (optional) - starting frame, default None becomes 0. - stop : int (optional) - Frame index to stop analysis. Default: None becomes - n_frames. Iteration stops *before* this frame number, - which means that the trajectory would be read until the end. - step : int (optional) - step between frames, default ``None`` becomes 1. filename : str (optional) write RMSD into file with :meth:`RMSD.save` @@ -810,20 +801,6 @@ def __init__(self, atomgroup, **kwargs): super(RMSF, self).__init__(atomgroup.universe.trajectory, **kwargs) self.atomgroup = atomgroup - def run(self, start=None, stop=None, step=None, verbose=None, quiet=None): - """Perform the analysis.""" - - if any([el is not None for el in (start, stop, step, quiet)]): - warnings.warn("run arguments are deprecated. Please pass them at " - "class construction. These options will be removed in 0.17.0", - category=DeprecationWarning) - verbose = _set_verbose(verbose, quiet, default=False) - # regenerate class with correct args - super(RMSF, self).__init__(self.atomgroup.universe.trajectory, - start=start, stop=stop, step=step, - verbose=verbose) - return super(RMSF, self).run() - def _prepare(self): self.sumsquares = np.zeros((self.atomgroup.n_atoms, 3)) self.mean = self.sumsquares.copy() diff --git a/package/MDAnalysis/analysis/waterdynamics.py b/package/MDAnalysis/analysis/waterdynamics.py index 2428095e8c5..efc2b5949b2 100644 --- a/package/MDAnalysis/analysis/waterdynamics.py +++ b/package/MDAnalysis/analysis/waterdynamics.py @@ -419,7 +419,7 @@ import multiprocessing import MDAnalysis.analysis.hbonds -from MDAnalysis.lib.log import _set_verbose, ProgressMeter +from MDAnalysis.lib.log import ProgressMeter class HydrogenBondLifetimes(object): @@ -596,11 +596,10 @@ def _getGraphics(self, HBP, t0, tf, maxdt): return a def _HBA(self, ts, conn, universe, selAtom1, selAtom2, - verbose=None, quiet=None): + verbose=False): """ Main function for calculate C_i and C_c in parallel. """ - verbose = _set_verbose(verbose, quiet, default=False) finalGetResidue1 = selAtom1 finalGetResidue2 = selAtom2 frame = ts.frame @@ -1303,4 +1302,4 @@ def run(self, tau_max=20, start=0, stop=None, step=1, verbose=False): self.tau_timeseries = tau_timeseries self.sp_timeseries = [np.mean(sp) for sp in sp_timeseries_data] - return self \ No newline at end of file + return self diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index 8cd98b758c7..139b0a02fd0 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -115,7 +115,7 @@ from .. import _ANCHOR_UNIVERSES, _TOPOLOGY_ATTRS, _PARSERS from ..exceptions import NoDataError from ..lib import util -from ..lib.log import ProgressMeter, _set_verbose +from ..lib.log import ProgressMeter from ..lib.util import cached, NamedStream, isstream from ..lib.mdamath import find_fragments from . import groups @@ -602,7 +602,7 @@ def load_new(self, filename, format=None, in_memory=False, **kwargs): return self def transfer_to_memory(self, start=None, stop=None, step=None, - verbose=None, quiet=None): + verbose=False): """Transfer the trajectory to in memory representation. Replaces the current trajectory reader object with one of type @@ -626,8 +626,6 @@ def transfer_to_memory(self, start=None, stop=None, step=None, """ from ..coordinates.memory import MemoryReader - verbose = _set_verbose(verbose, quiet, default=False) - if not isinstance(self.trajectory, MemoryReader): # Try to extract coordinates using Timeseries object # This is significantly faster, but only implemented for certain diff --git a/package/MDAnalysis/lib/log.py b/package/MDAnalysis/lib/log.py index 71ac5be41e1..be4ae0f9fb4 100644 --- a/package/MDAnalysis/lib/log.py +++ b/package/MDAnalysis/lib/log.py @@ -221,59 +221,6 @@ def _guess_string_format(template): return _legacy_format -def _set_verbose(verbose, quiet, default=True, - was='quiet', now='verbose'): - """Return the expected value of verbosity - - This function aims at handling the deprecation of the *quiet* keyword in - versin 0.16. - - This function issues a deprecation warning if *quiet* was set (is not - None), and raises a ValueError if *verbose* and *quiet* are set to - contradicting values. - - If *verbose* is set, then the function returns the set value of *verbose*. - If it is not set, but *quiet* is set, then the function returns - `not quiet`. Finally, if none of *verbose* nor *quiet* is set, then - *default* is returned. - - During the deprecation phase of the *quiet* keyword, this function is - expected to be used as follow: - - .. code-block:: python - - def method(verbose=None, quiet=None): - # *verbose* and *quiet* are set to None to distinguish explicitly - # set values. - self.verbose = _set_verbose(verbose, quiet, default=True) - - At the end of the deprecation period, the code above should be replaced by: - - .. code-block:: python - - def method(verbose=True): - # The *quiet* keyword disapeard and the default value for *verbose* - # is set to the actual default value. - self.verbose = verbose - - In `MDAnalysis.analysis.hbonds.hbonds_analysis`, the deprecation scheme is - more complex: *quiet* becomes *verbose*, and *verbose* becomes *debug*. - Hence, this function allows to use diffrent argument names to display in - error messages and deprecation warnings. - """ - if quiet is not None: - warnings.warn("Keyword *{}* is deprecated (from version 0.16); " - "use *{}* instead.".format(was, now), DeprecationWarning) - if verbose is not None and verbose == quiet: - raise ValueError("Keywords *{}* and *{}* are contradicting each other." - .format(now, was)) - return not quiet - elif verbose is None: - return default - else: - return verbose - - class ProgressMeter(object): r"""Simple progress meter @@ -378,17 +325,15 @@ class ProgressMeter(object): """ def __init__(self, numsteps, format=None, interval=10, offset=1, - verbose=None, dynamic=True, - format_handling='auto', quiet=None): + verbose=True, dynamic=True, + format_handling='auto'): self.numsteps = numsteps self.interval = int(interval) self.offset = int(offset) + self.verbose = verbose self.dynamic = dynamic self.numouts = -1 - # The *quiet* keyword argument is deprecated. - self.verbose = _set_verbose(verbose, quiet, default=True) - if format is None: format = "Step {step:5d}/{numsteps} [{percentage:5.1f}%]" self.format_handler = _new_format diff --git a/testsuite/MDAnalysisTests/analysis/test_align.py b/testsuite/MDAnalysisTests/analysis/test_align.py index 8ef3eba270c..16390d7f039 100644 --- a/testsuite/MDAnalysisTests/analysis/test_align.py +++ b/testsuite/MDAnalysisTests/analysis/test_align.py @@ -209,7 +209,7 @@ def test_AlignTraj_step_works(self, universe, reference, tmpdir): reference.trajectory[-1] outfile = str(tmpdir.join('align_test.dcd')) # this shouldn't throw an exception - align.AlignTraj(universe, reference, filename=outfile, step=10).run() + align.AlignTraj(universe, reference, filename=outfile).run(step=10) def test_AlignTraj(self, universe, reference, tmpdir): reference.trajectory[-1] diff --git a/testsuite/MDAnalysisTests/analysis/test_base.py b/testsuite/MDAnalysisTests/analysis/test_base.py index 81c4089d291..fc4e522bf95 100644 --- a/testsuite/MDAnalysisTests/analysis/test_base.py +++ b/testsuite/MDAnalysisTests/analysis/test_base.py @@ -72,19 +72,19 @@ def test_default(u): def test_start(u): - an = FrameAnalysis(u.trajectory, start=20).run() + an = FrameAnalysis(u.trajectory).run(start=20) assert an.n_frames == len(u.trajectory) - 20 assert_equal(an.frames, list(range(20, len(u.trajectory)))) def test_stop(u): - an = FrameAnalysis(u.trajectory, stop=20).run() + an = FrameAnalysis(u.trajectory).run(stop=20) assert an.n_frames == 20 assert_equal(an.frames, list(range(20))) def test_step(u): - an = FrameAnalysis(u.trajectory, step=20).run() + an = FrameAnalysis(u.trajectory).run(step=20) assert an.n_frames == 5 assert_equal(an.frames, list(range(98))[::20]) @@ -92,7 +92,6 @@ def test_step(u): def test_verbose(u): a = FrameAnalysis(u.trajectory, verbose=True) assert a._verbose - assert not a._quiet def test_incomplete_defined_analysis(u): @@ -104,36 +103,29 @@ def test_old_api(u): OldAPIAnalysis(u.trajectory).run() -def test_start_stop_step_conversion(u): - an = FrameAnalysis(u.trajectory) - assert an.start == 0 - assert an.stop == u.trajectory.n_frames - assert an.step == 1 +def test_filter_baseanalysis_kwargs_VE(): + def bad_f(mobile, verbose=2): + pass + kwargs = {'step': 3, 'foo': None} -def test_filter_baseanalysis_kwargs(): - def bad_f(mobile, step=2): - pass + with pytest.raises(ValueError): + base._filter_baseanalysis_kwargs(bad_f, kwargs) + +def test_filter_baseanalysis_kwargs(): def good_f(mobile, ref): pass kwargs = {'step': 3, 'foo': None} - with pytest.raises(ValueError): - base._filter_baseanalysis_kwargs(bad_f, kwargs) - base_kwargs, kwargs = base._filter_baseanalysis_kwargs(good_f, kwargs) - assert 1 == len(kwargs) + assert 2 == len(kwargs) assert kwargs['foo'] == None - assert 5 == len(base_kwargs) - assert base_kwargs['start'] is None - assert base_kwargs['step'] == 3 - assert base_kwargs['stop'] is None - assert base_kwargs['quiet'] is None - assert base_kwargs['verbose'] is None + assert len(base_kwargs) == 1 + assert base_kwargs['verbose'] is False def simple_function(mobile): @@ -144,10 +136,10 @@ def test_AnalysisFromFunction(): u = mda.Universe(PSF, DCD) step = 2 ana1 = base.AnalysisFromFunction( - simple_function, mobile=u.atoms, step=step).run() - ana2 = base.AnalysisFromFunction(simple_function, u.atoms, step=step).run() + simple_function, mobile=u.atoms).run(step=step) + ana2 = base.AnalysisFromFunction(simple_function, u.atoms).run(step=step) ana3 = base.AnalysisFromFunction( - simple_function, u.trajectory, u.atoms, step=step).run() + simple_function, u.trajectory, u.atoms).run(step=step) results = [] for ts in u.trajectory[::step]: @@ -165,7 +157,7 @@ def test_analysis_class(): u = mda.Universe(PSF, DCD) step = 2 - ana = ana_class(u.atoms, step=step).run() + ana = ana_class(u.atoms).run(step=step) results = [] for ts in u.trajectory[::step]: @@ -190,3 +182,16 @@ def distance(a, b): with no_deprecated_call(): d = Distances(u.atoms[:10], u.atoms[10:20]).run() + +@pytest.mark.parametrize('param', ['start', 'stop', 'step']) +def test_runargs_deprecation(param): + u = mda.Universe(PSF, DCD) + + class NothingAnalysis(base.AnalysisBase): + def _single_frame(self): + self.results = [] + + with pytest.warns(DeprecationWarning): + ana = NothingAnalysis(u.trajectory, **{param: 10}) + + ana.run() diff --git a/testsuite/MDAnalysisTests/analysis/test_contacts.py b/testsuite/MDAnalysisTests/analysis/test_contacts.py index ee0b96ea819..ff21825385b 100644 --- a/testsuite/MDAnalysisTests/analysis/test_contacts.py +++ b/testsuite/MDAnalysisTests/analysis/test_contacts.py @@ -170,7 +170,7 @@ class TestContacts(object): def universe(): return mda.Universe(PSF, DCD) - def _run_Contacts(self, universe, **kwargs): + def _run_Contacts(self, universe, start=None, stop=None, step=None, **kwargs): acidic = universe.select_atoms(self.sel_acidic) basic = universe.select_atoms(self.sel_basic) return contacts.Contacts( @@ -178,7 +178,7 @@ def _run_Contacts(self, universe, **kwargs): selection=(self.sel_acidic, self.sel_basic), refgroup=(acidic, basic), radius=6.0, - **kwargs).run() + **kwargs).run(start=start, stop=stop, step=step) def test_startframe(self, universe): """test_startframe: TestContactAnalysis1: start frame set to 0 (resolution of diff --git a/testsuite/MDAnalysisTests/analysis/test_diffusionmap.py b/testsuite/MDAnalysisTests/analysis/test_diffusionmap.py index 842d3a4d778..accf1a3d3ba 100644 --- a/testsuite/MDAnalysisTests/analysis/test_diffusionmap.py +++ b/testsuite/MDAnalysisTests/analysis/test_diffusionmap.py @@ -56,8 +56,8 @@ def test_eg(dist, dmap): def test_dist_weights(u): backbone = u.select_atoms('backbone') weights_atoms = np.ones(len(backbone.atoms)) - dist = diffusionmap.DistanceMatrix(u, select='backbone', weights=weights_atoms, step=3) - dist.run() + dist = diffusionmap.DistanceMatrix(u, select='backbone', weights=weights_atoms) + dist.run(step=3) dmap = diffusionmap.DiffusionMap(dist) dmap.run() assert_array_almost_equal(dmap.eigenvalues, [1, 1, 1, 1], 4) @@ -69,8 +69,8 @@ def test_dist_weights(u): def test_different_steps(u): - dmap = diffusionmap.DiffusionMap(u, select='backbone', step=3) - dmap.run() + dmap = diffusionmap.DiffusionMap(u, select='backbone') + dmap.run(step=3) assert dmap._eigenvectors.shape == (4, 4) diff --git a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py index 92b7ebb7864..c6e4eba69f1 100644 --- a/testsuite/MDAnalysisTests/analysis/test_dihedrals.py +++ b/testsuite/MDAnalysisTests/analysis/test_dihedrals.py @@ -51,7 +51,7 @@ def test_dihedral(self, atomgroup): "match test values") def test_dihedral_single_frame(self, atomgroup): - dihedral = Dihedral([atomgroup], start=5, stop=6).run() + dihedral = Dihedral([atomgroup]).run(start=5, stop=6) test_dihedral = [np.load(DihedralArray)[5]] assert_almost_equal(dihedral.angles, test_dihedral, 5, @@ -88,8 +88,8 @@ def test_ramachandran(self, universe, rama_ref_array): "match test values") def test_ramachandran_single_frame(self, universe, rama_ref_array): - rama = Ramachandran(universe.select_atoms("protein"), - start=5, stop=6).run() + rama = Ramachandran(universe.select_atoms("protein")).run( + start=5, stop=6) assert_almost_equal(rama.angles[0], rama_ref_array[5], 5, err_msg="error: dihedral angles should " @@ -140,7 +140,7 @@ def test_janin(self, universe, janin_ref_array): "match test values") def test_janin_single_frame(self, universe, janin_ref_array): - janin = Janin(universe.select_atoms("protein"), start=5, stop=6).run() + janin = Janin(universe.select_atoms("protein")).run(start=5, stop=6) assert_almost_equal(janin.angles[0], janin_ref_array[5], 3, err_msg="error: dihedral angles should " diff --git a/testsuite/MDAnalysisTests/analysis/test_pca.py b/testsuite/MDAnalysisTests/analysis/test_pca.py index 5609b653324..0716efc2bb3 100644 --- a/testsuite/MDAnalysisTests/analysis/test_pca.py +++ b/testsuite/MDAnalysisTests/analysis/test_pca.py @@ -81,16 +81,24 @@ def test_transform_different_atoms(pca, u): def test_transform_rerun(u): atoms = u.select_atoms('bynum 1-10') u.transfer_to_memory() - pca = PCA(u, select='bynum 1-10', stop=5) + pca = PCA(u, select='bynum 1-10').run(stop=5) dot = pca.transform(atoms) assert_equal(dot.shape, (98, atoms.n_atoms * 3)) +def test_pca_not_run(u): + atoms = u.select_atoms('bynum 1-10') + u.transfer_to_memory() + pca = PCA(u, select='bynum 1-10') + with pytest.raises(ValueError): + dot = pca.transform(atoms, stop=5) + + def test_no_frames(u): atoms = u.select_atoms(SELECTION) u.transfer_to_memory() with pytest.raises(ValueError): - PCA(u, select=SELECTION, stop=1).run() + PCA(u, select=SELECTION).run(stop=1) def test_transform(pca, u): diff --git a/testsuite/MDAnalysisTests/analysis/test_rms.py b/testsuite/MDAnalysisTests/analysis/test_rms.py index f92f1e38fd4..fa560cd8120 100644 --- a/testsuite/MDAnalysisTests/analysis/test_rms.py +++ b/testsuite/MDAnalysisTests/analysis/test_rms.py @@ -191,17 +191,15 @@ def test_progress_meter(self, capsys, universe): assert_equal(actual, expected) def test_rmsd(self, universe, correct_values): - RMSD = MDAnalysis.analysis.rms.RMSD(universe, select='name CA', - step=49) - RMSD.run() + RMSD = MDAnalysis.analysis.rms.RMSD(universe, select='name CA') + RMSD.run(step=49) assert_almost_equal(RMSD.rmsd, correct_values, 4, err_msg="error: rmsd profile should match" + "test values") def test_rmsd_unicode_selection(self, universe, correct_values): - RMSD = MDAnalysis.analysis.rms.RMSD(universe, select=u'name CA', - step=49) - RMSD.run() + RMSD = MDAnalysis.analysis.rms.RMSD(universe, select=u'name CA') + RMSD.run(step=49) assert_almost_equal(RMSD.rmsd, correct_values, 4, err_msg="error: rmsd profile should match" + "test values") @@ -216,7 +214,7 @@ def test_rmsd_atomgroup_selections(self, universe): def test_rmsd_single_frame(self, universe): RMSD = MDAnalysis.analysis.rms.RMSD(universe, select='name CA', - start=5, stop=6).run() + ).run(start=5, stop=6) single_frame = [[5, 6, 0.91544906]] assert_almost_equal(RMSD.rmsd, single_frame, 4, err_msg="error: rmsd profile should match" + @@ -226,7 +224,7 @@ def test_mass_weighted_and_save(self, universe, outfile, correct_values): # mass weighting the CA should give the same answer as weighing # equally because all CA have the same mass RMSD = MDAnalysis.analysis.rms.RMSD(universe, select='name CA', - step=49, weights='mass').run() + weights='mass').run(step=49) RMSD.save(outfile) assert_almost_equal(RMSD.rmsd, correct_values, 4, @@ -238,8 +236,7 @@ def test_mass_weighted_and_save(self, universe, outfile, correct_values): "saved test values") def test_custom_weighted(self, universe, correct_values_mass): - RMSD = MDAnalysis.analysis.rms.RMSD(universe, - step=49, weights="mass").run() + RMSD = MDAnalysis.analysis.rms.RMSD(universe, weights="mass").run(step=49) assert_almost_equal(RMSD.rmsd, correct_values_mass, 4, err_msg="error: rmsd profile should match" @@ -247,10 +244,9 @@ def test_custom_weighted(self, universe, correct_values_mass): def test_weights_mass_is_mass_weighted(self, universe): RMSD_mass = MDAnalysis.analysis.rms.RMSD(universe, - step=49, weights="mass").run() + weights="mass").run(step=49) RMSD_cust = MDAnalysis.analysis.rms.RMSD(universe, - step=49, - weights=universe.atoms.masses).run() + weights=universe.atoms.masses).run(step=49) assert_almost_equal(RMSD_mass.rmsd, RMSD_cust.rmsd, 4, err_msg="error: rmsd profiles should match for 'mass' " "and universe.atoms.masses") @@ -258,8 +254,7 @@ def test_weights_mass_is_mass_weighted(self, universe): def test_custom_weighted_list(self, universe, correct_values_mass): weights = universe.atoms.masses RMSD = MDAnalysis.analysis.rms.RMSD(universe, - step=49, - weights=list(weights)).run() + weights=list(weights)).run(step=49) assert_almost_equal(RMSD.rmsd, correct_values_mass, 4, err_msg="error: rmsd profile should match" + "test values") @@ -287,9 +282,8 @@ def test_rmsd_group_selections_wrong_weights(self, universe): def test_rmsd_group_selections(self, universe, correct_values_group): RMSD = MDAnalysis.analysis.rms.RMSD(universe, - groupselections= - ['backbone', 'name CA'], - step=49).run() + groupselections=['backbone', 'name CA'] + ).run(step=49) assert_almost_equal(RMSD.rmsd, correct_values_group, 4, err_msg="error: rmsd profile should match" "test values") @@ -301,13 +295,11 @@ def test_rmsd_backbone_and_group_selection(self, universe, reference=universe, select="backbone", groupselections=['backbone and resid 1:10', - 'backbone and resid 10:20'], - step=49).run() + 'backbone and resid 10:20']).run(step=49) assert_almost_equal( RMSD.rmsd, correct_values_backbone_group, 4, err_msg="error: rmsd profile should match test values") - def test_ref_length_unequal_len(self, universe): reference = MDAnalysis.Universe(PSF, DCD) reference.atoms = reference.atoms[:-1] @@ -352,16 +344,7 @@ def test_rmsf(self, universe): "values") def test_rmsf_single_frame(self, universe): - rmsfs = rms.RMSF(universe.select_atoms('name CA'), start=5, stop=6).run() - - assert_almost_equal(rmsfs.rmsf, 0, 5, - err_msg="error: rmsfs should all be zero") - - def test_rmsf_old_run(self, universe): - # start/stop arguments should be given at class initialization - with pytest.deprecated_call(): - rmsfs = rms.RMSF(universe.select_atoms('name CA')).run(start=5, - stop=6) + rmsfs = rms.RMSF(universe.select_atoms('name CA')).run(start=5, stop=6) assert_almost_equal(rmsfs.rmsf, 0, 5, err_msg="error: rmsfs should all be zero") diff --git a/testsuite/MDAnalysisTests/utils/test_log.py b/testsuite/MDAnalysisTests/utils/test_log.py index 3acc9bb9119..70f7200b3f0 100644 --- a/testsuite/MDAnalysisTests/utils/test_log.py +++ b/testsuite/MDAnalysisTests/utils/test_log.py @@ -29,7 +29,6 @@ import MDAnalysis import MDAnalysis.lib.log import pytest -from MDAnalysis.lib.log import _set_verbose def test_start_stop_logging(): @@ -143,43 +142,3 @@ def test_not_dynamic_ProgressMeter(buffer, step, percentage, n=51, interval=10): buffer.seek(0) output = "".join(buffer.readlines()) _assert_in(output, (template + '\n').format(**{'step': step, 'numsteps': n, 'percentage': percentage})) - - -class TestSetVerbose(object): - - @pytest.mark.parametrize('verbose, quiet, default, result', [ - (True, False, True, True), # Everything agrees verbose should be True - (False, True, False, False),# Everything agrees verbose should be False - (True, False, False, True), # Make sure the default does not overwrite the user choice - (False, True, True, False), # Make sure the default does not overwrite the user choice - (None, True, False, False), # Verbose is not provided - (None, False, False, True), # Verbose is not provided - ]) - def test__set_verbose_deprecated(self, verbose, quiet, default, result): - with pytest.deprecated_call(): - assert _set_verbose(verbose=verbose, quiet=quiet, default=default) == result - - @pytest.mark.parametrize('verbose, quiet, default, result', [ - (True, None, False, True), # Quiet is not provided - (False, None, False, False),# Quiet is not provided - (None, None, True, True), # Nothing is provided - (None, None, False, False), # Nothing is provided - ]) - def test__set_verbose(self, verbose, quiet, default, result): - assert _set_verbose(verbose=verbose, quiet=quiet, default=default) == result - - @pytest.mark.parametrize('verbose', (True, False)) - def test__set_verbose_invalid_args(self, verbose): - # can't combine the two context managers - with pytest.deprecated_call(): - with pytest.raises(ValueError): - # setting quiet==verbose is a contradiction - _set_verbose(verbose=verbose, quiet=verbose, default=None) - - - @pytest.mark.parametrize('verbose, quiet', [ - (None, True), - (False, True) - ]) - def test_warnings__set_verbose(self, verbose, quiet): - pytest.deprecated_call(_set_verbose, verbose=verbose, quiet=quiet) From edb1643c0a78f7e5447aa3ccc02712e4205ff073 Mon Sep 17 00:00:00 2001 From: Johannes Zeman Date: Sat, 29 Sep 2018 18:51:04 +0200 Subject: [PATCH 449/455] bug fixes in lib.distances (#2083) * fix bug introduced in PR #2048 * allow for empty input coord arrays in lib.distances * tests for empty input coord arrays in lib.distances * fixed _bruteforce_capped() when no pairs are found; fixed _nsgrid_capped() for zero pseudobox size * return type testing for all functions in lib.distances * docs: more precise return type specifications * ensured _nsgrid_capped*() always returns pairs of dtype=np.int64 * added comments and removed unnecessary return type conversion from *capped_distance() * added out-of-box coordinate to TestOutputType tests --- package/MDAnalysis/lib/distances.py | 481 +++++++++--------- package/MDAnalysis/lib/nsgrid.pyx | 2 +- .../MDAnalysisTests/lib/test_distances.py | 395 ++++++++++++++ 3 files changed, 646 insertions(+), 232 deletions(-) diff --git a/package/MDAnalysis/lib/distances.py b/package/MDAnalysis/lib/distances.py index f3ef9365185..62fd98a609b 100644 --- a/package/MDAnalysis/lib/distances.py +++ b/package/MDAnalysis/lib/distances.py @@ -144,8 +144,8 @@ def _check_box(box): * ``'ortho'`` orthogonal box * ``'tri_vecs'`` triclinic box vectors - checked_box : numpy.ndarray - Array of dtype ``numpy.float32`` containing box information: + checked_box : numpy.ndarray (``dtype=numpy.float32``) + Array containing box information: * If `boxtype` is ``'ortho'``, `cecked_box` will have the shape ``(3,)`` containing the x-, y-, and z-dimensions of the orthogonal box. * If `boxtype` is ``'tri_vecs'``, `cecked_box` will have the shape @@ -198,7 +198,7 @@ def _check_result_array(result, shape): Returns ------- - result : numpy.ndarray + result : numpy.ndarray (``dtype=numpy.float64``, ``shape=shape``) The input array or a newly created array if the input was ``None``. Raises @@ -222,8 +222,8 @@ def _check_result_array(result, shape): return result -@check_coords('reference', 'configuration', enforce_copy=False, - reduce_result_if_single=False, check_lengths_match=False) +@check_coords('reference', 'configuration', reduce_result_if_single=False, + check_lengths_match=False) def distance_array(reference, configuration, box=None, result=None, backend="serial"): """Calculate all possible distances between a reference set and another @@ -263,9 +263,9 @@ def distance_array(reference, configuration, box=None, result=None, Returns ------- - d : numpy.ndarray - Array with shape ``(n, m)`` containing the distances ``d[i,j]`` between - reference coordinates ``i`` and configuration coordinates ``j``. + d : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n, m)``) + Array containing the distances ``d[i,j]`` between reference coordinates + ``i`` and configuration coordinates ``j``. .. versionchanged:: 0.13.0 @@ -278,6 +278,8 @@ def distance_array(reference, configuration, box=None, result=None, refnum = reference.shape[0] distances = _check_result_array(result, (refnum, confnum)) + if len(distances) == 0: + return distances if box is not None: boxtype, box = _check_box(box) @@ -297,7 +299,7 @@ def distance_array(reference, configuration, box=None, result=None, return distances -@check_coords('reference', enforce_copy=False, reduce_result_if_single=False) +@check_coords('reference', reduce_result_if_single=False) def self_distance_array(reference, box=None, result=None, backend="serial"): """Calculate all possible distances within a configuration `reference`. @@ -328,10 +330,9 @@ def self_distance_array(reference, box=None, result=None, backend="serial"): Returns ------- - d : numpy.ndarray - Array with shape ``(n*(n-1)/2,)`` containing the distances ``dist[i,j]`` - between reference coordinates ``i`` and ``j`` at position ``d[k]``. Loop - through ``d``: + d : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n*(n-1)/2,)``) + Array containing the distances ``dist[i,j]`` between reference + coordinates ``i`` and ``j`` at position ``d[k]``. Loop through ``d``: .. code-block:: python @@ -411,14 +412,14 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` and `configuration` arrays such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. Each row in `pairs` is an index pair ``[i, j]`` corresponding to the ``i``-th coordinate in `reference` and the ``j``-th coordinate in `configuration`. - distances : numpy.ndarray, optional + distances : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``), optional Distances corresponding to each pair of indices. Only returned if `return_distances` is ``True``. ``distances[k]`` corresponds to the ``k``-th pair returned in `pairs` and gives the distance between the @@ -451,21 +452,10 @@ def capped_distance(reference, configuration, max_cutoff, min_cutoff=None, raise ValueError("Box Argument is of incompatible type. The " "dimension should be either None or of the form " "[lx, ly, lz, alpha, beta, gamma]") - method = _determine_method(reference, configuration, - max_cutoff, min_cutoff=min_cutoff, - box=box, method=method) - - if return_distances: - pairs, dist = method(reference, configuration, max_cutoff, - min_cutoff=min_cutoff, box=box, - return_distances=return_distances) - return np.asarray(pairs), np.asarray(dist) - else: - pairs = method(reference, configuration, max_cutoff, - min_cutoff=min_cutoff, box=box, - return_distances=return_distances) - - return np.asarray(pairs) + method = _determine_method(reference, configuration, max_cutoff, + min_cutoff=min_cutoff, box=box, method=method) + return method(reference, configuration, max_cutoff, min_cutoff=min_cutoff, + box=box, return_distances=return_distances) def _determine_method(reference, configuration, max_cutoff, min_cutoff=None, @@ -571,33 +561,37 @@ def _bruteforce_capped(reference, configuration, max_cutoff, min_cutoff=None, Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` and `configuration` arrays such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. Each row in `pairs` is an index pair ``[i, j]`` corresponding to the ``i``-th coordinate in `reference` and the ``j``-th coordinate in `configuration`. - distances : numpy.ndarray, optional + distances : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``), optional Distances corresponding to each pair of indices. Only returned if `return_distances` is ``True``. ``distances[k]`` corresponds to the ``k``-th pair returned in `pairs` and gives the distance between the coordinates ``reference[pairs[k, 0]]`` and ``configuration[pairs[k, 1]]``. """ - distances = distance_array(reference, configuration, box=box) - if min_cutoff is not None: - mask = np.where((distances <= max_cutoff) & (distances > min_cutoff)) - else: - mask = np.where((distances <= max_cutoff)) + # Default return values (will be overwritten only if pairs are found): + pairs = np.empty((0, 2), dtype=np.int64) + distances = np.empty((0,), dtype=np.float64) - if mask[0].size > 0: - pairs = np.c_[mask[0], mask[1]] - else: - pairs = np.empty((0, 2), dtype=np.int64) + if len(reference) > 0 and len(configuration) > 0: + _distances = distance_array(reference, configuration, box=box) + if min_cutoff is not None: + mask = np.where((_distances <= max_cutoff) & \ + (_distances > min_cutoff)) + else: + mask = np.where((_distances < max_cutoff)) + if mask[0].size > 0: + pairs = np.c_[mask[0], mask[1]] + if return_distances: + distances = _distances[mask] if return_distances: - distances = distances[mask] return pairs, distances else: return pairs @@ -644,14 +638,14 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` and `configuration` arrays such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. Each row in `pairs` is an index pair ``[i, j]`` corresponding to the ``i``-th coordinate in `reference` and the ``j``-th coordinate in `configuration`. - distances : numpy.ndarray, optional + distances : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``), optional Distances corresponding to each pair of indices. Only returned if `return_distances` is ``True``. ``distances[k]`` corresponds to the ``k``-th pair returned in `pairs` and gives the distance between the @@ -660,18 +654,24 @@ def _pkdtree_capped(reference, configuration, max_cutoff, min_cutoff=None, """ from .pkdtree import PeriodicKDTree # must be here to avoid circular import - kdtree = PeriodicKDTree(box=box) - cut = max_cutoff if box is not None else None - kdtree.set_coords(configuration, cutoff=cut) - pairs = kdtree.search_tree(reference, max_cutoff) - if (return_distances or (min_cutoff is not None)) and pairs.size > 0: - refA, refB = pairs[:, 0], pairs[:, 1] - distances = calc_bonds(reference[refA], configuration[refB], box=box) - if min_cutoff is not None: - mask = np.where(distances > min_cutoff) - pairs, distances = pairs[mask], distances[mask] - else: - distances = np.zeros((0, 1), dtype=np.float64) + # Default return values (will be overwritten only if pairs are found): + pairs = np.empty((0, 2), dtype=np.int64) + distances = np.empty((0,), dtype=np.float64) + + if len(reference) > 0 and len(configuration) > 0: + kdtree = PeriodicKDTree(box=box) + cut = max_cutoff if box is not None else None + kdtree.set_coords(configuration, cutoff=cut) + _pairs = kdtree.search_tree(reference, max_cutoff) + if _pairs.size > 0: + pairs = _pairs + if (return_distances or (min_cutoff is not None)): + refA, refB = pairs[:, 0], pairs[:, 1] + distances = calc_bonds(reference[refA], configuration[refB], + box=box) + if min_cutoff is not None: + mask = np.where(distances > min_cutoff) + pairs, distances = pairs[mask], distances[mask] if return_distances: return pairs, distances @@ -710,7 +710,7 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, min_cutoff : float, optional Minimum cutoff distance between `reference` and `configuration` coordinates. - box : numpy.ndarray, optional + box : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``), optional The unitcell dimensions of the system, which can be orthogonal or triclinic and must be provided in the same format as returned by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n @@ -720,7 +720,7 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` and `configuration` arrays such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. @@ -734,45 +734,46 @@ def _nsgrid_capped(reference, configuration, max_cutoff, min_cutoff=None, coordinates ``reference[pairs[k, 0]]`` and ``configuration[pairs[k, 1]]``. """ - if box is None: - # create a pseudobox - # define the max range - # and supply the pseudobox - # along with only one set of coordinates - pseudobox = np.zeros(6, dtype=np.float32) - all_coords = np.concatenate([reference, configuration]) - lmax = all_coords.max(axis=0) - lmin = all_coords.min(axis=0) - # Using maximum dimension as the box size - boxsize = (lmax-lmin).max() - # to avoid failures of very close particles - # but with larger cutoff - if boxsize < 2*max_cutoff: - # just enough box size so that NSGrid doesnot fails - sizefactor = 2.2*max_cutoff/boxsize + # Default return values (will be overwritten only if pairs are found): + pairs = np.empty((0, 2), dtype=np.int64) + distances = np.empty((0,), dtype=np.float64) + + if len(reference) > 0 and len(configuration) > 0: + if box is None: + # create a pseudobox + # define the max range + # and supply the pseudobox + # along with only one set of coordinates + pseudobox = np.zeros(6, dtype=np.float32) + all_coords = np.concatenate([reference, configuration]) + lmax = all_coords.max(axis=0) + lmin = all_coords.min(axis=0) + # Using maximum dimension as the box size + boxsize = (lmax-lmin).max() + # to avoid failures for very close particles but with + # larger cutoff + boxsize = np.maximum(boxsize, 2 * max_cutoff) + pseudobox[:3] = 1.2 * boxsize + pseudobox[3:] = 90. + shiftref, shiftconf = reference.copy(), configuration.copy() + # Extra padding near the origin + shiftref -= lmin - 0.1*boxsize + shiftconf -= lmin - 0.1*boxsize + gridsearch = FastNS(max_cutoff, shiftconf, box=pseudobox, pbc=False) + results = gridsearch.search(shiftref) else: - sizefactor = 1.2 - pseudobox[:3] = sizefactor*boxsize - pseudobox[3:] = 90. - shiftref, shiftconf = reference.copy(), configuration.copy() - # Extra padding near the origin - shiftref -= lmin - 0.1*boxsize - shiftconf -= lmin - 0.1*boxsize - gridsearch = FastNS(max_cutoff, shiftconf, box=pseudobox, pbc=False) - results = gridsearch.search(shiftref) - else: - gridsearch = FastNS(max_cutoff, configuration, box=box) - results = gridsearch.search(reference) + gridsearch = FastNS(max_cutoff, configuration, box=box) + results = gridsearch.search(reference) - pairs = results.get_pairs() - if return_distances or (min_cutoff is not None): - pair_distance = results.get_pair_distances() - if min_cutoff is not None: - idx = pair_distance > min_cutoff - pairs, pair_distance = pairs[idx], pair_distance[idx] + pairs = results.get_pairs() + if return_distances or (min_cutoff is not None): + distances = results.get_pair_distances() + if min_cutoff is not None: + idx = distances > min_cutoff + pairs, distances = pairs[idx], distances[idx] if return_distances: - return pairs, pair_distance + return pairs, distances else: return pairs @@ -812,13 +813,13 @@ def self_capped_distance(reference, max_cutoff, min_cutoff=None, box=None, Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` array such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. Each row in `pairs` is an index pair ``[i, j]`` corresponding to the ``i``-th and the ``j``-th coordinate in `reference`. - distances : numpy.ndarray + distances : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``) Distances corresponding to each pair of indices. ``distances[k]`` corresponds to the ``k``-th pair returned in `pairs` and gives the distance between the coordinates ``reference[pairs[k, 0]]`` and @@ -853,9 +854,7 @@ def self_capped_distance(reference, max_cutoff, min_cutoff=None, box=None, method = _determine_method_self(reference, max_cutoff, min_cutoff=min_cutoff, box=box, method=method) - pairs, dist = method(reference, max_cutoff, min_cutoff=min_cutoff, box=box) - - return np.asarray(pairs), np.asarray(dist) + return method(reference, max_cutoff, min_cutoff=min_cutoff, box=box) def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, @@ -893,6 +892,9 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, if method is not None: return methods[method.lower()] + if len(reference) < 100: + return methods['bruteforce'] + if box is None: min_dim = np.array([reference.min(axis=0)]) max_dim = np.array([reference.max(axis=0)]) @@ -903,9 +905,7 @@ def _determine_method_self(reference, max_cutoff, min_cutoff=None, box=None, tribox = triclinic_vectors(box) size = tribox.max(axis=0) - tribox.min(axis=0) - if len(reference) < 100: - return methods['bruteforce'] - elif max_cutoff < 0.03*size.min(): + if max_cutoff < 0.03*size.min(): return methods['pkdtree'] else: return methods['nsgrid'] @@ -941,36 +941,39 @@ def _bruteforce_capped_self(reference, max_cutoff, min_cutoff=None, box=None): Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` array such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. Each row in `pairs` is an index pair ``[i, j]`` corresponding to the ``i``-th and the ``j``-th coordinate in `reference`. - distances : numpy.ndarray + distances : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``) Distances corresponding to each pair of indices. ``distances[k]`` corresponds to the ``k``-th pair returned in `pairs` and gives the distance between the coordinates ``reference[pairs[k, 0]]`` and ``reference[pairs[k, 1]]``. """ - pairs, distance = [], [] + # Default return values (will be overwritten only if pairs are found): + pairs = np.empty((0, 2), dtype=np.int64) + distances = np.empty((0,), dtype=np.float64) N = len(reference) - distvec = np.zeros((N*(N-1)//2), dtype=np.float64) - self_distance_array(reference, box=box, result=distvec) + # We're searching within a single coordinate set, so we need at least two + # coordinates to find distances between them. + if N > 1: + distvec = self_distance_array(reference, box=box) + dist = np.full((N, N), max_cutoff, dtype=np.float64) + dist[np.triu_indices(N, 1)] = distvec - distance = np.ones((N, N), dtype=np.float32)*max_cutoff - distance[np.triu_indices(N, 1)] = distvec - - if min_cutoff is not None: - mask = np.where((distance < max_cutoff) & (distance > min_cutoff)) - else: - mask = np.where((distance < max_cutoff)) + if min_cutoff is not None: + mask = np.where((dist < max_cutoff) & (dist > min_cutoff)) + else: + mask = np.where((dist < max_cutoff)) - if mask[0].size > 0: - pairs = np.c_[mask[0], mask[1]] - distance = distance[mask] - return np.asarray(pairs), np.asarray(distance) + if mask[0].size > 0: + pairs = np.c_[mask[0], mask[1]] + distances = dist[mask] + return pairs, distances @check_coords('reference', enforce_copy=False, reduce_result_if_single=False) @@ -1003,13 +1006,13 @@ def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, box=None): Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` array such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. Each row in `pairs` is an index pair ``[i, j]`` corresponding to the ``i``-th and the ``j``-th coordinate in `reference`. - distances : numpy.ndarray + distances : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``) Distances corresponding to each pair of indices. ``distances[k]`` corresponds to the ``k``-th pair returned in `pairs` and gives the distance between the coordinates ``reference[pairs[k, 0]]`` and @@ -1017,20 +1020,27 @@ def _pkdtree_capped_self(reference, max_cutoff, min_cutoff=None, box=None): """ from .pkdtree import PeriodicKDTree # must be here to avoid circular import - pairs, distance = [], [] - kdtree = PeriodicKDTree(box=box) - cut = max_cutoff if box is not None else None - kdtree.set_coords(reference, cutoff=cut) - pairs = kdtree.search_pairs(max_cutoff) - if pairs.size > 0: - refA, refB = pairs[:, 0], pairs[:, 1] - distance = calc_bonds(reference[refA], reference[refB], box=box) - if min_cutoff is not None: - mask = np.where(distance > min_cutoff)[0] - pairs, distance = pairs[mask], distance[mask] - return np.asarray(pairs), np.asarray(distance) - + # Default return values (will be overwritten only if pairs are found): + pairs = np.empty((0, 2), dtype=np.int64) + distances = np.empty((0,), dtype=np.float64) + + # We're searching within a single coordinate set, so we need at least two + # coordinates to find distances between them. + if len(reference) > 1: + kdtree = PeriodicKDTree(box=box) + cut = max_cutoff if box is not None else None + kdtree.set_coords(reference, cutoff=cut) + _pairs = kdtree.search_pairs(max_cutoff) + if _pairs.size > 0: + pairs = _pairs + refA, refB = pairs[:, 0], pairs[:, 1] + distances = calc_bonds(reference[refA], reference[refB], box=box) + if min_cutoff is not None: + idx = distances > min_cutoff + pairs, distances = pairs[idx], distances[idx] + return pairs, distances +@check_coords('reference', enforce_copy=False, reduce_result_if_single=False) def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, box=None): """Capped distance evaluations using a grid-based search method. @@ -1060,57 +1070,60 @@ def _nsgrid_capped_self(reference, max_cutoff, min_cutoff=None, box=None): Returns ------- - pairs : numpy.ndarray + pairs : numpy.ndarray (``dtype=numpy.int64``, ``shape=(n_pairs, 2)``) Pairs of indices, corresponding to coordinates in the `reference` array such that the distance between them lies within the interval (`min_cutoff`, `max_cutoff`]. Each row in `pairs` is an index pair ``[i, j]`` corresponding to the ``i``-th and the ``j``-th coordinate in `reference`. - distances : numpy.ndarray + distances : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n_pairs,)``) Distances corresponding to each pair of indices. ``distances[k]`` corresponds to the ``k``-th pair returned in `pairs` and gives the distance between the coordinates ``reference[pairs[k, 0]]`` and ``reference[pairs[k, 1]]``. """ - reference = np.asarray(reference, dtype=np.float32) - if reference.shape == (3, ) or len(reference) == 1: - return [], [] + # Default return values (will be overwritten only if pairs are found): + pairs = np.empty((0, 2), dtype=np.int64) + distances = np.empty((0,), dtype=np.float64) - if box is None: - # create a pseudobox - # define the max range - # and supply the pseudobox - # along with only one set of coordinates - pseudobox = np.zeros(6, dtype=np.float32) - lmax = reference.max(axis=0) - lmin = reference.min(axis=0) - # Using maximum dimension as the box size - boxsize = (lmax-lmin).max() - # to avoid failures of very close particles - # but with larger cutoff - if boxsize < 2*max_cutoff: - # just enough box size so that NSGrid doesnot fails - sizefactor = 2.2*max_cutoff/boxsize + # We're searching within a single coordinate set, so we need at least two + # coordinates to find distances between them. + if len(reference) > 1: + if box is None: + # create a pseudobox + # define the max range + # and supply the pseudobox + # along with only one set of coordinates + pseudobox = np.zeros(6, dtype=np.float32) + lmax = reference.max(axis=0) + lmin = reference.min(axis=0) + # Using maximum dimension as the box size + boxsize = (lmax-lmin).max() + # to avoid failures of very close particles + # but with larger cutoff + if boxsize < 2*max_cutoff: + # just enough box size so that NSGrid doesnot fails + sizefactor = 2.2*max_cutoff/boxsize + else: + sizefactor = 1.2 + pseudobox[:3] = sizefactor*boxsize + pseudobox[3:] = 90. + shiftref = reference.copy() + # Extra padding near the origin + shiftref -= lmin - 0.1*boxsize + gridsearch = FastNS(max_cutoff, shiftref, box=pseudobox, pbc=False) + results = gridsearch.self_search() else: - sizefactor = 1.2 - pseudobox[:3] = sizefactor*boxsize - pseudobox[3:] = 90. - shiftref = reference.copy() - # Extra padding near the origin - shiftref -= lmin - 0.1*boxsize - gridsearch = FastNS(max_cutoff, shiftref, box=pseudobox, pbc=False) - results = gridsearch.self_search() - else: - gridsearch = FastNS(max_cutoff, reference, box=box) - results = gridsearch.self_search() + gridsearch = FastNS(max_cutoff, reference, box=box) + results = gridsearch.self_search() - pairs = results.get_pairs()[::2, :] - pair_distance = results.get_pair_distances()[::2] + pairs = results.get_pairs()[::2, :] + distances = results.get_pair_distances()[::2] + if min_cutoff is not None: + idx = distances > min_cutoff + pairs, distances = pairs[idx], distances[idx] - if min_cutoff is not None: - idx = pair_distance > min_cutoff - pairs, pair_distance = pairs[idx], pair_distance[idx] - return pairs, pair_distance + return pairs, distances @check_coords('coords') @@ -1137,9 +1150,8 @@ def transform_RtoS(coords, box, backend="serial"): Returns ------- - newcoords : numpy.ndarray - An array of dtype ``numpy.float32`` with the same shape as `coords` - containing fractional coordiantes. + newcoords : numpy.ndarray (``dtype=numpy.float32``, ``shape=coords.shape``) + An array containing fractional coordiantes. .. versionchanged:: 0.13.0 @@ -1148,6 +1160,8 @@ def transform_RtoS(coords, box, backend="serial"): Internal dtype conversion of input coordinates to ``numpy.float32``. Now also accepts (and, likewise, returns) a single coordinate. """ + if len(coords) == 0: + return coords boxtype, box = _check_box(box) if boxtype == 'ortho': box = np.diag(box) @@ -1184,9 +1198,8 @@ def transform_StoR(coords, box, backend="serial"): Returns ------- - newcoords : numpy.ndarray - An array of dtype ``numpy.float32`` with the same shape as `coords` - containing real space coordiantes. + newcoords : numpy.ndarray (``dtype=numpy.float32``, ``shape=coords.shape``) + An array containing real space coordiantes. .. versionchanged:: 0.13.0 @@ -1195,6 +1208,8 @@ def transform_StoR(coords, box, backend="serial"): Internal dtype conversion of input coordinates to ``numpy.float32``. Now also accepts (and, likewise, returns) a single coordinate. """ + if len(coords) == 0: + return coords boxtype, box = _check_box(box) if boxtype == 'ortho': box = np.diag(box) @@ -1203,7 +1218,7 @@ def transform_StoR(coords, box, backend="serial"): return coords -@check_coords('coords1', 'coords2', enforce_copy=False) +@check_coords('coords1', 'coords2') def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): """Calculates the bond lengths between pairs of atom positions from the two coordinate arrays `coords1` and `coords2`, which must contain the same @@ -1250,10 +1265,10 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): Returns ------- - bondlengths : numpy.ndarray or float - Array of dtype ``numpy.float64`` containing the bond lengths between - each pair of coordinates. If two single coordinates were supplied, their - distance is returned as a single number instead of an array. + bondlengths : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n,)``) or numpy.float64 + Array containing the bond lengths between each pair of coordinates. If + two single coordinates were supplied, their distance is returned as a + single number instead of an array. .. versionadded:: 0.8 @@ -1266,25 +1281,26 @@ def calc_bonds(coords1, coords2, box=None, result=None, backend="serial"): numatom = coords1.shape[0] bondlengths = _check_result_array(result, (numatom,)) - if box is not None: - boxtype, box = _check_box(box) - if boxtype == 'ortho': - _run("calc_bond_distance_ortho", - args=(coords1, coords2, box, bondlengths), - backend=backend) + if numatom > 0: + if box is not None: + boxtype, box = _check_box(box) + if boxtype == 'ortho': + _run("calc_bond_distance_ortho", + args=(coords1, coords2, box, bondlengths), + backend=backend) + else: + _run("calc_bond_distance_triclinic", + args=(coords1, coords2, box, bondlengths), + backend=backend) else: - _run("calc_bond_distance_triclinic", - args=(coords1, coords2, box, bondlengths), + _run("calc_bond_distance", + args=(coords1, coords2, bondlengths), backend=backend) - else: - _run("calc_bond_distance", - args=(coords1, coords2, bondlengths), - backend=backend) return bondlengths -@check_coords('coords1', 'coords2', 'coords3', enforce_copy=False) +@check_coords('coords1', 'coords2', 'coords3') def calc_angles(coords1, coords2, coords3, box=None, result=None, backend="serial"): """Calculates the angles formed between triplets of atom positions from the @@ -1338,11 +1354,10 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, Returns ------- - angles : numpy.ndarray or float - Array of dtype ``numpy.float64`` containing the angles between each - triplet of coordinates. Values are returned in radians (rad). If three - single coordinates were supplied, the angle is returned as a single - number instead of an array. + angles : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n,)``) or numpy.float64 + Array containing the angles between each triplet of coordinates. Values + are returned in radians (rad). If three single coordinates were + supplied, the angle is returned as a single number instead of an array. .. versionadded:: 0.8 @@ -1358,25 +1373,26 @@ def calc_angles(coords1, coords2, coords3, box=None, result=None, numatom = coords1.shape[0] angles = _check_result_array(result, (numatom,)) - if box is not None: - boxtype, box = _check_box(box) - if boxtype == 'ortho': - _run("calc_angle_ortho", - args=(coords1, coords2, coords3, box, angles), - backend=backend) + if numatom > 0: + if box is not None: + boxtype, box = _check_box(box) + if boxtype == 'ortho': + _run("calc_angle_ortho", + args=(coords1, coords2, coords3, box, angles), + backend=backend) + else: + _run("calc_angle_triclinic", + args=(coords1, coords2, coords3, box, angles), + backend=backend) else: - _run("calc_angle_triclinic", - args=(coords1, coords2, coords3, box, angles), + _run("calc_angle", + args=(coords1, coords2, coords3, angles), backend=backend) - else: - _run("calc_angle", - args=(coords1, coords2, coords3, angles), - backend=backend) return angles -@check_coords('coords1', 'coords2', 'coords3', 'coords4', enforce_copy=False) +@check_coords('coords1', 'coords2', 'coords3', 'coords4') def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, backend="serial"): """Calculates the dihedral angles formed between quadruplets of positions @@ -1440,11 +1456,11 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, Returns ------- - dihedrals : numpy.ndarray or float - Array of dtype ``numpy.float64`` containing the dihedral angles formed - by each quadruplet of coordinates. Values are returned in radians (rad). - If four single coordinates were supplied, the dihedral angle is returned - as a single number instead of an array. + dihedrals : numpy.ndarray (``dtype=numpy.float64``, ``shape=(n,)``) or numpy.float64 + Array containing the dihedral angles formed by each quadruplet of + coordinates. Values are returned in radians (rad). If four single + coordinates were supplied, the dihedral angle is returned as a single + number instead of an array. .. versionadded:: 0.8 @@ -1462,20 +1478,21 @@ def calc_dihedrals(coords1, coords2, coords3, coords4, box=None, result=None, numatom = coords1.shape[0] dihedrals = _check_result_array(result, (numatom,)) - if box is not None: - boxtype, box = _check_box(box) - if boxtype == 'ortho': - _run("calc_dihedral_ortho", - args=(coords1, coords2, coords3, coords4, box, dihedrals), - backend=backend) + if numatom > 0: + if box is not None: + boxtype, box = _check_box(box) + if boxtype == 'ortho': + _run("calc_dihedral_ortho", + args=(coords1, coords2, coords3, coords4, box, dihedrals), + backend=backend) + else: + _run("calc_dihedral_triclinic", + args=(coords1, coords2, coords3, coords4, box, dihedrals), + backend=backend) else: - _run("calc_dihedral_triclinic", - args=(coords1, coords2, coords3, coords4, box, dihedrals), + _run("calc_dihedral", + args=(coords1, coords2, coords3, coords4, dihedrals), backend=backend) - else: - _run("calc_dihedral", - args=(coords1, coords2, coords3, coords4, dihedrals), - backend=backend) return dihedrals @@ -1499,9 +1516,9 @@ def apply_PBC(coords, box, backend="serial"): Returns ------- - newcoords : numpy.ndarray - Array of dtype ``numpy.float32`` containing coordinates that all lie - within the primary unit cell as defined by `box`. + newcoords : numpy.ndarray (``dtype=numpy.float32``, ``shape=coords.shape``) + Array containing coordinates that all lie within the primary unit cell + as defined by `box`. .. versionadded:: 0.8 @@ -1511,6 +1528,8 @@ def apply_PBC(coords, box, backend="serial"): Internal dtype conversion of input coordinates to ``numpy.float32``. Now also accepts (and, likewise, returns) single coordinates. """ + if len(coords) == 0: + return coords boxtype, box = _check_box(box) if boxtype == 'ortho': box_inv = box ** (-1) diff --git a/package/MDAnalysis/lib/nsgrid.pyx b/package/MDAnalysis/lib/nsgrid.pyx index 4ba028ed326..e3cdc608dca 100644 --- a/package/MDAnalysis/lib/nsgrid.pyx +++ b/package/MDAnalysis/lib/nsgrid.pyx @@ -380,7 +380,7 @@ cdef class NSResults(object): and initial atom coordinates of shape ``(N, 2)`` """ - return np.asarray(self.pairs_buffer).reshape(self.npairs, 2) + return np.asarray(self.pairs_buffer, dtype=np.int64).reshape(self.npairs, 2) def get_pair_distances(self): """Returns all the distances corresponding to each pair of neighbors diff --git a/testsuite/MDAnalysisTests/lib/test_distances.py b/testsuite/MDAnalysisTests/lib/test_distances.py index cb531792291..b146c5f458c 100644 --- a/testsuite/MDAnalysisTests/lib/test_distances.py +++ b/testsuite/MDAnalysisTests/lib/test_distances.py @@ -24,6 +24,7 @@ import pytest import numpy as np from numpy.testing import assert_equal, assert_almost_equal +from itertools import combinations_with_replacement as comb import MDAnalysis from MDAnalysis.lib import distances @@ -926,6 +927,400 @@ def test_dihedrals(self, positions, backend): for val in [test1, test2, test3, test4, test5]: assert_almost_equal(ref, val, self.prec, err_msg="Min image in dihedral calculation failed") +class TestInputUnchanged(object): + """Tests ensuring that the following functions in MDAnalysis.lib.distances + do not alter their input coordinate arrays: + * distance_array + * self_distance_array + * capped_distance + * self_capped_distance + * transform_RtoS + * transform_StoR + * calc_bonds + * calc_angles + * calc_dihedrals + * apply_PBC + """ + + boxes = ([1.0, 1.0, 1.0, 90.0, 90.0, 90.0], # orthorhombic + [1.0, 1.0, 1.0, 80.0, 80.0, 80.0], # triclinic + None) # no PBC + + @staticmethod + @pytest.fixture() + def coords(): + # input coordinates, some outside the [1, 1, 1] box: + return [np.array([[0.1, 0.1, 0.1], [-0.9, -0.9, -0.9]], dtype=np.float32), + np.array([[0.1, 0.1, 1.9], [-0.9, -0.9, 0.9]], dtype=np.float32), + np.array([[0.1, 1.9, 1.9], [-0.9, 0.9, 0.9]], dtype=np.float32), + np.array([[0.1, 1.9, 0.1], [-0.9, 0.9, -0.9]], dtype=np.float32)] + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_input_unchanged_distance_array(self, coords, box, backend): + crds = coords[:2] + refs = [crd.copy() for crd in crds] + res = distances.distance_array(crds[0], crds[1], box=box, + backend=backend) + assert_equal(crds, refs) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_input_unchanged_self_distance_array(self, coords, box, backend): + crd = coords[0] + ref = crd.copy() + res = distances.self_distance_array(crd, box=box, backend=backend) + assert_equal(crd, ref) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('met', ["bruteforce", "pkdtree", "nsgrid", None]) + def test_input_unchanged_capped_distance(self, coords, box, met): + crds = coords[:2] + refs = [crd.copy() for crd in crds] + res = distances.capped_distance(crds[0], crds[1], max_cutoff=0.3, + box=box, method=met) + assert_equal(crds, refs) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('met', ["bruteforce", "pkdtree", "nsgrid", None]) + def test_input_unchanged_self_capped_distance(self, coords, box, met): + crd = coords[0] + ref = crd.copy() + r_cut = 0.25 + res = distances.self_capped_distance(crd, max_cutoff=r_cut, box=box, + method=met) + assert_equal(crd, ref) + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_input_unchanged_transform_RtoS_and_StoR(self, coords, box, backend): + crd = coords[0] + ref = crd.copy() + res = distances.transform_RtoS(crd, box, backend=backend) + assert_equal(crd, ref) + crd = res + ref = crd.copy() + res = distances.transform_StoR(crd, box, backend=backend) + assert_equal(crd, ref) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_input_unchanged_calc_bonds(self, coords, box, backend): + crds = coords[:2] + refs = [crd.copy() for crd in crds] + res = distances.calc_bonds(crds[0], crds[1], box=box, backend=backend) + assert_equal(crds, refs) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_input_unchanged_calc_angles(self, coords, box, backend): + crds = coords[:3] + refs = [crd.copy() for crd in crds] + res = distances.calc_angles(crds[0], crds[1], crds[2], box=box, + backend=backend) + assert_equal(crds, refs) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_input_unchanged_calc_dihedrals(self, coords, box, backend): + crds = coords + refs = [crd.copy() for crd in crds] + res = distances.calc_dihedrals(crds[0], crds[1], crds[2], crds[3], + box=box, backend=backend) + assert_equal(crds, refs) + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_input_unchanged_apply_PBC(self, coords, box, backend): + crd = coords[0] + ref = crd.copy() + res = distances.apply_PBC(crd, box, backend=backend) + assert_equal(crd, ref) + + +class TestEmptyInputCoordinates(object): + """Tests ensuring that the following functions in MDAnalysis.lib.distances + do not choke on empty input coordinate arrays: + * distance_array + * self_distance_array + * capped_distance + * self_capped_distance + * transform_RtoS + * transform_StoR + * calc_bonds + * calc_angles + * calc_dihedrals + * apply_PBC + """ + + max_cut = 0.25 # max_cutoff parameter for *capped_distance() + min_cut = 0.0 # optional min_cutoff parameter for *capped_distance() + + boxes = ([1.0, 1.0, 1.0, 90.0, 90.0, 90.0], # orthorhombic + [1.0, 1.0, 1.0, 80.0, 80.0, 80.0], # triclinic + None) # no PBC + + @staticmethod + @pytest.fixture() + def empty_coord(): + # empty coordinate array: + return np.empty((0, 3), dtype=np.float32) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_distance_array(self, empty_coord, box, backend): + res = distances.distance_array(empty_coord, empty_coord, box=box, + backend=backend) + assert_equal(res, np.empty((0, 0), dtype=np.float64)) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_self_distance_array(self, empty_coord, box, backend): + res = distances.self_distance_array(empty_coord, box=box, + backend=backend) + assert_equal(res, np.empty((0,), dtype=np.float64)) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('min_cut', [min_cut, None]) + @pytest.mark.parametrize('ret_dist', [False, True]) + @pytest.mark.parametrize('met', ["bruteforce", "pkdtree", "nsgrid", None]) + def test_empty_input_capped_distance(self, empty_coord, min_cut, box, met, + ret_dist): + res = distances.capped_distance(empty_coord, empty_coord, + max_cutoff=self.max_cut, + min_cutoff=min_cut, box=box, method=met, + return_distances=ret_dist) + if ret_dist: + assert_equal(res[0], np.empty((0, 2), dtype=np.int64)) + assert_equal(res[1], np.empty((0,), dtype=np.float64)) + else: + assert_equal(res, np.empty((0, 2), dtype=np.int64)) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('min_cut', [min_cut, None]) + @pytest.mark.parametrize('met', ["bruteforce", "pkdtree", "nsgrid", None]) + def test_empty_input_self_capped_distance(self, empty_coord, min_cut, box, + met): + res = distances.self_capped_distance(empty_coord, + max_cutoff=self.max_cut, + min_cutoff=min_cut, box=box, + method=met) + assert_equal(res[0], np.empty((0, 2), dtype=np.int64)) + assert_equal(res[1], np.empty((0,), dtype=np.float64)) + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_transform_RtoS(self, empty_coord, box, backend): + res = distances.transform_RtoS(empty_coord, box, backend=backend) + assert_equal(res, empty_coord) + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_transform_StoR(self, empty_coord, box, backend): + res = distances.transform_StoR(empty_coord, box, backend=backend) + assert_equal(res, empty_coord) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_calc_bonds(self, empty_coord, box, backend): + res = distances.calc_bonds(empty_coord, empty_coord, box=box, + backend=backend) + assert_equal(res, np.empty((0,), dtype=np.float64)) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_calc_angles(self, empty_coord, box, backend): + res = distances.calc_angles(empty_coord, empty_coord, empty_coord, + box=box, backend=backend) + assert_equal(res, np.empty((0,), dtype=np.float64)) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_calc_dihedrals(self, empty_coord, box, backend): + res = distances.calc_dihedrals(empty_coord, empty_coord, empty_coord, + empty_coord, box=box, backend=backend) + assert_equal(res, np.empty((0,), dtype=np.float64)) + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_empty_input_apply_PBC(self, empty_coord, box, backend): + res = distances.apply_PBC(empty_coord, box, backend=backend) + assert_equal(res, empty_coord) + + +class TestOutputTypes(object): + """Tests ensuring that the following functions in MDAnalysis.lib.distances + return results of the types stated in the docs: + * distance_array: + - numpy.ndarray (shape=(n, m), dtype=numpy.float64) + * self_distance_array: + - numpy.ndarray (shape=(n*(n-1)//2,), dtype=numpy.float64) + * capped_distance: + - numpy.ndarray (shape=(n, 2), dtype=numpy.int64) + - numpy.ndarray (shape=(n,), dtype=numpy.float64) (optional) + * self_capped_distance: + - numpy.ndarray (shape=(n, 2), dtype=numpy.int64) + - numpy.ndarray (shape=(n,), dtype=numpy.float64) + * transform_RtoS: + - numpy.ndarray (shape=input.shape, dtype=numpy.float32) + * transform_StoR: + - numpy.ndarray (shape=input.shape, dtype=numpy.float32) + * calc_bonds: + - numpy.ndarray (shape=(n,), dtype=numpy.float64) for at least one + shape (n,3) input, or numpy.float64 if all inputs are of shape (3,) + * calc_angles: + - numpy.ndarray (shape=(n,), dtype=numpy.float64) for at least one + shape (n,3) input, or numpy.float64 if all inputs are of shape (3,) + * calc_dihedrals: + - numpy.ndarray (shape=(n,), dtype=numpy.float64) for at least one + shape (n,3) input, or numpy.float64 for if all inputs are of + shape (3,) + * apply_PBC: + - numpy.ndarray (shape=input.shape, dtype=numpy.float32) + """ + max_cut = 0.25 # max_cutoff parameter for *capped_distance() + min_cut = 0.0 # optional min_cutoff parameter for *capped_distance() + + boxes = ([1.0, 1.0, 1.0, 90.0, 90.0, 90.0], # orthorhombic + [1.0, 1.0, 1.0, 80.0, 80.0, 80.0], # triclinic + None) # no PBC + + coords = [np.empty((0, 3), dtype=np.float32), # empty coord array + np.array([[0.1, 0.1, 0.1]], dtype=np.float32), # coord array + np.array([0.1, 0.1, 0.1], dtype=np.float32), # single coord + np.array([[-1.1, -1.1, -1.1]], dtype=np.float32)] # outside box + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('incoords', list(comb(coords, 2))) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_type_distance_array(self, incoords, box, backend): + res = distances.distance_array(*incoords, box=box, backend=backend) + assert type(res) == np.ndarray + assert res.shape == (incoords[0].shape[0] % 2, incoords[1].shape[0] % 2) + assert res.dtype.type == np.float64 + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('incoords', coords) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_type_self_distance_array(self, incoords, box, backend): + res = distances.self_distance_array(incoords, box=box, backend=backend) + assert type(res) == np.ndarray + assert res.shape == (0,) + assert res.dtype.type == np.float64 + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('min_cut', [min_cut, None]) + @pytest.mark.parametrize('ret_dist', [False, True]) + @pytest.mark.parametrize('incoords', list(comb(coords, 2))) + @pytest.mark.parametrize('met', ["bruteforce", "pkdtree", "nsgrid", None]) + def test_output_type_capped_distance(self, incoords, min_cut, box, met, + ret_dist): + res = distances.capped_distance(*incoords, max_cutoff=self.max_cut, + min_cutoff=min_cut, box=box, method=met, + return_distances=ret_dist) + if ret_dist: + pairs, dist = res + else: + pairs = res + assert type(pairs) == np.ndarray + assert pairs.dtype.type == np.int64 + assert pairs.ndim == 2 + assert pairs.shape[1] == 2 + if ret_dist: + assert type(dist) == np.ndarray + assert dist.dtype.type == np.float64 + assert dist.shape == (pairs.shape[0],) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('min_cut', [min_cut, None]) + @pytest.mark.parametrize('incoords', coords) + @pytest.mark.parametrize('met', ["bruteforce", "pkdtree", "nsgrid", None]) + def test_output_type_self_capped_distance(self, incoords, min_cut, box, + met): + pairs, dist = distances.self_capped_distance(incoords, + max_cutoff=self.max_cut, + min_cutoff=min_cut, + box=box, method=met) + assert type(pairs) == np.ndarray + assert type(dist) == np.ndarray + assert pairs.dtype.type == np.int64 + assert dist.dtype.type == np.float64 + assert pairs.ndim == 2 + assert pairs.shape[1] == 2 + assert dist.shape == (pairs.shape[0],) + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('incoords', coords) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_dtype_transform_RtoS(self, incoords, box, backend): + res = distances.transform_RtoS(incoords, box, backend=backend) + assert type(res) == np.ndarray + assert res.dtype.type == np.float32 + assert res.shape == incoords.shape + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('incoords', coords) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_dtype_transform_RtoS(self, incoords, box, backend): + res = distances.transform_RtoS(incoords, box, backend=backend) + assert type(res) == np.ndarray + assert res.dtype.type == np.float32 + assert res.shape == incoords.shape + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('incoords', + [2 * [coords[0]]] + list(comb(coords[1:], 2))) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_type_calc_bonds(self, incoords, box, backend): + res = distances.calc_bonds(*incoords, box=box, backend=backend) + maxdim = max([crd.ndim for crd in incoords]) + if maxdim == 1: + assert type(res) == np.float64 + else: + assert type(res) == np.ndarray + assert res.dtype.type == np.float64 + coord = [crd for crd in incoords if crd.ndim == maxdim][0] + assert res.shape == (coord.shape[0],) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('incoords', + [3 * [coords[0]]] + list(comb(coords[1:], 3))) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_type_calc_angles(self, incoords, box, backend): + res = distances.calc_angles(*incoords, box=box, backend=backend) + maxdim = max([crd.ndim for crd in incoords]) + if maxdim == 1: + assert type(res) == np.float64 + else: + assert type(res) == np.ndarray + assert res.dtype.type == np.float64 + coord = [crd for crd in incoords if crd.ndim == maxdim][0] + assert res.shape == (coord.shape[0],) + + @pytest.mark.parametrize('box', boxes) + @pytest.mark.parametrize('incoords', + [4 * [coords[0]]] + list(comb(coords[1:], 4))) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_type_calc_dihedrals(self, incoords, box, backend): + res = distances.calc_dihedrals(*incoords, box=box, backend=backend) + maxdim = max([crd.ndim for crd in incoords]) + if maxdim == 1: + assert type(res) == np.float64 + else: + assert type(res) == np.ndarray + assert res.dtype.type == np.float64 + coord = [crd for crd in incoords if crd.ndim == maxdim][0] + assert res.shape == (coord.shape[0],) + + @pytest.mark.parametrize('box', boxes[:2]) + @pytest.mark.parametrize('incoords', coords) + @pytest.mark.parametrize('backend', ['serial', 'openmp']) + def test_output_type_apply_PBC(self, incoords, box, backend): + res = distances.apply_PBC(incoords, box, backend=backend) + assert type(res) == np.ndarray + assert res.dtype.type == np.float32 + assert res.shape == incoords.shape + class TestDistanceBackendSelection(object): @staticmethod From 80560daa2fb582a5365ba1a9018d5411f91a604c Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Sun, 7 Oct 2018 21:37:55 -0500 Subject: [PATCH 450/455] made GSD unsupported in Windows (#2090) --- package/MDAnalysis/coordinates/GSD.py | 9 ++++++-- package/MDAnalysis/topology/GSDParser.py | 8 ++++++- package/setup.py | 29 +++++++++++++----------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/package/MDAnalysis/coordinates/GSD.py b/package/MDAnalysis/coordinates/GSD.py index 9db0bb3b77d..860790d763f 100644 --- a/package/MDAnalysis/coordinates/GSD.py +++ b/package/MDAnalysis/coordinates/GSD.py @@ -47,9 +47,11 @@ from __future__ import absolute_import, division import numpy as np -from . import base -import gsd.hoomd +import os +if os.name != 'nt': + import gsd.hoomd +from . import base class GSDReader(base.ReaderBase): """Reader for the GSD format. @@ -70,6 +72,9 @@ def __init__(self, filename, **kwargs): .. versionadded:: 0.17.0 """ + if os.name == 'nt': + raise NotImplementedError("GSD format not supported on Windows") + super(GSDReader, self).__init__(filename, **kwargs) self.filename = filename self.open_trajectory() diff --git a/package/MDAnalysis/topology/GSDParser.py b/package/MDAnalysis/topology/GSDParser.py index 0137b19068d..422c81820f3 100644 --- a/package/MDAnalysis/topology/GSDParser.py +++ b/package/MDAnalysis/topology/GSDParser.py @@ -52,7 +52,10 @@ """ from __future__ import absolute_import -import gsd.hoomd +import os +if os.name != 'nt': + # not supported on windows + import gsd.hoomd import numpy as np from . import guessers @@ -106,6 +109,9 @@ def parse(self, **kwargs): .. versionadded:: 0.17.0 """ + if os.name == 'nt': + raise NotImplementedError("GSD format not supported on Windows") + attrs = {} with gsd.hoomd.open(self.filename,mode='rb') as t : diff --git a/package/setup.py b/package/setup.py index b43edc3a94b..b67280bf552 100755 --- a/package/setup.py +++ b/package/setup.py @@ -511,6 +511,21 @@ def dynamic_author_list(): config = Config() exts, cythonfiles = extensions(config) + install_requires = [ + 'numpy>=1.10.4', + 'biopython>=1.71', + 'networkx>=1.0', + 'GridDataFormats>=0.4.0', + 'six>=1.4.0', + 'mmtf-python>=1.0.0', + 'joblib', + 'scipy>=1.0.0', + 'matplotlib>=1.5.1', + 'mock', + ] + if not os.name == 'nt': + install_requires.append('gsd>=1.4.0') + setup(name='MDAnalysis', version=RELEASE, description=('An object-oriented toolkit to analyze molecular dynamics ' @@ -545,19 +560,7 @@ def dynamic_author_list(): setup_requires=[ 'numpy>=1.10.4', ], - install_requires=[ - 'gsd>=1.4.0', - 'numpy>=1.10.4', - 'biopython>=1.71', - 'networkx>=1.0', - 'GridDataFormats>=0.4.0', - 'six>=1.4.0', - 'mmtf-python>=1.0.0', - 'joblib', - 'scipy>=1.0.0', - 'matplotlib>=1.5.1', - 'mock', - ], + install_requires=install_requires, # extras can be difficult to install through setuptools and/or # you might prefer to use the version available through your # packaging system From d37f87b9db93881c925848a19b6db7c63fb9e6f2 Mon Sep 17 00:00:00 2001 From: Oliver Beckstein Date: Mon, 8 Oct 2018 17:13:09 -0700 Subject: [PATCH 451/455] fixed Gowers2016 reference (#2094) - fix #2092 - also added explanation why we ask for both citations - references page is again in sync with https://www.mdanalysis.org/pages/citations/ - added note/link at the top to the duecredit section --- .../source/documentation_pages/references.rst | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/package/doc/sphinx/source/documentation_pages/references.rst b/package/doc/sphinx/source/documentation_pages/references.rst index c80c8a794b3..aa6f0cc484c 100644 --- a/package/doc/sphinx/source/documentation_pages/references.rst +++ b/package/doc/sphinx/source/documentation_pages/references.rst @@ -12,6 +12,16 @@ References ************ +MDAnalysis and the included algorithms are scientific software that +are described in academic publications. **Please cite these papers when you use +MDAnalysis in published work.** + +It is possible to :ref:`automatically generate a list of references +` for any program that uses +MDAnalysis. This list (in common reference manager formats) contains +the citations associated with the specific algorithms and libraries +that were used in the program. + Citations for the whole MDAnalysis library ========================================== @@ -19,6 +29,14 @@ Citations for the whole MDAnalysis library When using MDAnalysis in published work, please cite [Michaud-Agrawal2011]_ and [Gowers2016]_. +(We are currently asking you to cite *both* papers if at all possible +because the 2016 paper describes many updates to the original 2011 +paper and neither paper on its own provides a comprehensive +description of the library. We will publish a complete self-contained +paper with the upcoming 1.0 release of MDAnalysis, which will then +supersede these two citations.) + + .. [Michaud-Agrawal2011] N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. *J. Comput. Chem.* **32** (2011), @@ -28,7 +46,7 @@ When using MDAnalysis in published work, please cite Melo, S. L. Seyler, D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. `MDAnalysis: A Python package for the rapid analysis of molecular dynamics simulations`_. In S. Benthall and S. Rostrup, editors, - *Proceedings of the 15th Python in Science Conference*, pages 102 – 109, + *Proceedings of the 15th Python in Science Conference*, pages 98-105, Austin, TX, 2016. SciPy. .. _`10.1002/jcc.21787`: http://dx.doi.org/10.1002/jcc.21787 @@ -36,7 +54,7 @@ When using MDAnalysis in published work, please cite .. _`MDAnalysis: A Python package for the rapid analysis of molecular dynamics simulations`: http://conference.scipy.org/proceedings/scipy2016/oliver_beckstein.html - + .. _references-components: @@ -112,6 +130,8 @@ If you use the streamline visualization in .. _`10.1039/c3fd00145h`: https://doi.org/10.1039/c3fd00145h +.. _citations-using-duecredit: + Citations using Duecredit ========================= From 97db6d1742e3d16dbadf37f01f064821b6f66351 Mon Sep 17 00:00:00 2001 From: Richard Gowers Date: Mon, 8 Oct 2018 19:13:27 -0500 Subject: [PATCH 452/455] Added optional forces and velocities to MemoryReader (#2080) Universe.empty now creates a MemoryReader trajectory Removed DummyReader (it was buggy) added varying box size to MemoryReader Universe.transfer_to_memory now also transfer velocities and forces MemoryReader now always has array of dimensions fixes Issue #2081 #2076 #2077 #1041 --- package/CHANGELOG | 7 + package/MDAnalysis/coordinates/__init__.py | 1 - package/MDAnalysis/coordinates/dummy.py | 61 ------ package/MDAnalysis/coordinates/memory.py | 103 ++++++++++- package/MDAnalysis/core/universe.py | 86 +++++---- .../documentation_pages/coordinates/dummy.rst | 2 - .../coordinates_modules.rst | 1 - .../coordinates/test_memory.py | 174 ++++++++++++++++++ .../MDAnalysisTests/core/test_universe.py | 27 +++ 9 files changed, 356 insertions(+), 106 deletions(-) delete mode 100644 package/MDAnalysis/coordinates/dummy.py delete mode 100644 package/doc/sphinx/source/documentation_pages/coordinates/dummy.rst diff --git a/package/CHANGELOG b/package/CHANGELOG index acb0c32cbb5..70691ee318b 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -85,6 +85,9 @@ Enhancements * Performance improvements to make_whole (PR #1965) * Performance improvements to fragment finding (PR #2028) * Added user-defined boxes in density code (PR #2005) + * MemoryReader now can accept velocities and forces (PR #2080) + * Universe.transfer_to_memory now copies dimensions, velocities and forces + (where possible) (Issue #1041 PR #2080) Fixes * Rewind in the SingleFrameReader now reads the frame from the file (Issue #1929) @@ -111,6 +114,9 @@ Fixes center of the reference group (Issue #1795) * PCA analysis now uses start frame as reference frame rather than 0th frame (PR #2055) + * Fixed trajectory iteration from a MDAnalysis.Universe.empty (#2076) + * Fixed copies MemoryReader not linking to the underlying coordinate array + on initial Timestep (Issue #2081 PR #2080) Changes * TopologyAttrs are now statically typed (Issue #1876) @@ -136,6 +142,7 @@ Changes otherwise a ValueError is raised (PR #2055) * The quiet keyword has been removed and replaced with verbose (Issue #1975 PR #2055) + * MDAnalysis.Universe.empty now creates a MemoryReader trajectory (#2076 #2077) Deprecations * start/stop/step are deprecated in the initialization of Analysis classes. diff --git a/package/MDAnalysis/coordinates/__init__.py b/package/MDAnalysis/coordinates/__init__.py index 2706f492151..8b58f434bd3 100644 --- a/package/MDAnalysis/coordinates/__init__.py +++ b/package/MDAnalysis/coordinates/__init__.py @@ -748,4 +748,3 @@ class can choose an appropriate reader automatically. from . import MMTF from . import GSD from . import null -from . import dummy diff --git a/package/MDAnalysis/coordinates/dummy.py b/package/MDAnalysis/coordinates/dummy.py deleted file mode 100644 index d4ee963be3e..00000000000 --- a/package/MDAnalysis/coordinates/dummy.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding: utf-8 -*- -# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 -# -# MDAnalysis --- https://www.mdanalysis.org -# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors -# (see the file AUTHORS for the full list of names) -# -# Released under the GNU Public Licence, v2 or any higher version -# -# Please cite your use of MDAnalysis in published work: -# -# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, -# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. -# MDAnalysis: A Python package for the rapid analysis of molecular dynamics -# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th -# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy. -# -# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. -# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. -# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787 -# - -""" -Dummy coordinate reader -======================= - - -Classes -------- - -.. autoclass:: DummyReader - :members: - - -""" -from __future__ import absolute_import - - -import numpy as np - -from .base import SingleFrameReaderBase - - -class DummyReader(SingleFrameReaderBase): - """Basic Reader which does not read from any file - - .. versionadded:: 0.17.0 - """ - format = 'dummy' - - def __init__(self, n_atoms=None, velocities=False, forces=False): - self.n_atoms = n_atoms - self.filename = 'DummyReader' - self.n_frames = 1 - self._read_first_frame(velocities, forces) - self._transformations = [] - - def _read_first_frame(self, velocities=False, forces=False): - ts = self.ts = self._Timestep(self.n_atoms, positions=True, - velocities=velocities, forces=forces) - return ts diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index 617d4095f40..c03421a43cb 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -226,6 +226,17 @@ def _replace_positions_array(self, new): self.has_positions = True self._pos = new + def _replace_velocities_array(self, new): + self.has_velocities = True + self._velocities = new + + def _replace_forces_array(self, new): + self.has_forces = True + self._forces = new + + def _replace_dimensions(self, new): + self._unitcell = new + class MemoryReader(base.ProtoReader): """ @@ -243,7 +254,9 @@ class MemoryReader(base.ProtoReader): _Timestep = Timestep def __init__(self, coordinate_array, order='fac', - dimensions=None, dt=1, filename=None, **kwargs): + dimensions=None, dt=1, filename=None, + velocities=None, forces=None, + **kwargs): """ Parameters ---------- @@ -259,13 +272,20 @@ def __init__(self, coordinate_array, order='fac', dimensions: [A, B, C, alpha, beta, gamma] (optional) unitcell dimensions (*A*, *B*, *C*, *alpha*, *beta*, *gamma*) lengths *A*, *B*, *C* are in the MDAnalysis length unit (Ã…), and - angles are in degrees. + angles are in degrees. An array of dimensions can be given, + which must then be shape (nframes, 6) dt: float (optional) The time difference between frames (ps). If :attr:`time` is set, then `dt` will be ignored. filename: string (optional) The name of the file from which this instance is created. Set to ``None`` when created from an array + velocities : numpy.ndarray (optional) + Atom velocities. Must match shape of coordinate_array. Will share order + with coordinates. + forces : numpy.ndarray (optional) + Atom forces. Must match shape of coordinate_array Will share order + with coordinates Raises ------ @@ -281,7 +301,7 @@ def __init__(self, coordinate_array, order='fac', .. versionchanged:: 0.18.1 The input to the MemoryReader now must be a np.ndarray - + Added optional velocities and forces """ super(MemoryReader, self).__init__() @@ -292,8 +312,8 @@ def __init__(self, coordinate_array, order='fac', # passed is of shape (N, 3) and if it is, the coordiante array is # reshaped to (1, N, 3) try: - if len(coordinate_array.shape) == 2 and coordinate_array.shape[1] == 3: - coordinate_array = coordinate_array[np.newaxis, :, :] + if coordinate_array.ndim == 2 and coordinate_array.shape[1] == 3: + coordinate_array = coordinate_array[np.newaxis, :, :] except AttributeError as e: raise TypeError("The input has to be a numpy.ndarray that " "corresponds to the layout specified by the " @@ -305,6 +325,41 @@ def __init__(self, coordinate_array, order='fac', self.n_atoms = \ self.coordinate_array.shape[self.stored_order.find('a')] + if velocities is not None: + try: + velocities = np.asarray(velocities, dtype=np.float32) + except ValueError: + raise TypeError("'velocities' must be array-like got {}" + "".format(type(velocities))) + # if single frame, make into array of 1 frame + if velocities.ndim == 2: + velocities = velocities[np.newaxis, :, :] + if not velocities.shape == self.coordinate_array.shape: + raise ValueError('Velocities has wrong shape {} ' + 'to match coordinates {}' + ''.format(velocities.shape, + self.coordinate_array.shape)) + self.velocity_array = velocities.astype(np.float32, copy=False) + else: + self.velocity_array = None + + if forces is not None: + try: + forces = np.asarray(forces, dtype=np.float32) + except ValueError: + raise TypeError("'forces' must be array like got {}" + "".format(type(forces))) + if forces.ndim == 2: + forces = forces[np.newaxis, :, :] + if not forces.shape == self.coordinate_array.shape: + raise ValueError('Forces has wrong shape {} ' + 'to match coordinates {}' + ''.format(forces.shape, + self.coordinate_array.shape)) + self.force_array = forces.astype(np.float32, copy=False) + else: + self.force_array = None + provided_n_atoms = kwargs.pop("n_atoms", None) if (provided_n_atoms is not None and provided_n_atoms != self.n_atoms): @@ -315,8 +370,23 @@ def __init__(self, coordinate_array, order='fac', self.ts = self._Timestep(self.n_atoms, **kwargs) self.ts.dt = dt - if dimensions is not None: - self.ts.dimensions = dimensions + if dimensions is None: + dimensions = np.zeros((self.n_frames, 6), dtype=np.float64) + else: + try: + dimensions = np.asarray(dimensions, dtype=np.float64) + except ValueError: + raise TypeError("'dimensions' must be array-like got {}" + "".format(type(dimensions))) + if dimensions.shape == (6,): + # single box, tile this to trajectory length + # allows modifying the box of some frames + dimensions = np.tile(dimensions, (self.n_frames, 1)) + elif dimensions.shape != (self.n_frames, 6): + raise ValueError("Provided dimensions array has shape {}. " + "This must be a array of shape (6,) or " + "(n_frames, 6)".format(dimensions.shape)) + self.dimensions_array = dimensions self.ts.frame = -1 self.ts.time = -1 self._read_next_timestep() @@ -346,15 +416,23 @@ def parse_n_atoms(filename, order='fac', **kwargs): def copy(self): """Return a copy of this Memory Reader""" + vels = (self.velocity_array.copy() + if self.velocity_array is not None else None) + fors = (self.force_array.copy() + if self.force_array is not None else None) + dims = self.dimensions_array.copy() + new = self.__class__( self.coordinate_array.copy(), order=self.stored_order, - dimensions=self.ts.dimensions, + dimensions=dims, + velocities=vels, + forces=fors, dt=self.ts.dt, filename=self.filename, ) new[self.ts.frame] - new.ts = self.ts.copy() + for auxname, auxread in self._auxs.items(): new.add_auxiliary(auxname, auxread.copy()) # since transformations are already applied to the whole trajectory @@ -483,8 +561,13 @@ def _read_next_timestep(self, ts=None): [self.ts.frame] + [slice(None)]*(2-f_index)) ts._replace_positions_array(self.coordinate_array[basic_slice]) + ts._replace_dimensions(self.dimensions_array[self.ts.frame]) + if self.velocity_array is not None: + ts._replace_velocities_array(self.velocity_array[basic_slice]) + if self.force_array is not None: + ts._replace_forces_array(self.force_array[basic_slice]) - ts.time = self.ts.frame*self.dt + ts.time = self.ts.frame * self.dt return ts def _read_frame(self, i): diff --git a/package/MDAnalysis/core/universe.py b/package/MDAnalysis/core/universe.py index 139b0a02fd0..522f2e1c971 100644 --- a/package/MDAnalysis/core/universe.py +++ b/package/MDAnalysis/core/universe.py @@ -417,6 +417,10 @@ def empty(cls, n_atoms, n_residues=None, n_segments=None, Useful for building a Universe without requiring existing files, for example for system building. + If `trajectory` is set to True, a + :class:`MDAnalysis.coordinates.memory.MemoryReader` will be + attached to the Universe. + Parameters ---------- n_atoms : int @@ -425,17 +429,19 @@ def empty(cls, n_atoms, n_residues=None, n_segments=None, number of Residues in the Universe, defaults to 1 n_segments : int, optional number of Segments in the Universe, defaults to 1 - atom_resindex : numpy.array, optional - mapping of atoms to residues - residue_segindex : numpy.array, optional + atom_resindex : array like, optional + mapping of atoms to residues, e.g. with 6 atoms, + `atom_resindex=[0, 0, 1, 1, 2, 2]` would put 2 atoms + into each of 3 residues. + residue_segindex : array like, optional mapping of residues to segments trajectory : bool, optional - if True, attaches a dummy reader to the Universe, therefore + if True, attaches a :class:`MDAnalysis.coordinates.memory.MemoryReader` allowing coordinates to be set and written. Default is False velocities : bool, optional - include velocities in the dummy Reader + include velocities in the :class:`MDAnalysis.coordinates.memory.MemoryReader` forces : bool, optional - include forces in the dummy Reader + include forces in the :class:`MDAnalysis.coordinates.memory.MemoryReader` Returns ------- @@ -453,6 +459,8 @@ def empty(cls, n_atoms, n_residues=None, n_segments=None, >>> u.add_TopologyAttr('masses') .. versionadded:: 0.17.0 + .. versionchanged:: 0.19.0 + The attached Reader when trajectory=True is now a MemoryReader """ if n_residues is None: n_residues = 1 @@ -477,9 +485,15 @@ def empty(cls, n_atoms, n_residues=None, n_segments=None, u = cls(top) if trajectory: - u.trajectory = get_reader_for('', format='dummy')( - n_atoms=n_atoms, - velocities=velocities, forces=forces) + coords = np.zeros((1, n_atoms, 3), dtype=np.float32) + dims = np.zeros(6, dtype=np.float64) + vels = np.zeros_like(coords) if velocities else None + forces = np.zeros_like(coords) if forces else None + + # grab and attach a MemoryReader + u.trajectory = get_reader_for(coords)( + coords, order='fac', n_atoms=n_atoms, + dimensions=dims, velocities=vels, forces=forces) return u @@ -627,26 +641,33 @@ def transfer_to_memory(self, start=None, stop=None, step=None, from ..coordinates.memory import MemoryReader if not isinstance(self.trajectory, MemoryReader): - # Try to extract coordinates using Timeseries object - # This is significantly faster, but only implemented for certain - # trajectory file formats - try: - coordinates = self.trajectory.timeseries( - self.atoms, start=start, stop=stop, step=step, order='fac') - # if the Timeseries extraction fails, - # fall back to a slower approach - except AttributeError: - n_frames = len(range( - *self.trajectory.check_slice_indices(start, stop, step) - )) - pm_format = '{step}/{numsteps} frames copied to memory (frame {frame})' - pm = ProgressMeter(n_frames, interval=1, - verbose=verbose, format=pm_format) - coordinates = [] # TODO: use pre-allocated array - for i, ts in enumerate(self.trajectory[start:stop:step]): - coordinates.append(np.copy(ts.positions)) - pm.echo(i, frame=ts.frame) - coordinates = np.array(coordinates) + n_frames = len(range( + *self.trajectory.check_slice_indices(start, stop, step) + )) + n_atoms = len(self.atoms) + pm_format = '{step}/{numsteps} frames copied to memory (frame {frame})' + pm = ProgressMeter(n_frames, interval=1, + verbose=verbose, format=pm_format) + coordinates = np.zeros((n_frames, n_atoms, 3), dtype=np.float32) + ts = self.trajectory.ts + has_vels = ts.has_velocities + has_fors = ts.has_forces + has_dims = ts.dimensions is not None + + velocities = np.zeros_like(coordinates) if has_vels else None + forces = np.zeros_like(coordinates) if has_fors else None + dimensions = (np.zeros((n_frames, 6), dtype=np.float64) + if has_dims else None) + + for i, ts in enumerate(self.trajectory[start:stop:step]): + np.copyto(coordinates[i], ts.positions) + if has_vels: + np.copyto(velocities[i], ts.velocities) + if has_fors: + np.copyto(forces[i], ts.forces) + if has_dims: + np.copyto(dimensions[i], ts.dimensions) + pm.echo(i, frame=ts.frame) # Overwrite trajectory in universe with an MemoryReader # object, to provide fast access and allow coordinates @@ -655,9 +676,12 @@ def transfer_to_memory(self, start=None, stop=None, step=None, step = 1 self.trajectory = MemoryReader( coordinates, - dimensions=self.trajectory.ts.dimensions, + dimensions=dimensions, dt=self.trajectory.ts.dt * step, - filename=self.trajectory.filename) + filename=self.trajectory.filename, + velocities=velocities, + forces=forces, + ) # python 2 doesn't allow an efficient splitting of kwargs in function # argument signatures. diff --git a/package/doc/sphinx/source/documentation_pages/coordinates/dummy.rst b/package/doc/sphinx/source/documentation_pages/coordinates/dummy.rst deleted file mode 100644 index 7f0e874a9cf..00000000000 --- a/package/doc/sphinx/source/documentation_pages/coordinates/dummy.rst +++ /dev/null @@ -1,2 +0,0 @@ -.. automodule:: MDAnalysis.coordinates.dummy - :members: diff --git a/package/doc/sphinx/source/documentation_pages/coordinates_modules.rst b/package/doc/sphinx/source/documentation_pages/coordinates_modules.rst index 359719e3330..e81313985e3 100644 --- a/package/doc/sphinx/source/documentation_pages/coordinates_modules.rst +++ b/package/doc/sphinx/source/documentation_pages/coordinates_modules.rst @@ -41,7 +41,6 @@ provide the format in the keyword argument *format* to coordinates/TRZ coordinates/memory coordinates/null - coordinates/dummy .. rubric:: Coordinate core modules diff --git a/testsuite/MDAnalysisTests/coordinates/test_memory.py b/testsuite/MDAnalysisTests/coordinates/test_memory.py index 8188c688101..0dfc0e643ef 100644 --- a/testsuite/MDAnalysisTests/coordinates/test_memory.py +++ b/testsuite/MDAnalysisTests/coordinates/test_memory.py @@ -200,3 +200,177 @@ def test_position_assignation(self, reader): reader.ts.positions = new_positions reader[0] assert_almost_equal(reader.ts.positions, new_positions) + + +class TestMemoryReaderVelsForces(object): + @staticmethod + @pytest.fixture(params=['2d', '3d']) + def ref_pos(request): + if request.param == '2d': + return np.arange(30).reshape(10, 3) + elif request.param == '3d': + return np.arange(30).reshape(1, 10, 3) + + @staticmethod + @pytest.fixture(params=['2d', '3d']) + def ref_vels(request): + if request.param == '2d': + return np.arange(30).reshape(10, 3) + 100 + elif request.param == '3d': + return np.arange(30).reshape(1, 10, 3) + 100 + + @staticmethod + @pytest.fixture(params=['2d', '3d']) + def ref_forces(request): + if request.param == '2d': + return np.arange(30).reshape(10, 3) + 1000 + elif request.param == '3d': + return np.arange(30).reshape(1, 10, 3) + 1000 + + @staticmethod + def assert_equal_dims(arr1, arr2): + if arr2.ndim == 3: + assert_equal(arr1, arr2[0]) + elif arr2.ndim == 2: + assert_equal(arr1, arr2) + + def test_velocities(self, ref_pos, ref_vels): + mr = MemoryReader(ref_pos, + velocities=ref_vels) + + assert mr.ts.has_velocities + self.assert_equal_dims(mr.ts.velocities, ref_vels) + assert not mr.ts.has_forces + + def test_forces(self, ref_pos, ref_forces): + mr = MemoryReader(ref_pos, + forces=ref_forces) + + assert not mr.ts.has_velocities + assert mr.ts.has_forces + self.assert_equal_dims(mr.ts.forces, ref_forces) + + def test_both(self, ref_pos, ref_vels, ref_forces): + mr = MemoryReader(ref_pos, + velocities=ref_vels, + forces=ref_forces) + assert mr.ts.has_velocities + self.assert_equal_dims(mr.ts.velocities, ref_vels) + assert mr.ts.has_forces + self.assert_equal_dims(mr.ts.forces, ref_forces) + + @pytest.mark.parametrize('param', ['velocities', 'forces']) + def test_wrongshape(self, ref_pos, param): + with pytest.raises(ValueError): + mr = MemoryReader(ref_pos, **{param: np.zeros((3, 2, 1))}) + + +class TestDimensions(object): + @staticmethod + @pytest.fixture + def ref_pos(): + return np.arange(270).reshape(3, 30, 3) + + @staticmethod + @pytest.fixture + def ref_box(): + return np.arange(18).reshape(3, 6) + + def test_single_box(self, ref_pos): + box = np.array([3, 4, 5, 90, 90, 90]) + + mr = MemoryReader(ref_pos, dimensions=box) + + for ts in mr: + assert_equal(ts.dimensions, box) + + def test_varying_box(self, ref_pos, ref_box): + mr = MemoryReader(ref_pos, dimensions=ref_box) + + for i, ts in enumerate(mr): + assert_equal(ts.dimensions, ref_box[i]) + + def test_wrong_length(self, ref_pos): + bad_box = np.arange(12).reshape(2, 6) + + with pytest.raises(ValueError): + mr = MemoryReader(ref_pos, dimensions=bad_box) + + def test_wrong_shape(self, ref_pos): + bad_box = np.arange(15).reshape(3, 5) + + with pytest.raises(ValueError): + mr = MemoryReader(ref_pos, dimensions=bad_box) + + +class TestMemoryReaderModifications(object): + # check that modifying MR things behaves as expected + # in general, modifying the Timestep should be *permanent* + # this is unlike other Readers! + n_atoms = 10 + n_frames = 4 + + @pytest.fixture() + def mr_reader(self): + pos = np.arange(self.n_frames * self.n_atoms * 3).reshape( + self.n_frames, self.n_atoms, 3) + vel = np.arange(self.n_frames * self.n_atoms * 3).reshape( + self.n_frames, self.n_atoms, 3) + 200 + frc = np.arange(self.n_frames * self.n_atoms * 3).reshape( + self.n_frames, self.n_atoms, 3) + 400 + box = np.arange(self.n_frames * 6).reshape(self.n_frames, 6) + 600 + + return MemoryReader(pos, + velocities=vel, + forces=frc, + dimensions=box) + + @pytest.fixture() + def mr_universe(self, mr_reader): + u = mda.Universe.empty(self.n_atoms) + u.trajectory = mr_reader + + return u + + @pytest.mark.parametrize('attr', ['positions', 'velocities', 'forces', 'dimensions']) + def test_copying(self, mr_reader, attr): + mr2 = mr_reader.copy() + # update the attribute + ts = mr2.ts + setattr(ts, attr, 7) + # check the change worked + assert_almost_equal(getattr(ts, attr), 7) + assert ts.positions.shape == (self.n_atoms, 3) + assert ts.velocities.shape == (self.n_atoms, 3) + assert ts.forces.shape == (self.n_atoms, 3) + assert ts.dimensions.shape == (6,) + # move the Reader around, forcing updates of ts + ts = mr2[2] + ts = mr2[0] + # check our old change is still there + assert_almost_equal(getattr(ts, attr), 7) + + @pytest.mark.parametrize('attr', ['positions', 'velocities', 'forces', 'dimensions']) + def test_attr_set(self, mr_universe, attr): + # same as above, but via a Universe/AtomGroup + u = mr_universe + ts = u.trajectory[0] + + setattr(ts, attr, 7) + + assert_almost_equal(getattr(ts, attr), 7) + + ts = u.trajectory[2] + ts = u.trajectory[0] + + assert_almost_equal(getattr(ts, attr), 7) + assert u.atoms.positions.shape == (self.n_atoms, 3) + assert u.atoms.velocities.shape == (self.n_atoms, 3) + assert u.atoms.forces.shape == (self.n_atoms, 3) + assert u.atoms.dimensions.shape == (6,) + + @pytest.mark.parametrize('attr', ['velocities', 'forces', 'dimensions']) + def test_non_numpy_arr(self, attr): + with pytest.raises(TypeError): + mr = MemoryReader(np.zeros((10, 30, 3)), + **{attr: 'not an array'}) diff --git a/testsuite/MDAnalysisTests/core/test_universe.py b/testsuite/MDAnalysisTests/core/test_universe.py index ceccbd752d2..fe3672065e3 100644 --- a/testsuite/MDAnalysisTests/core/test_universe.py +++ b/testsuite/MDAnalysisTests/core/test_universe.py @@ -690,3 +690,30 @@ def test_no_segindex_warning(self): with pytest.warns(UserWarning): u = mda.Universe.empty(n_atoms=10, n_residues=2, n_segments=1, atom_resindex=res) + + def test_trajectory(self): + u = mda.Universe.empty(10, trajectory=True) + + assert len(u.atoms) == 10 + assert u.atoms.positions.shape == (10, 3) + + def test_trajectory_iteration(self): + u = mda.Universe.empty(10, trajectory=True) + + assert len(u.trajectory) == 1 + timesteps =[] + for ts in u.trajectory: + timesteps.append(ts.frame) + assert len(timesteps) == 1 + + def test_velocities(self): + u = mda.Universe.empty(10, trajectory=True, velocities=True) + + assert u.atoms.positions.shape == (10, 3) + assert u.atoms.velocities.shape == (10, 3) + + def test_forces(self): + u = mda.Universe.empty(10, trajectory=True, forces=True) + + assert u.atoms.positions.shape == (10, 3) + assert u.atoms.forces.shape == (10, 3) From fc9e5d3825bede8799b5cf44c1fb17dc03168e71 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 9 Oct 2018 11:10:38 -0500 Subject: [PATCH 453/455] finished version 0.19.0 --- package/CHANGELOG | 4 ++-- package/MDAnalysis/analysis/density.py | 2 +- package/MDAnalysis/analysis/dihedrals.py | 2 +- package/MDAnalysis/coordinates/LAMMPS.py | 2 +- package/MDAnalysis/coordinates/PDB.py | 2 +- package/MDAnalysis/coordinates/memory.py | 2 +- package/MDAnalysis/core/groups.py | 5 +++-- package/MDAnalysis/core/topologyobjects.py | 8 ++++---- package/MDAnalysis/topology/LAMMPSParser.py | 2 +- package/MDAnalysis/topology/TOPParser.py | 2 +- package/MDAnalysis/version.py | 2 +- package/setup.py | 2 +- testsuite/CHANGELOG | 4 ++-- testsuite/MDAnalysisTests/__init__.py | 2 +- testsuite/setup.py | 2 +- 15 files changed, 22 insertions(+), 21 deletions(-) diff --git a/package/CHANGELOG b/package/CHANGELOG index 70691ee318b..f360f38d4c4 100644 --- a/package/CHANGELOG +++ b/package/CHANGELOG @@ -13,11 +13,11 @@ The rules for this file: * release numbers follow "Semantic Versioning" http://semver.org ------------------------------------------------------------------------------ -??/??/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, +10/09/18 tylerjereddy, richardjgowers, palnabarun, orbeckst, kain88-de, zemanj, VOD555, davidercruz, jbarnoud, ayushsuhane, hfmull, micaela-matta, sebastien.buchoux, arm61, p-j-smith, IAlibay - * 0.18.1 + * 0.19.0 Enhancements * Added bond/angle/dihedral reading in PARM7 TOPParser (PR #2052) diff --git a/package/MDAnalysis/analysis/density.py b/package/MDAnalysis/analysis/density.py index b9a71deb340..e384e6b4b38 100644 --- a/package/MDAnalysis/analysis/density.py +++ b/package/MDAnalysis/analysis/density.py @@ -682,7 +682,7 @@ def density_from_Universe(universe, delta=1.0, atomselection='name OH2', (It should be noted that the `padding` keyword is not used when a user defined grid is assigned). - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 *gridcenter*, *xdim*, *ydim* and *zdim* keywords added to allow for user defined boxes .. versionchanged:: 0.13.0 diff --git a/package/MDAnalysis/analysis/dihedrals.py b/package/MDAnalysis/analysis/dihedrals.py index 872801de604..71360709a7e 100644 --- a/package/MDAnalysis/analysis/dihedrals.py +++ b/package/MDAnalysis/analysis/dihedrals.py @@ -26,7 +26,7 @@ :Year: 2018 :Copyright: GNU Public License v2 -.. versionadded:: 0.18.1 +.. versionadded:: 0.19.0 This module contains classes for calculating dihedral angles for a given set of atoms or residues. This can be done for selected frames or whole trajectories. diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index 0d138bf9032..ce35656c437 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -462,7 +462,7 @@ class DumpReader(base.ReaderBase): Will automatically convert positions from their scaled/fractional representation to their real values. - .. versionadded:: 0.18.1 + .. versionadded:: 0.19.0 """ format = 'LAMMPSDUMP' diff --git a/package/MDAnalysis/coordinates/PDB.py b/package/MDAnalysis/coordinates/PDB.py index a084b403626..83f9b504f00 100644 --- a/package/MDAnalysis/coordinates/PDB.py +++ b/package/MDAnalysis/coordinates/PDB.py @@ -1002,7 +1002,7 @@ def MODEL(self, modelnumber): .. _MODEL: http://www.wwpdb.org/documentation/file-format-content/format32/sect9.html#MODEL - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 Maximum model number is enforced. """ diff --git a/package/MDAnalysis/coordinates/memory.py b/package/MDAnalysis/coordinates/memory.py index c03421a43cb..ef11bde65d7 100644 --- a/package/MDAnalysis/coordinates/memory.py +++ b/package/MDAnalysis/coordinates/memory.py @@ -299,7 +299,7 @@ def __init__(self, coordinate_array, order='fac', .. _`#1041`: https://github.com/MDAnalysis/mdanalysis/issues/1041 - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 The input to the MemoryReader now must be a np.ndarray Added optional velocities and forces """ diff --git a/package/MDAnalysis/core/groups.py b/package/MDAnalysis/core/groups.py index 12c2e263fe6..18afdf0a62a 100644 --- a/package/MDAnalysis/core/groups.py +++ b/package/MDAnalysis/core/groups.py @@ -2361,8 +2361,9 @@ def select_atoms(self, sel, *othersel, **selgroups): .. versionchanged:: 0.16.0 Updating selections now possible by setting the `updating` argument. .. versionchanged:: 0.17.0 Added *moltype* and *molnum* selections. - .. versionchanged:: 0.18.1 Added strict type checking for passed groups. - .. versionchanged:: 0.19.0 Added periodic kwarg (default True) + .. versionchanged:: 0.19.0 + Added strict type checking for passed groups. + Added periodic kwarg (default True) """ # once flags removed, replace with default=True periodic = selgroups.pop('periodic', flags['use_periodic_selections']) diff --git a/package/MDAnalysis/core/topologyobjects.py b/package/MDAnalysis/core/topologyobjects.py index f57e3346dfe..213d1df2d80 100644 --- a/package/MDAnalysis/core/topologyobjects.py +++ b/package/MDAnalysis/core/topologyobjects.py @@ -196,7 +196,7 @@ def length(self, pbc=True): .. versionchanged:: 0.11.0 Added pbc keyword - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 Changed default of pbc to True """ box = self.universe.dimensions if pbc else None @@ -236,7 +236,7 @@ def angle(self, pbc=True): .. versionadded:: 0.9.0 .. versionchanged:: 0.17.0 Fixed angles close to 180 giving NaN - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 Added pbc keyword, default True """ box = self.universe.dimensions if pbc else None @@ -285,7 +285,7 @@ def dihedral(self, pbc=True): 4 decimals (and is only tested to 3 decimals). .. versionadded:: 0.9.0 - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 Added pbc keyword, default True """ box = self.universe.dimensions if pbc else None @@ -518,7 +518,7 @@ class TopologyGroup(object): .. versionchanged:: 0.11.0 Added `values` method to return the size of each object in this group Deprecated selectBonds method in favour of select_bonds - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 Empty TopologyGroup now returns correctly shaped empty array via indices property and to_indices() """ diff --git a/package/MDAnalysis/topology/LAMMPSParser.py b/package/MDAnalysis/topology/LAMMPSParser.py index caa8a9ab73c..b2a9bd1f435 100644 --- a/package/MDAnalysis/topology/LAMMPSParser.py +++ b/package/MDAnalysis/topology/LAMMPSParser.py @@ -585,7 +585,7 @@ class LammpsDumpParser(TopologyReaderBase): Only reads atom ids. Sets all masses to 1.0. - .. versionadded:: 0.18.1 + .. versionadded:: 0.19.0 """ format = 'LAMMPSDUMP' diff --git a/package/MDAnalysis/topology/TOPParser.py b/package/MDAnalysis/topology/TOPParser.py index 4c985427155..a5c5926fb56 100644 --- a/package/MDAnalysis/topology/TOPParser.py +++ b/package/MDAnalysis/topology/TOPParser.py @@ -143,7 +143,7 @@ class TOPParser(TopologyReaderBase): .. versionchanged:: 0.7.6 parses both amber10 and amber12 formats - .. versionchanged:: 0.18.1 + .. versionchanged:: 0.19.0 parses bonds, angles, dihedrals, and impropers """ format = ['TOP', 'PRMTOP', 'PARM7'] diff --git a/package/MDAnalysis/version.py b/package/MDAnalysis/version.py index c12981b3c5d..9efaa6bff50 100644 --- a/package/MDAnalysis/version.py +++ b/package/MDAnalysis/version.py @@ -66,4 +66,4 @@ # e.g. with lib.log #: Release of MDAnalysis as a string, using `semantic versioning`_. -__version__ = "0.18.1-dev" # NOTE: keep in sync with RELEASE in setup.py +__version__ = "0.19.0" # NOTE: keep in sync with RELEASE in setup.py diff --git a/package/setup.py b/package/setup.py index b67280bf552..dfda3260718 100755 --- a/package/setup.py +++ b/package/setup.py @@ -67,7 +67,7 @@ # NOTE: keep in sync with MDAnalysis.__version__ in version.py -RELEASE = "0.18.1-dev" +RELEASE = "0.19.0" is_release = 'dev' not in RELEASE diff --git a/testsuite/CHANGELOG b/testsuite/CHANGELOG index 2005a6397b7..da86b840aa7 100644 --- a/testsuite/CHANGELOG +++ b/testsuite/CHANGELOG @@ -13,8 +13,8 @@ Also see https://github.com/MDAnalysis/mdanalysis/wiki/MDAnalysisTests and https://github.com/MDAnalysis/mdanalysis/wiki/UnitTests ------------------------------------------------------------------------------ -mm/dd/18 orbeckst, arm61 - * 0.18.1 +10/09/18 orbeckst, arm61 + * 0.19.0 - skip tests for duecredit when duecredit is not installed (#1906) - updated meta data for PyPi and updated README and INSTALL - added test for fix to issue #1897 diff --git a/testsuite/MDAnalysisTests/__init__.py b/testsuite/MDAnalysisTests/__init__.py index 4ad9d92fdf2..24b83c1ac42 100644 --- a/testsuite/MDAnalysisTests/__init__.py +++ b/testsuite/MDAnalysisTests/__init__.py @@ -97,7 +97,7 @@ logger = logging.getLogger("MDAnalysisTests.__init__") # keep in sync with RELEASE in setup.py -__version__ = "0.18.1-dev" +__version__ = "0.19.0" try: from MDAnalysisTests.authors import __authors__ except ImportError: diff --git a/testsuite/setup.py b/testsuite/setup.py index 15912d67843..14a594c4626 100755 --- a/testsuite/setup.py +++ b/testsuite/setup.py @@ -132,7 +132,7 @@ def dynamic_author_list(): warnings.warn('Cannot write the list of authors.') # this must be in-sync with MDAnalysis - RELEASE = "0.18.1-dev" + RELEASE = "0.19.0" with open("README") as summary: LONG_DESCRIPTION = summary.read() From bd3ff7797d9a3e5b1e4af41921c7e730e9ced50f Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 9 Oct 2018 12:17:21 -0500 Subject: [PATCH 454/455] fixed compilation of cpp sources --- package/setup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package/setup.py b/package/setup.py index dfda3260718..108445f9d0e 100755 --- a/package/setup.py +++ b/package/setup.py @@ -289,6 +289,7 @@ def extensions(config): print('Will not attempt to use Cython.') source_suffix = '.pyx' if use_cython else '.c' + cpp_source_suffix = '.pyx' if use_cython else '.cpp' # The callable is passed so that it is only evaluated at install time. @@ -347,14 +348,14 @@ def extensions(config): define_macros=define_macros, extra_compile_args=extra_compile_args) cutil = MDAExtension('MDAnalysis.lib._cutil', - sources=['MDAnalysis/lib/_cutil' + source_suffix], + sources=['MDAnalysis/lib/_cutil' + cpp_source_suffix], language='c++', libraries=mathlib, include_dirs=include_dirs + ['MDAnalysis/lib/include'], define_macros=define_macros, extra_compile_args=cpp_extra_compile_args) augment = MDAExtension('MDAnalysis.lib._augment', - sources=['MDAnalysis/lib/_augment' + source_suffix], + sources=['MDAnalysis/lib/_augment' + cpp_source_suffix], language='c++', include_dirs=include_dirs, define_macros=define_macros, @@ -381,7 +382,7 @@ def extensions(config): define_macros=define_macros, extra_compile_args=extra_compile_args) nsgrid = MDAExtension('MDAnalysis.lib.nsgrid', - ['MDAnalysis/lib/nsgrid' + source_suffix], + ['MDAnalysis/lib/nsgrid' + cpp_source_suffix], include_dirs=include_dirs, language='c++', define_macros=define_macros, From d9e58f23eb5b0855deabc20e3aa251ba0e0ef8a2 Mon Sep 17 00:00:00 2001 From: richardjgowers Date: Tue, 9 Oct 2018 12:19:27 -0500 Subject: [PATCH 455/455] Updated c/cpp sources for 0.19 --- .../analysis/encore/clustering/affinityprop.c | 493 +- package/MDAnalysis/analysis/encore/cutils.c | 493 +- .../stochasticproxembed.c | 493 +- package/MDAnalysis/lib/_augment.cpp | 27749 +++++++++++++ package/MDAnalysis/lib/_cutil.cpp | 28436 +++++++++++++ package/MDAnalysis/lib/c_distances.c | 4698 ++- package/MDAnalysis/lib/c_distances_openmp.c | 506 +- package/MDAnalysis/lib/formats/cython_util.c | 496 +- package/MDAnalysis/lib/formats/libdcd.c | 3788 +- package/MDAnalysis/lib/formats/libmdaxdr.c | 496 +- package/MDAnalysis/lib/nsgrid.cpp | 34155 ++++++++++++++++ package/MDAnalysis/lib/qcprot.c | 1410 +- 12 files changed, 97157 insertions(+), 6056 deletions(-) create mode 100644 package/MDAnalysis/lib/_augment.cpp create mode 100644 package/MDAnalysis/lib/_cutil.cpp create mode 100644 package/MDAnalysis/lib/nsgrid.cpp diff --git a/package/MDAnalysis/analysis/encore/clustering/affinityprop.c b/package/MDAnalysis/analysis/encore/clustering/affinityprop.c index 6d9ae915199..b282110f633 100644 --- a/package/MDAnalysis/analysis/encore/clustering/affinityprop.c +++ b/package/MDAnalysis/analysis/encore/clustering/affinityprop.c @@ -1,11 +1,11 @@ -/* Generated by Cython 0.28.2 */ +/* Generated by Cython 0.28.5 */ /* BEGIN: Cython Metadata { "distutils": { "depends": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h", "MDAnalysis/analysis/encore/clustering/include/ap.h" ], "extra_compile_args": [ @@ -15,7 +15,7 @@ "-funroll-loops" ], "include_dirs": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include", "MDAnalysis/analysis/encore/clustering/include" ], "libraries": [ @@ -38,7 +38,7 @@ END: Cython Metadata */ #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else -#define CYTHON_ABI "0_28_2" +#define CYTHON_ABI "0_28_5" #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof @@ -484,6 +484,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -681,7 +682,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -789,7 +790,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -863,7 +864,7 @@ typedef struct { } __Pyx_BufFmt_Context; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -872,7 +873,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -881,7 +882,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -890,7 +891,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -899,7 +900,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -908,7 +909,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -917,7 +918,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -926,7 +927,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -935,7 +936,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -944,7 +945,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -953,7 +954,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -962,7 +963,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -971,7 +972,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -980,7 +981,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -989,7 +990,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -998,7 +999,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1007,7 +1008,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1016,7 +1017,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1025,7 +1026,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1034,7 +1035,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1043,7 +1044,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1078,7 +1079,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do /*--- Type declarations ---*/ -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1087,7 +1088,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1096,7 +1097,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1105,7 +1106,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -3909,7 +3910,7 @@ static PyObject *__pyx_pf_10MDAnalysis_8analysis_6encore_10clustering_12affinity return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -3957,7 +3958,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -3966,7 +3967,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -3975,7 +3976,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -3984,7 +3985,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3998,7 +3999,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -4009,7 +4010,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4018,7 +4019,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -4031,7 +4032,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4040,7 +4041,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4054,7 +4055,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -4065,7 +4066,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4074,7 +4075,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -4087,7 +4088,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4096,7 +4097,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -4105,7 +4106,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -4114,7 +4115,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -4124,7 +4125,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -4133,7 +4134,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -4142,7 +4143,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -4154,7 +4155,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -4163,7 +4164,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -4173,7 +4174,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -4183,7 +4184,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -4193,7 +4194,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -4204,7 +4205,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -4213,7 +4214,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -4222,7 +4223,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -4231,7 +4232,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -4240,7 +4241,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -4252,7 +4253,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -4265,7 +4266,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -4275,7 +4276,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -4285,7 +4286,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4305,7 +4306,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -4322,7 +4323,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4331,7 +4332,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4344,7 +4345,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4353,7 +4354,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -4365,7 +4366,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -4376,7 +4377,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -4387,7 +4388,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -4398,7 +4399,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -4409,7 +4410,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -4420,7 +4421,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -4431,7 +4432,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -4442,7 +4443,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -4453,7 +4454,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -4464,7 +4465,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -4475,7 +4476,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -4486,7 +4487,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -4497,7 +4498,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -4508,7 +4509,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -4519,7 +4520,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -4530,7 +4531,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -4542,7 +4543,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -4563,7 +4564,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -4572,7 +4573,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -4582,7 +4583,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -4591,7 +4592,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -4601,7 +4602,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -4610,7 +4611,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -4619,7 +4620,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -4629,7 +4630,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -4639,7 +4640,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -4671,7 +4672,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -4695,7 +4696,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -4705,7 +4706,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -4714,7 +4715,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -4723,7 +4724,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -4733,7 +4734,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -4742,7 +4743,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -4751,7 +4752,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -4763,7 +4764,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -4777,7 +4778,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -4791,7 +4792,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -4810,7 +4811,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -4824,7 +4825,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -4838,7 +4839,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -4857,7 +4858,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -4871,7 +4872,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -4885,7 +4886,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -4904,7 +4905,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -4918,7 +4919,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -4932,7 +4933,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -4951,7 +4952,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -4965,7 +4966,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -4979,7 +4980,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -4998,7 +4999,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -5012,7 +5013,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -5022,7 +5023,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -5034,7 +5035,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -5043,7 +5044,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -5057,7 +5058,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -5072,7 +5073,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -5101,7 +5102,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -5110,7 +5111,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -5119,7 +5120,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -5142,7 +5143,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -5159,7 +5160,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -5194,7 +5195,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -5211,7 +5212,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -5224,7 +5225,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -5233,7 +5234,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5253,7 +5254,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -5270,7 +5271,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5279,7 +5280,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -5292,7 +5293,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5301,7 +5302,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -5317,7 +5318,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -5326,7 +5327,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -5335,7 +5336,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -5346,7 +5347,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -5356,7 +5357,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -5366,7 +5367,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -5378,7 +5379,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -5388,7 +5389,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -5401,7 +5402,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -5410,7 +5411,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -5428,7 +5429,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -5446,7 +5447,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -5464,7 +5465,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -5482,7 +5483,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -5500,7 +5501,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -5518,7 +5519,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -5536,7 +5537,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -5554,7 +5555,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -5572,7 +5573,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -5590,7 +5591,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -5608,7 +5609,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -5626,7 +5627,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -5644,7 +5645,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -5664,7 +5665,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -5684,7 +5685,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -5704,7 +5705,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -5722,7 +5723,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -5741,7 +5742,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -5750,7 +5751,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -5760,7 +5761,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -5773,7 +5774,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -5783,7 +5784,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -5793,7 +5794,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -5818,7 +5819,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -5833,7 +5834,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -5844,7 +5845,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -5853,7 +5854,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -5863,7 +5864,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -5873,7 +5874,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -5884,7 +5885,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -5893,7 +5894,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -5902,7 +5903,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -5914,7 +5915,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -5928,7 +5929,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -5938,7 +5939,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -5949,7 +5950,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -5958,7 +5959,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -5972,7 +5973,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -5987,7 +5988,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -6008,7 +6009,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -6024,7 +6025,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -6033,7 +6034,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -6047,7 +6048,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -6062,7 +6063,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -6078,7 +6079,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -6093,7 +6094,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -6116,7 +6117,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -6137,7 +6138,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -6153,7 +6154,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -6162,7 +6163,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -6176,7 +6177,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -6191,7 +6192,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -6207,7 +6208,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -6222,7 +6223,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -6245,7 +6246,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -6266,7 +6267,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -6282,7 +6283,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -6291,7 +6292,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -6305,7 +6306,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -6319,7 +6320,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -6333,7 +6334,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -6348,7 +6349,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -6510,7 +6511,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -6521,7 +6522,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -6532,7 +6533,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -6543,7 +6544,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -6554,7 +6555,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -6565,7 +6566,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -6576,7 +6577,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -6587,7 +6588,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -6598,7 +6599,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -6730,8 +6731,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -6954,7 +6955,7 @@ if (!__Pyx_RefNanny) { if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -7517,7 +7518,7 @@ static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -7532,7 +7533,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -8598,7 +8599,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -8652,6 +8653,9 @@ static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_li #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); @@ -9727,14 +9731,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i #ifndef offsetof @@ -478,6 +478,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -675,7 +676,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -783,7 +784,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -857,7 +858,7 @@ typedef struct { } __Pyx_BufFmt_Context; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -866,7 +867,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -875,7 +876,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -884,7 +885,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -893,7 +894,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -902,7 +903,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -911,7 +912,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -920,7 +921,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -929,7 +930,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -938,7 +939,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -947,7 +948,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -956,7 +957,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -965,7 +966,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -974,7 +975,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -983,7 +984,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -992,7 +993,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1001,7 +1002,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1010,7 +1011,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1019,7 +1020,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1028,7 +1029,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1037,7 +1038,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1072,7 +1073,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do /*--- Type declarations ---*/ -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1081,7 +1082,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1090,7 +1091,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1099,7 +1100,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -1925,7 +1926,7 @@ static PyObject *__pyx_pf_10MDAnalysis_8analysis_6encore_6cutils_PureRMSD(CYTHON return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -1973,7 +1974,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -1982,7 +1983,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -1991,7 +1992,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -2000,7 +2001,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2014,7 +2015,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -2025,7 +2026,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2034,7 +2035,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -2047,7 +2048,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2056,7 +2057,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2070,7 +2071,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -2081,7 +2082,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2090,7 +2091,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -2103,7 +2104,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2112,7 +2113,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -2121,7 +2122,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -2130,7 +2131,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -2140,7 +2141,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -2149,7 +2150,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -2158,7 +2159,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -2170,7 +2171,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -2179,7 +2180,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -2189,7 +2190,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -2199,7 +2200,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -2209,7 +2210,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -2220,7 +2221,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -2229,7 +2230,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -2238,7 +2239,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -2247,7 +2248,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -2256,7 +2257,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -2268,7 +2269,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -2281,7 +2282,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -2291,7 +2292,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -2301,7 +2302,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -2321,7 +2322,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -2338,7 +2339,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -2347,7 +2348,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -2360,7 +2361,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -2369,7 +2370,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -2381,7 +2382,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -2392,7 +2393,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -2403,7 +2404,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -2414,7 +2415,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -2425,7 +2426,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -2436,7 +2437,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -2447,7 +2448,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -2458,7 +2459,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -2469,7 +2470,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -2480,7 +2481,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -2491,7 +2492,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -2502,7 +2503,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -2513,7 +2514,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -2524,7 +2525,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -2535,7 +2536,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -2546,7 +2547,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -2558,7 +2559,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -2579,7 +2580,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -2588,7 +2589,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -2598,7 +2599,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -2607,7 +2608,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -2617,7 +2618,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -2626,7 +2627,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -2635,7 +2636,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -2645,7 +2646,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -2655,7 +2656,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -2687,7 +2688,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -2711,7 +2712,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -2721,7 +2722,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -2730,7 +2731,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -2739,7 +2740,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -2749,7 +2750,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -2758,7 +2759,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -2767,7 +2768,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -2779,7 +2780,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -2793,7 +2794,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -2807,7 +2808,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -2826,7 +2827,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -2840,7 +2841,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -2854,7 +2855,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -2873,7 +2874,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -2887,7 +2888,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -2901,7 +2902,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -2920,7 +2921,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -2934,7 +2935,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -2948,7 +2949,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -2967,7 +2968,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -2981,7 +2982,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -2995,7 +2996,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -3014,7 +3015,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -3028,7 +3029,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -3038,7 +3039,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -3050,7 +3051,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -3059,7 +3060,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -3073,7 +3074,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -3088,7 +3089,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -3117,7 +3118,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -3126,7 +3127,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -3135,7 +3136,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -3158,7 +3159,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -3175,7 +3176,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -3210,7 +3211,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -3227,7 +3228,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -3240,7 +3241,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -3249,7 +3250,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3269,7 +3270,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -3286,7 +3287,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3295,7 +3296,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -3308,7 +3309,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3317,7 +3318,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -3333,7 +3334,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -3342,7 +3343,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -3351,7 +3352,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -3362,7 +3363,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -3372,7 +3373,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -3382,7 +3383,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -3394,7 +3395,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -3404,7 +3405,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -3417,7 +3418,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -3426,7 +3427,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -3444,7 +3445,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -3462,7 +3463,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -3480,7 +3481,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -3498,7 +3499,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -3516,7 +3517,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -3534,7 +3535,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -3552,7 +3553,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -3570,7 +3571,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -3588,7 +3589,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -3606,7 +3607,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -3624,7 +3625,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -3642,7 +3643,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -3660,7 +3661,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -3680,7 +3681,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -3700,7 +3701,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -3720,7 +3721,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -3738,7 +3739,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -3757,7 +3758,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -3766,7 +3767,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -3776,7 +3777,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -3789,7 +3790,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -3799,7 +3800,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -3809,7 +3810,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -3834,7 +3835,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -3849,7 +3850,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -3860,7 +3861,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -3869,7 +3870,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -3879,7 +3880,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -3889,7 +3890,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -3900,7 +3901,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -3909,7 +3910,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -3918,7 +3919,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -3930,7 +3931,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -3944,7 +3945,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -3954,7 +3955,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -3965,7 +3966,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -3974,7 +3975,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -3988,7 +3989,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -4003,7 +4004,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -4024,7 +4025,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -4040,7 +4041,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -4049,7 +4050,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -4063,7 +4064,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -4078,7 +4079,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -4094,7 +4095,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -4109,7 +4110,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -4132,7 +4133,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -4153,7 +4154,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -4169,7 +4170,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -4178,7 +4179,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -4192,7 +4193,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -4207,7 +4208,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4223,7 +4224,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -4238,7 +4239,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -4261,7 +4262,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -4282,7 +4283,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -4298,7 +4299,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -4307,7 +4308,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -4321,7 +4322,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -4335,7 +4336,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4349,7 +4350,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -4364,7 +4365,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -4475,7 +4476,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -4486,7 +4487,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -4497,7 +4498,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4508,7 +4509,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -4519,7 +4520,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4530,7 +4531,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -4541,7 +4542,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -4552,7 +4553,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4563,7 +4564,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4693,8 +4694,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -4883,7 +4884,7 @@ if (!__Pyx_RefNanny) { if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -6143,7 +6144,7 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -6158,7 +6159,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -6242,7 +6243,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -6347,6 +6348,9 @@ static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_li #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); @@ -7422,14 +7426,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i #ifndef offsetof @@ -484,6 +484,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -681,7 +682,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -789,7 +790,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -863,7 +864,7 @@ typedef struct { } __Pyx_BufFmt_Context; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -872,7 +873,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -881,7 +882,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -890,7 +891,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -899,7 +900,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -908,7 +909,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -917,7 +918,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -926,7 +927,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -935,7 +936,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -944,7 +945,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -953,7 +954,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -962,7 +963,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -971,7 +972,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -980,7 +981,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -989,7 +990,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -998,7 +999,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1007,7 +1008,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1016,7 +1017,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1025,7 +1026,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1034,7 +1035,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1043,7 +1044,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1078,7 +1079,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do /*--- Type declarations ---*/ -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1087,7 +1088,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1096,7 +1097,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1105,7 +1106,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -2187,7 +2188,7 @@ static PyObject *__pyx_pf_10MDAnalysis_8analysis_6encore_24dimensionality_reduct return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -2235,7 +2236,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -2244,7 +2245,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -2253,7 +2254,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -2262,7 +2263,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2276,7 +2277,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -2287,7 +2288,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2296,7 +2297,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -2309,7 +2310,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2318,7 +2319,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2332,7 +2333,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -2343,7 +2344,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2352,7 +2353,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -2365,7 +2366,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2374,7 +2375,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -2383,7 +2384,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -2392,7 +2393,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -2402,7 +2403,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -2411,7 +2412,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -2420,7 +2421,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -2432,7 +2433,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -2441,7 +2442,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -2451,7 +2452,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -2461,7 +2462,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -2471,7 +2472,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -2482,7 +2483,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -2491,7 +2492,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -2500,7 +2501,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -2509,7 +2510,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -2518,7 +2519,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -2530,7 +2531,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -2543,7 +2544,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -2553,7 +2554,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -2563,7 +2564,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -2583,7 +2584,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -2600,7 +2601,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -2609,7 +2610,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -2622,7 +2623,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -2631,7 +2632,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -2643,7 +2644,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -2654,7 +2655,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -2665,7 +2666,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -2676,7 +2677,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -2687,7 +2688,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -2698,7 +2699,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -2709,7 +2710,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -2720,7 +2721,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -2731,7 +2732,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -2742,7 +2743,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -2753,7 +2754,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -2764,7 +2765,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -2775,7 +2776,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -2786,7 +2787,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -2797,7 +2798,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -2808,7 +2809,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -2820,7 +2821,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -2841,7 +2842,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -2850,7 +2851,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -2860,7 +2861,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -2869,7 +2870,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -2879,7 +2880,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -2888,7 +2889,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -2897,7 +2898,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -2907,7 +2908,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -2917,7 +2918,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -2949,7 +2950,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -2973,7 +2974,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -2983,7 +2984,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -2992,7 +2993,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -3001,7 +3002,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -3011,7 +3012,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -3020,7 +3021,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -3029,7 +3030,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -3041,7 +3042,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -3055,7 +3056,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -3069,7 +3070,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -3088,7 +3089,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -3102,7 +3103,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -3116,7 +3117,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -3135,7 +3136,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -3149,7 +3150,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -3163,7 +3164,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -3182,7 +3183,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -3196,7 +3197,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -3210,7 +3211,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -3229,7 +3230,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -3243,7 +3244,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -3257,7 +3258,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -3276,7 +3277,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -3290,7 +3291,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -3300,7 +3301,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -3312,7 +3313,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -3321,7 +3322,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -3335,7 +3336,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -3350,7 +3351,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -3379,7 +3380,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -3388,7 +3389,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -3397,7 +3398,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -3420,7 +3421,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -3437,7 +3438,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -3472,7 +3473,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -3489,7 +3490,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -3502,7 +3503,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -3511,7 +3512,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3531,7 +3532,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -3548,7 +3549,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3557,7 +3558,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -3570,7 +3571,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3579,7 +3580,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -3595,7 +3596,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -3604,7 +3605,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -3613,7 +3614,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -3624,7 +3625,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -3634,7 +3635,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -3644,7 +3645,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -3656,7 +3657,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -3666,7 +3667,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -3679,7 +3680,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -3688,7 +3689,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -3706,7 +3707,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -3724,7 +3725,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -3742,7 +3743,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -3760,7 +3761,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -3778,7 +3779,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -3796,7 +3797,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -3814,7 +3815,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -3832,7 +3833,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -3850,7 +3851,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -3868,7 +3869,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -3886,7 +3887,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -3904,7 +3905,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -3922,7 +3923,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -3942,7 +3943,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -3962,7 +3963,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -3982,7 +3983,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -4000,7 +4001,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -4019,7 +4020,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -4028,7 +4029,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -4038,7 +4039,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -4051,7 +4052,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -4061,7 +4062,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -4071,7 +4072,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -4096,7 +4097,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -4111,7 +4112,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -4122,7 +4123,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -4131,7 +4132,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -4141,7 +4142,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -4151,7 +4152,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -4162,7 +4163,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -4171,7 +4172,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -4180,7 +4181,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -4192,7 +4193,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -4206,7 +4207,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -4216,7 +4217,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -4227,7 +4228,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -4236,7 +4237,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -4250,7 +4251,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -4265,7 +4266,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -4286,7 +4287,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -4302,7 +4303,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -4311,7 +4312,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -4325,7 +4326,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -4340,7 +4341,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -4356,7 +4357,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -4371,7 +4372,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -4394,7 +4395,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -4415,7 +4416,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -4431,7 +4432,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -4440,7 +4441,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -4454,7 +4455,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -4469,7 +4470,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4485,7 +4486,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -4500,7 +4501,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -4523,7 +4524,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -4544,7 +4545,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -4560,7 +4561,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -4569,7 +4570,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -4583,7 +4584,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -4597,7 +4598,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4611,7 +4612,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -4626,7 +4627,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -4757,7 +4758,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -4768,7 +4769,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -4779,7 +4780,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4790,7 +4791,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -4801,7 +4802,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4812,7 +4813,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -4823,7 +4824,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -4834,7 +4835,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4845,7 +4846,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -4976,8 +4977,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -5178,7 +5179,7 @@ if (!__Pyx_RefNanny) { if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -6444,7 +6445,7 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -6459,7 +6460,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -6543,7 +6544,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -6648,6 +6649,9 @@ static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_li #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); @@ -7723,14 +7727,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (0 && PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef __cplusplus + #error "Cython files generated with the C++ option must be compiled with a C++ compiler." +#endif +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #else + #define CYTHON_INLINE inline + #endif +#endif +template +void __Pyx_call_destructor(T& x) { + x.~T(); +} +template +class __Pyx_FakeReference { + public: + __Pyx_FakeReference() : ptr(NULL) { } + __Pyx_FakeReference(const T& ref) : ptr(const_cast(&ref)) { } + T *operator->() { return ptr; } + T *operator&() { return ptr; } + operator T&() { return *ptr; } + template bool operator ==(U other) { return *ptr == other; } + template bool operator !=(U other) { return *ptr != other; } + private: + T *ptr; +}; + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; // PyThread_create_key reports success always +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif // TSS (Thread Specific Storage) API +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + + +#define __PYX_ERR(f_index, lineno, Ln_error) \ +{ \ + __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +} + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__MDAnalysis__lib___augment +#define __PYX_HAVE_API__MDAnalysis__lib___augment +/* Early includes */ +#include +#include +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include "ios" +#include "new" +#include "stdexcept" +#include "typeinfo" +#include +#include "pythread.h" +#include +#include "pystate.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif defined(_Complex_I) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + + +static const char *__pyx_f[] = { + "MDAnalysis/lib/_augment.pyx", + "__init__.pxd", + "stringsource", + "type.pxd", +}; +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __pyx_atomic_int_type int +#if CYTHON_ATOMICS && __GNUC__ >= 4 && (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL >= 2)) &&\ + !defined(__i386__) + #define __pyx_atomic_incr_aligned(value, lock) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value, lock) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) && 0 + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type LONG + #define __pyx_atomic_incr_aligned(value, lock) InterlockedIncrement(value) + #define __pyx_atomic_decr_aligned(value, lock) InterlockedDecrement(value) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#elif CYTHON_ATOMICS && (defined(__ICC) || defined(__INTEL_COMPILER)) && 0 + #define __pyx_atomic_incr_aligned(value, lock) _InterlockedIncrement(value) + #define __pyx_atomic_decr_aligned(value, lock) _InterlockedDecrement(value) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using Intel atomics" + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +typedef volatile __pyx_atomic_int_type __pyx_atomic_int; +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +#define IS_UNSIGNED(type) (((type) -1) > 0) +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_longlong __pyx_t_5numpy_long_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulonglong __pyx_t_5numpy_ulong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + + +/*--- Type declarations ---*/ +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; + +/* "View.MemoryView":104 + * + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":278 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":329 + * + * @cname('__pyx_memoryview') + * cdef class memoryview(object): # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int acquisition_count[2]; + __pyx_atomic_int *acquisition_count_aligned_p; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":960 + * + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "View.MemoryView":104 + * + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":329 + * + * @cname('__pyx_memoryview') + * cdef class memoryview(object): # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":960 + * + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* GetModuleGlobalName.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* IncludeStringH.proto */ +#include + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (memview->acquisition_count_aligned_p) +#define __pyx_get_slice_count(memview) (*__pyx_get_slice_count_pointer(memview)) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XDEC_MEMVIEW(slice, have_gil) __Pyx_XDEC_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* None.proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* UnaryNegOverflows.proto */ +#define UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* decode_c_string_utf16.proto */ +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 0; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = -1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} + +/* decode_c_string.proto */ +static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* None.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* None.proto */ +static CYTHON_INLINE long __Pyx_div_long(long, long); + +/* WriteUnraisableException.proto */ +static void __Pyx_WriteUnraisable(const char *name, int clineno, + int lineno, const char *filename, + int full_traceback, int nogil); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyObject *dict, void *vtable); + +/* SetupReduce.proto */ +static int __Pyx_setup_reduce(PyObject* type_obj); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* Capsule.proto */ +static CYTHON_INLINE PyObject *__pyx_capsule_create(void *p, const char *sig); + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_float(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(PyObject *, int writable_flag); + +/* MemviewDtypeToObject.proto */ +static CYTHON_INLINE PyObject *__pyx_memview_get_float(const char *itemp); +static CYTHON_INLINE int __pyx_memview_set_float(const char *itemp, PyObject *obj); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CppExceptionConversion.proto */ +#ifndef __Pyx_CppExn2PyErr +#include +#include +#include +#include +static void __Pyx_CppExn2PyErr() { + try { + if (PyErr_Occurred()) + ; // let the latest Python exn pass through and ignore the current one + else + throw; + } catch (const std::bad_alloc& exn) { + PyErr_SetString(PyExc_MemoryError, exn.what()); + } catch (const std::bad_cast& exn) { + PyErr_SetString(PyExc_TypeError, exn.what()); + } catch (const std::bad_typeid& exn) { + PyErr_SetString(PyExc_TypeError, exn.what()); + } catch (const std::domain_error& exn) { + PyErr_SetString(PyExc_ValueError, exn.what()); + } catch (const std::invalid_argument& exn) { + PyErr_SetString(PyExc_ValueError, exn.what()); + } catch (const std::ios_base::failure& exn) { + PyErr_SetString(PyExc_IOError, exn.what()); + } catch (const std::out_of_range& exn) { + PyErr_SetString(PyExc_IndexError, exn.what()); + } catch (const std::overflow_error& exn) { + PyErr_SetString(PyExc_OverflowError, exn.what()); + } catch (const std::range_error& exn) { + PyErr_SetString(PyExc_ArithmeticError, exn.what()); + } catch (const std::underflow_error& exn) { + PyErr_SetString(PyExc_ArithmeticError, exn.what()); + } catch (const std::exception& exn) { + PyErr_SetString(PyExc_RuntimeError, exn.what()); + } + catch (...) + { + PyErr_SetString(PyExc_RuntimeError, "Unknown exception"); + } +} +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); + +/* MemviewDtypeToObject.proto */ +static CYTHON_INLINE PyObject *__pyx_memview_get_nn___pyx_t_5numpy_int64_t(const char *itemp); +static CYTHON_INLINE int __pyx_memview_set_nn___pyx_t_5numpy_int64_t(const char *itemp, PyObject *obj); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* PyIdentifierFromString.proto */ +#if !defined(__Pyx_PyIdentifier_FromString) +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) +#else + #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) +#endif +#endif + +/* ModuleImport.proto */ +static PyObject *__Pyx_ImportModule(const char *name); + +/* TypeImport.proto */ +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +/* FunctionImport.proto */ +static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ + +/* Module declarations from 'cython.view' */ + +/* Module declarations from 'cython' */ + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'cpython.mem' */ + +/* Module declarations from 'numpy' */ + +/* Module declarations from 'numpy' */ +static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; +static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; +static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; +static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ + +/* Module declarations from 'MDAnalysis.lib._cutil' */ +static float (*__pyx_f_10MDAnalysis_3lib_6_cutil__dot)(float *, float *); /*proto*/ +static void (*__pyx_f_10MDAnalysis_3lib_6_cutil__cross)(float *, float *, float *); /*proto*/ +static float (*__pyx_f_10MDAnalysis_3lib_6_cutil__norm)(float *); /*proto*/ + +/* Module declarations from 'libcpp.vector' */ + +/* Module declarations from 'MDAnalysis.lib._augment' */ +static PyTypeObject *__pyx_array_type = 0; +static PyTypeObject *__pyx_MemviewEnum_type = 0; +static PyTypeObject *__pyx_memoryview_type = 0; +static PyTypeObject *__pyx_memoryviewslice_type = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static int __Pyx_carray_from_py_float(PyObject *, float *, Py_ssize_t); /*proto*/ +static int __Pyx_carray_from_py_float___5b_3_5d_(PyObject *, float (*)[3], Py_ssize_t); /*proto*/ +static PyObject *__pyx_convert_vector_to_py_float(const std::vector &); /*proto*/ +static PyObject *__pyx_convert_vector_to_py_int(const std::vector &); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static void *__pyx_align_pointer(void *, size_t); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static PyObject *assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, char *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, char *); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +static __Pyx_TypeInfo __Pyx_TypeInfo_float = { "float", NULL, sizeof(float), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +#define __Pyx_MODULE_NAME "MDAnalysis.lib._augment" +extern int __pyx_module_is_main_MDAnalysis__lib___augment; +int __pyx_module_is_main_MDAnalysis__lib___augment = 0; + +/* Implementation of 'MDAnalysis.lib._augment' */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_RuntimeError; +static PyObject *__pyx_builtin_ImportError; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_OverflowError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static const char __pyx_k_N[] = "N"; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k_j[] = "j"; +static const char __pyx_k_n[] = "n"; +static const char __pyx_k_r[] = "r"; +static const char __pyx_k_dm[] = "dm"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k_all[] = "__all__"; +static const char __pyx_k_box[] = "box"; +static const char __pyx_k_end[] = "end"; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_hi_x[] = "hi_x"; +static const char __pyx_k_hi_y[] = "hi_y"; +static const char __pyx_k_hi_z[] = "hi_z"; +static const char __pyx_k_lo_x[] = "lo_x"; +static const char __pyx_k_lo_y[] = "lo_y"; +static const char __pyx_k_lo_z[] = "lo_z"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_norm[] = "norm"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_coord[] = "coord"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_int64[] = "int64"; +static const char __pyx_k_nreal[] = "nreal"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_other[] = "other"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_output[] = "output"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_shiftX[] = "shiftX"; +static const char __pyx_k_shiftY[] = "shiftY"; +static const char __pyx_k_shiftZ[] = "shiftZ"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_asarray[] = "asarray"; +static const char __pyx_k_float32[] = "float32"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_indices[] = "indices"; +static const char __pyx_k_mdamath[] = "mdamath"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_reshape[] = "reshape"; +static const char __pyx_k_results[] = "results"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_reciprocal[] = "reciprocal"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_coordinates[] = "coordinates"; +static const char __pyx_k_translation[] = "translation"; +static const char __pyx_k_RuntimeError[] = "RuntimeError"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = "stringsource"; +static const char __pyx_k_undo_augment[] = "undo_augment"; +static const char __pyx_k_OverflowError[] = "OverflowError"; +static const char __pyx_k_pyx_getbuffer[] = "__pyx_getbuffer"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_triclinic_vectors[] = "triclinic_vectors"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_augment_coordinates[] = "augment_coordinates"; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_MDAnalysis_lib__augment[] = "MDAnalysis.lib._augment"; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_Cannot_index_with_type_s[] = "Cannot index with type '%s'"; +static const char __pyx_k_Invalid_shape_in_axis_d_d[] = "Invalid shape in axis %d: %d."; +static const char __pyx_k_MDAnalysis_lib__augment_pyx[] = "MDAnalysis/lib/_augment.pyx"; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static const char __pyx_k_Incompatible_checksums_s_vs_0xb0[] = "Incompatible checksums (%s vs 0xb068931 = (name))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got %s"; +static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis %d)"; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension %d (got %d and %d)"; +static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_ASCII; +static PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; +static PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; +static PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; +static PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; +static PyObject *__pyx_kp_s_Cannot_index_with_type_s; +static PyObject *__pyx_n_s_Ellipsis; +static PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; +static PyObject *__pyx_n_s_ImportError; +static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xb0; +static PyObject *__pyx_n_s_IndexError; +static PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; +static PyObject *__pyx_kp_s_Invalid_mode_expected_c_or_fortr; +static PyObject *__pyx_kp_s_Invalid_shape_in_axis_d_d; +static PyObject *__pyx_n_s_MDAnalysis_lib__augment; +static PyObject *__pyx_kp_s_MDAnalysis_lib__augment_pyx; +static PyObject *__pyx_n_s_MemoryError; +static PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; +static PyObject *__pyx_kp_s_MemoryView_of_r_object; +static PyObject *__pyx_n_s_N; +static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; +static PyObject *__pyx_n_b_O; +static PyObject *__pyx_kp_s_Out_of_bounds_on_buffer_access_a; +static PyObject *__pyx_n_s_OverflowError; +static PyObject *__pyx_n_s_PickleError; +static PyObject *__pyx_n_s_RuntimeError; +static PyObject *__pyx_n_s_TypeError; +static PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_n_s_View_MemoryView; +static PyObject *__pyx_n_s_all; +static PyObject *__pyx_n_s_allocate_buffer; +static PyObject *__pyx_n_s_asarray; +static PyObject *__pyx_n_s_augment_coordinates; +static PyObject *__pyx_n_s_base; +static PyObject *__pyx_n_s_box; +static PyObject *__pyx_n_s_c; +static PyObject *__pyx_n_u_c; +static PyObject *__pyx_n_s_class; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_kp_s_contiguous_and_direct; +static PyObject *__pyx_kp_s_contiguous_and_indirect; +static PyObject *__pyx_n_s_coord; +static PyObject *__pyx_n_s_coordinates; +static PyObject *__pyx_n_s_dict; +static PyObject *__pyx_n_s_dm; +static PyObject *__pyx_n_s_dtype; +static PyObject *__pyx_n_s_dtype_is_object; +static PyObject *__pyx_n_s_encode; +static PyObject *__pyx_n_s_end; +static PyObject *__pyx_n_s_enumerate; +static PyObject *__pyx_n_s_error; +static PyObject *__pyx_n_s_flags; +static PyObject *__pyx_n_s_float32; +static PyObject *__pyx_n_s_format; +static PyObject *__pyx_n_s_fortran; +static PyObject *__pyx_n_u_fortran; +static PyObject *__pyx_n_s_getstate; +static PyObject *__pyx_kp_s_got_differing_extents_in_dimensi; +static PyObject *__pyx_n_s_hi_x; +static PyObject *__pyx_n_s_hi_y; +static PyObject *__pyx_n_s_hi_z; +static PyObject *__pyx_n_s_i; +static PyObject *__pyx_n_s_id; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_indices; +static PyObject *__pyx_n_s_int64; +static PyObject *__pyx_n_s_itemsize; +static PyObject *__pyx_kp_s_itemsize_0_for_cython_array; +static PyObject *__pyx_n_s_j; +static PyObject *__pyx_n_s_lo_x; +static PyObject *__pyx_n_s_lo_y; +static PyObject *__pyx_n_s_lo_z; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_mdamath; +static PyObject *__pyx_n_s_memview; +static PyObject *__pyx_n_s_mode; +static PyObject *__pyx_n_s_n; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_name_2; +static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; +static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; +static PyObject *__pyx_n_s_ndim; +static PyObject *__pyx_n_s_new; +static PyObject *__pyx_kp_s_no_default___reduce___due_to_non; +static PyObject *__pyx_n_s_norm; +static PyObject *__pyx_n_s_np; +static PyObject *__pyx_n_s_nreal; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; +static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; +static PyObject *__pyx_n_s_obj; +static PyObject *__pyx_n_s_other; +static PyObject *__pyx_n_s_output; +static PyObject *__pyx_n_s_pack; +static PyObject *__pyx_n_s_pickle; +static PyObject *__pyx_n_s_pyx_PickleError; +static PyObject *__pyx_n_s_pyx_checksum; +static PyObject *__pyx_n_s_pyx_getbuffer; +static PyObject *__pyx_n_s_pyx_result; +static PyObject *__pyx_n_s_pyx_state; +static PyObject *__pyx_n_s_pyx_type; +static PyObject *__pyx_n_s_pyx_unpickle_Enum; +static PyObject *__pyx_n_s_pyx_vtable; +static PyObject *__pyx_n_s_r; +static PyObject *__pyx_n_s_range; +static PyObject *__pyx_n_s_reciprocal; +static PyObject *__pyx_n_s_reduce; +static PyObject *__pyx_n_s_reduce_cython; +static PyObject *__pyx_n_s_reduce_ex; +static PyObject *__pyx_n_s_reshape; +static PyObject *__pyx_n_s_results; +static PyObject *__pyx_n_s_setstate; +static PyObject *__pyx_n_s_setstate_cython; +static PyObject *__pyx_n_s_shape; +static PyObject *__pyx_n_s_shiftX; +static PyObject *__pyx_n_s_shiftY; +static PyObject *__pyx_n_s_shiftZ; +static PyObject *__pyx_n_s_size; +static PyObject *__pyx_n_s_start; +static PyObject *__pyx_n_s_step; +static PyObject *__pyx_n_s_stop; +static PyObject *__pyx_kp_s_strided_and_direct; +static PyObject *__pyx_kp_s_strided_and_direct_or_indirect; +static PyObject *__pyx_kp_s_strided_and_indirect; +static PyObject *__pyx_kp_s_stringsource; +static PyObject *__pyx_n_s_struct; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_translation; +static PyObject *__pyx_n_s_triclinic_vectors; +static PyObject *__pyx_kp_s_unable_to_allocate_array_data; +static PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; +static PyObject *__pyx_n_s_undo_augment; +static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; +static PyObject *__pyx_n_s_unpack; +static PyObject *__pyx_n_s_update; +static PyObject *__pyx_pf_10MDAnalysis_3lib_8_augment_augment_coordinates(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_coordinates, __Pyx_memviewslice __pyx_v_box, float __pyx_v_r); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_8_augment_2undo_augment(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_results, __Pyx_memviewslice __pyx_v_translation, int __pyx_v_nreal); /* proto */ +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_3; +static PyObject *__pyx_int_184977713; +static PyObject *__pyx_int_neg_1; +static PyObject *__pyx_tuple_; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__6; +static PyObject *__pyx_tuple__7; +static PyObject *__pyx_tuple__8; +static PyObject *__pyx_tuple__9; +static PyObject *__pyx_slice__25; +static PyObject *__pyx_slice__26; +static PyObject *__pyx_slice__27; +static PyObject *__pyx_tuple__10; +static PyObject *__pyx_tuple__11; +static PyObject *__pyx_tuple__12; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_tuple__14; +static PyObject *__pyx_tuple__15; +static PyObject *__pyx_tuple__16; +static PyObject *__pyx_tuple__17; +static PyObject *__pyx_tuple__18; +static PyObject *__pyx_tuple__19; +static PyObject *__pyx_tuple__20; +static PyObject *__pyx_tuple__21; +static PyObject *__pyx_tuple__22; +static PyObject *__pyx_tuple__23; +static PyObject *__pyx_tuple__24; +static PyObject *__pyx_tuple__28; +static PyObject *__pyx_tuple__29; +static PyObject *__pyx_tuple__30; +static PyObject *__pyx_tuple__31; +static PyObject *__pyx_tuple__33; +static PyObject *__pyx_tuple__35; +static PyObject *__pyx_tuple__36; +static PyObject *__pyx_tuple__37; +static PyObject *__pyx_tuple__38; +static PyObject *__pyx_tuple__39; +static PyObject *__pyx_tuple__40; +static PyObject *__pyx_codeobj__32; +static PyObject *__pyx_codeobj__34; +static PyObject *__pyx_codeobj__41; +/* Late includes */ + +/* "MDAnalysis/lib/_augment.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): # <<<<<<<<<<<<<< + * r"""Calculates the periodic images of particles which are within a distance + * `r` from the box walls. + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_8_augment_1augment_coordinates(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_8_augment_augment_coordinates[] = "Calculates the periodic images of particles which are within a distance\n `r` from the box walls.\n\n The algorithm works by generating explicit periodic images of atoms residing\n close to any of the six box walls. The steps involved in generating images\n involves the evaluation of reciprocal box vectors followed by the\n calculation of distances of atoms from the walls by means of projection onto\n the reciprocal vectors. If the distance is less than a specified cutoff\n distance, relevant periodic images are generated using box translation\n vectors :math:`\\vec{t}` with\n\n .. math:: \\vec{t}=l\\cdot\\vec{a}+m\\cdot\\vec{b}+n\\cdot \\vec{c}\\,,\n\n where :math:`l,\\,m,\\,n \\in \\{-1,\\,0,\\,1\\}` are the neighboring cell indices\n in :math:`x`-, :math:`y`-, and :math:`z`-direction relative to the central\n cell with box vectors :math:`\\vec{a},\\,\\vec{b},\\,\\vec{c}`.\n\n For instance, an atom close to the :math:`xy`-plane containing the origin\n will generate a periodic image outside the central cell and close to the\n opposite :math:`xy`-plane of the box, i.e., shifted by\n :math:`\\vec{t} = 0\\cdot\\vec{a}+0\\cdot\\vec{b}+1\\cdot\\vec{c}=\\vec{c}`.\n\n Likewise, if the particle is close to more than one box walls, images along\n the diagonals are also generated::\n\n x x\n +------------+ +------------+\n | | augment | |\n | | -------> | |\n | o | x | o |\n +------------+ +------------+\n\n Parameters\n ----------\n coordinates : numpy.ndarray\n Input coordinate array of shape ``(n, 3)`` and dtype ``numpy.float32``\n used to generate duplicate images in the vicinity of the central cell. All\n coordinates must be within the primary unit cell.\n box : numpy.ndarray\n Box dimensio""ns of shape ``(6,)`` and dtype ``numpy.float32``. The\n dimensions must be provided in the same format as returned\n by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``\n r : float\n Thickness of cutoff region for duplicate image generation.\n\n Returns\n -------\n output : numpy.ndarray\n Coordinates of duplicate (augmented) particles (dtype ``numpy.float32``).\n indices : numpy.ndarray\n Original indices of the augmented coordinates (dtype ``numpy.int64``).\n Maps the indices of augmented particles to their original particle index\n such that ``indices[augmented_index] = original_index``.\n\n Note\n ----\n Output does not return coordinates from the initial array.\n To merge the particles with their respective images, the following operation\n is necessary when generating the images:\n\n .. code-block:: python\n\n images, mapping = augment_coordinates(coordinates, box, max_cutoff)\n all_coords = numpy.concatenate([coordinates, images])\n\n\n See Also\n --------\n :meth:`undo_augment`\n\n\n .. versionadded:: 0.19.0\n "; +static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_8_augment_1augment_coordinates = {"augment_coordinates", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_8_augment_1augment_coordinates, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10MDAnalysis_3lib_8_augment_augment_coordinates}; +static PyObject *__pyx_pw_10MDAnalysis_3lib_8_augment_1augment_coordinates(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + __Pyx_memviewslice __pyx_v_coordinates = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_box = { 0, 0, { 0 }, { 0 }, { 0 } }; + float __pyx_v_r; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("augment_coordinates (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_coordinates,&__pyx_n_s_box,&__pyx_n_s_r,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coordinates)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("augment_coordinates", 1, 3, 3, 1); __PYX_ERR(0, 39, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_r)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("augment_coordinates", 1, 3, 3, 2); __PYX_ERR(0, 39, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "augment_coordinates") < 0)) __PYX_ERR(0, 39, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_coordinates = __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_coordinates.memview)) __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_v_box = __Pyx_PyObject_to_MemoryviewSlice_ds_float(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_box.memview)) __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_v_r = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_r == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 39, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("augment_coordinates", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 39, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib._augment.augment_coordinates", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_8_augment_augment_coordinates(__pyx_self, __pyx_v_coordinates, __pyx_v_box, __pyx_v_r); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_8_augment_augment_coordinates(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_coordinates, __Pyx_memviewslice __pyx_v_box, float __pyx_v_r) { + int __pyx_v_lo_x; + int __pyx_v_hi_x; + int __pyx_v_lo_y; + int __pyx_v_hi_y; + int __pyx_v_lo_z; + int __pyx_v_hi_z; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_N; + float __pyx_v_norm; + float __pyx_v_shiftX[3]; + float __pyx_v_shiftY[3]; + float __pyx_v_shiftZ[3]; + float __pyx_v_coord[3]; + float __pyx_v_end[3]; + float __pyx_v_other[3]; + float __pyx_v_dm[3][3]; + float __pyx_v_reciprocal[3][3]; + std::vector __pyx_v_output; + std::vector __pyx_v_indices; + std::vector ::size_type __pyx_v_n; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + float __pyx_t_6[3][3]; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + int __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + __Pyx_RefNannySetupContext("augment_coordinates", 0); + + /* "MDAnalysis/lib/_augment.pyx":126 + * cdef float reciprocal[3][3] + * + * dm = triclinic_vectors(box) # <<<<<<<<<<<<<< + * + * for i in range(3): + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_triclinic_vectors); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_box, 1, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_4) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(__Pyx_carray_from_py_float___5b_3_5d_(__pyx_t_1, __pyx_t_6, 3) < 0)) __PYX_ERR(0, 126, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + memcpy(&(__pyx_v_dm[0]), __pyx_t_6, sizeof(__pyx_v_dm[0]) * (3)); + + /* "MDAnalysis/lib/_augment.pyx":128 + * dm = triclinic_vectors(box) + * + * for i in range(3): # <<<<<<<<<<<<<< + * shiftX[i] = dm[0][i] + * shiftY[i] = dm[1][i] + */ + for (__pyx_t_7 = 0; __pyx_t_7 < 3; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "MDAnalysis/lib/_augment.pyx":129 + * + * for i in range(3): + * shiftX[i] = dm[0][i] # <<<<<<<<<<<<<< + * shiftY[i] = dm[1][i] + * shiftZ[i] = dm[2][i] + */ + (__pyx_v_shiftX[__pyx_v_i]) = ((__pyx_v_dm[0])[__pyx_v_i]); + + /* "MDAnalysis/lib/_augment.pyx":130 + * for i in range(3): + * shiftX[i] = dm[0][i] + * shiftY[i] = dm[1][i] # <<<<<<<<<<<<<< + * shiftZ[i] = dm[2][i] + * end[i] = dm[0][i] + dm[1][i] + dm[2][i] + */ + (__pyx_v_shiftY[__pyx_v_i]) = ((__pyx_v_dm[1])[__pyx_v_i]); + + /* "MDAnalysis/lib/_augment.pyx":131 + * shiftX[i] = dm[0][i] + * shiftY[i] = dm[1][i] + * shiftZ[i] = dm[2][i] # <<<<<<<<<<<<<< + * end[i] = dm[0][i] + dm[1][i] + dm[2][i] + * # Calculate reciprocal vectors + */ + (__pyx_v_shiftZ[__pyx_v_i]) = ((__pyx_v_dm[2])[__pyx_v_i]); + + /* "MDAnalysis/lib/_augment.pyx":132 + * shiftY[i] = dm[1][i] + * shiftZ[i] = dm[2][i] + * end[i] = dm[0][i] + dm[1][i] + dm[2][i] # <<<<<<<<<<<<<< + * # Calculate reciprocal vectors + * _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) + */ + (__pyx_v_end[__pyx_v_i]) = ((((__pyx_v_dm[0])[__pyx_v_i]) + ((__pyx_v_dm[1])[__pyx_v_i])) + ((__pyx_v_dm[2])[__pyx_v_i])); + } + + /* "MDAnalysis/lib/_augment.pyx":134 + * end[i] = dm[0][i] + dm[1][i] + dm[2][i] + * # Calculate reciprocal vectors + * _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) # <<<<<<<<<<<<<< + * _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) + * _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) + */ + __pyx_f_10MDAnalysis_3lib_6_cutil__cross((&((__pyx_v_dm[1])[0])), (&((__pyx_v_dm[2])[0])), (&((__pyx_v_reciprocal[0])[0]))); + + /* "MDAnalysis/lib/_augment.pyx":135 + * # Calculate reciprocal vectors + * _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) + * _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) # <<<<<<<<<<<<<< + * _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) + * # Normalize + */ + __pyx_f_10MDAnalysis_3lib_6_cutil__cross((&((__pyx_v_dm[2])[0])), (&((__pyx_v_dm[0])[0])), (&((__pyx_v_reciprocal[1])[0]))); + + /* "MDAnalysis/lib/_augment.pyx":136 + * _cross(&dm[1][0], &dm[2][0], &reciprocal[0][0]) + * _cross(&dm[2][0], &dm[0][0], &reciprocal[1][0]) + * _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) # <<<<<<<<<<<<<< + * # Normalize + * for i in range(3): + */ + __pyx_f_10MDAnalysis_3lib_6_cutil__cross((&((__pyx_v_dm[0])[0])), (&((__pyx_v_dm[1])[0])), (&((__pyx_v_reciprocal[2])[0]))); + + /* "MDAnalysis/lib/_augment.pyx":138 + * _cross(&dm[0][0], &dm[1][0], &reciprocal[2][0]) + * # Normalize + * for i in range(3): # <<<<<<<<<<<<<< + * norm = _norm(&reciprocal[i][0]) + * for j in range(3): + */ + for (__pyx_t_7 = 0; __pyx_t_7 < 3; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "MDAnalysis/lib/_augment.pyx":139 + * # Normalize + * for i in range(3): + * norm = _norm(&reciprocal[i][0]) # <<<<<<<<<<<<<< + * for j in range(3): + * reciprocal[i][j] = reciprocal[i][j]/norm + */ + __pyx_v_norm = __pyx_f_10MDAnalysis_3lib_6_cutil__norm((&((__pyx_v_reciprocal[__pyx_v_i])[0]))); + + /* "MDAnalysis/lib/_augment.pyx":140 + * for i in range(3): + * norm = _norm(&reciprocal[i][0]) + * for j in range(3): # <<<<<<<<<<<<<< + * reciprocal[i][j] = reciprocal[i][j]/norm + * + */ + for (__pyx_t_8 = 0; __pyx_t_8 < 3; __pyx_t_8+=1) { + __pyx_v_j = __pyx_t_8; + + /* "MDAnalysis/lib/_augment.pyx":141 + * norm = _norm(&reciprocal[i][0]) + * for j in range(3): + * reciprocal[i][j] = reciprocal[i][j]/norm # <<<<<<<<<<<<<< + * + * N = coordinates.shape[0] + */ + if (unlikely(__pyx_v_norm == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + __PYX_ERR(0, 141, __pyx_L1_error) + } + ((__pyx_v_reciprocal[__pyx_v_i])[__pyx_v_j]) = (((__pyx_v_reciprocal[__pyx_v_i])[__pyx_v_j]) / __pyx_v_norm); + } + } + + /* "MDAnalysis/lib/_augment.pyx":143 + * reciprocal[i][j] = reciprocal[i][j]/norm + * + * N = coordinates.shape[0] # <<<<<<<<<<<<<< + * + * cdef vector[float] output + */ + __pyx_v_N = (__pyx_v_coordinates.shape[0]); + + /* "MDAnalysis/lib/_augment.pyx":148 + * cdef vector[int] indices + * + * for i in range(N): # <<<<<<<<<<<<<< + * for j in range(3): + * coord[j] = coordinates[i, j] + */ + __pyx_t_7 = __pyx_v_N; + __pyx_t_8 = __pyx_t_7; + for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { + __pyx_v_i = __pyx_t_9; + + /* "MDAnalysis/lib/_augment.pyx":149 + * + * for i in range(N): + * for j in range(3): # <<<<<<<<<<<<<< + * coord[j] = coordinates[i, j] + * other[j] = end[j] - coordinates[i, j] + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":150 + * for i in range(N): + * for j in range(3): + * coord[j] = coordinates[i, j] # <<<<<<<<<<<<<< + * other[j] = end[j] - coordinates[i, j] + * # identify the condition + */ + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = __pyx_v_j; + (__pyx_v_coord[__pyx_v_j]) = (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coordinates.data + __pyx_t_11 * __pyx_v_coordinates.strides[0]) )) + __pyx_t_12)) ))); + + /* "MDAnalysis/lib/_augment.pyx":151 + * for j in range(3): + * coord[j] = coordinates[i, j] + * other[j] = end[j] - coordinates[i, j] # <<<<<<<<<<<<<< + * # identify the condition + * lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r + */ + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + (__pyx_v_other[__pyx_v_j]) = ((__pyx_v_end[__pyx_v_j]) - (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coordinates.data + __pyx_t_13 * __pyx_v_coordinates.strides[0]) )) + __pyx_t_14)) )))); + } + + /* "MDAnalysis/lib/_augment.pyx":153 + * other[j] = end[j] - coordinates[i, j] + * # identify the condition + * lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r # <<<<<<<<<<<<<< + * hi_x = _dot(&other[0], &reciprocal[0][0]) <= r + * lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r + */ + __pyx_v_lo_x = (__pyx_f_10MDAnalysis_3lib_6_cutil__dot((&(__pyx_v_coord[0])), (&((__pyx_v_reciprocal[0])[0]))) <= __pyx_v_r); + + /* "MDAnalysis/lib/_augment.pyx":154 + * # identify the condition + * lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r + * hi_x = _dot(&other[0], &reciprocal[0][0]) <= r # <<<<<<<<<<<<<< + * lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r + * hi_y = _dot(&other[0], &reciprocal[1][0]) <= r + */ + __pyx_v_hi_x = (__pyx_f_10MDAnalysis_3lib_6_cutil__dot((&(__pyx_v_other[0])), (&((__pyx_v_reciprocal[0])[0]))) <= __pyx_v_r); + + /* "MDAnalysis/lib/_augment.pyx":155 + * lo_x = _dot(&coord[0], &reciprocal[0][0]) <= r + * hi_x = _dot(&other[0], &reciprocal[0][0]) <= r + * lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r # <<<<<<<<<<<<<< + * hi_y = _dot(&other[0], &reciprocal[1][0]) <= r + * lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r + */ + __pyx_v_lo_y = (__pyx_f_10MDAnalysis_3lib_6_cutil__dot((&(__pyx_v_coord[0])), (&((__pyx_v_reciprocal[1])[0]))) <= __pyx_v_r); + + /* "MDAnalysis/lib/_augment.pyx":156 + * hi_x = _dot(&other[0], &reciprocal[0][0]) <= r + * lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r + * hi_y = _dot(&other[0], &reciprocal[1][0]) <= r # <<<<<<<<<<<<<< + * lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r + * hi_z = _dot(&other[0], &reciprocal[2][0]) <= r + */ + __pyx_v_hi_y = (__pyx_f_10MDAnalysis_3lib_6_cutil__dot((&(__pyx_v_other[0])), (&((__pyx_v_reciprocal[1])[0]))) <= __pyx_v_r); + + /* "MDAnalysis/lib/_augment.pyx":157 + * lo_y = _dot(&coord[0], &reciprocal[1][0]) <= r + * hi_y = _dot(&other[0], &reciprocal[1][0]) <= r + * lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r # <<<<<<<<<<<<<< + * hi_z = _dot(&other[0], &reciprocal[2][0]) <= r + * + */ + __pyx_v_lo_z = (__pyx_f_10MDAnalysis_3lib_6_cutil__dot((&(__pyx_v_coord[0])), (&((__pyx_v_reciprocal[2])[0]))) <= __pyx_v_r); + + /* "MDAnalysis/lib/_augment.pyx":158 + * hi_y = _dot(&other[0], &reciprocal[1][0]) <= r + * lo_z = _dot(&coord[0], &reciprocal[2][0]) <= r + * hi_z = _dot(&other[0], &reciprocal[2][0]) <= r # <<<<<<<<<<<<<< + * + * if lo_x: + */ + __pyx_v_hi_z = (__pyx_f_10MDAnalysis_3lib_6_cutil__dot((&(__pyx_v_other[0])), (&((__pyx_v_reciprocal[2])[0]))) <= __pyx_v_r); + + /* "MDAnalysis/lib/_augment.pyx":160 + * hi_z = _dot(&other[0], &reciprocal[2][0]) <= r + * + * if lo_x: # <<<<<<<<<<<<<< + * # if X, face piece + * for j in range(3): + */ + __pyx_t_15 = (__pyx_v_lo_x != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":162 + * if lo_x: + * # if X, face piece + * for j in range(3): # <<<<<<<<<<<<<< + * # add to output + * output.push_back(coord[j] + shiftX[j]) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":164 + * for j in range(3): + * # add to output + * output.push_back(coord[j] + shiftX[j]) # <<<<<<<<<<<<<< + * # keep record of which index this augmented + * # position was created from + */ + try { + __pyx_v_output.push_back(((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 164, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":167 + * # keep record of which index this augmented + * # position was created from + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_y: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 167, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":169 + * indices.push_back(i) + * + * if lo_y: # <<<<<<<<<<<<<< + * # if X&Y, edge piece + * for j in range(3): + */ + __pyx_t_15 = (__pyx_v_lo_y != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":171 + * if lo_y: + * # if X&Y, edge piece + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] + shiftY[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":172 + * # if X&Y, edge piece + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftY[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 172, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":173 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 173, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":175 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * # if X&Y&Z, corner piece + * for j in range(3): + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":177 + * if lo_z: + * # if X&Y&Z, corner piece + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":178 + * # if X&Y&Z, corner piece + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftY[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 178, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":179 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 179, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":175 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * # if X&Y&Z, corner piece + * for j in range(3): + */ + goto __pyx_L19; + } + + /* "MDAnalysis/lib/_augment.pyx":181 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":182 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":183 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftY[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 183, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":184 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_y: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 184, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":181 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftY[j] - shiftZ[j]) + */ + } + __pyx_L19:; + + /* "MDAnalysis/lib/_augment.pyx":169 + * indices.push_back(i) + * + * if lo_y: # <<<<<<<<<<<<<< + * # if X&Y, edge piece + * for j in range(3): + */ + goto __pyx_L16; + } + + /* "MDAnalysis/lib/_augment.pyx":186 + * indices.push_back(i) + * + * elif hi_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j]) + */ + __pyx_t_15 = (__pyx_v_hi_y != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":187 + * + * elif hi_y: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] - shiftY[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":188 + * elif hi_y: + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftY[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 188, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":189 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 189, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":191 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":192 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":193 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftY[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 193, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":194 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 194, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":191 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] + shiftZ[j]) + */ + goto __pyx_L26; + } + + /* "MDAnalysis/lib/_augment.pyx":196 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":197 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":198 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftY[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 198, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":199 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 199, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":196 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j] - shiftZ[j]) + */ + } + __pyx_L26:; + + /* "MDAnalysis/lib/_augment.pyx":186 + * indices.push_back(i) + * + * elif hi_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftY[j]) + */ + } + __pyx_L16:; + + /* "MDAnalysis/lib/_augment.pyx":201 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":202 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":203 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 203, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":204 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 204, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":201 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] + shiftZ[j]) + */ + goto __pyx_L31; + } + + /* "MDAnalysis/lib/_augment.pyx":206 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":207 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftX[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":208 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 208, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":209 + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_x: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 209, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":206 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftX[j] - shiftZ[j]) + */ + } + __pyx_L31:; + + /* "MDAnalysis/lib/_augment.pyx":160 + * hi_z = _dot(&other[0], &reciprocal[2][0]) <= r + * + * if lo_x: # <<<<<<<<<<<<<< + * # if X, face piece + * for j in range(3): + */ + goto __pyx_L13; + } + + /* "MDAnalysis/lib/_augment.pyx":211 + * indices.push_back(i) + * + * elif hi_x: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j]) + */ + __pyx_t_15 = (__pyx_v_hi_x != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":212 + * + * elif hi_x: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":213 + * elif hi_x: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 213, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":214 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_y: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 214, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":216 + * indices.push_back(i) + * + * if lo_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j]) + */ + __pyx_t_15 = (__pyx_v_lo_y != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":217 + * + * if lo_y: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] + shiftY[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":218 + * if lo_y: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftY[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 218, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":219 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 219, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":221 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":222 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":223 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftY[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 223, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":224 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 224, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":221 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] + shiftZ[j]) + */ + goto __pyx_L41; + } + + /* "MDAnalysis/lib/_augment.pyx":226 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":227 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":228 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftY[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 228, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":229 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_y: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 229, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":226 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j] - shiftZ[j]) + */ + } + __pyx_L41:; + + /* "MDAnalysis/lib/_augment.pyx":216 + * indices.push_back(i) + * + * if lo_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftY[j]) + */ + goto __pyx_L38; + } + + /* "MDAnalysis/lib/_augment.pyx":231 + * indices.push_back(i) + * + * elif hi_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j]) + */ + __pyx_t_15 = (__pyx_v_hi_y != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":232 + * + * elif hi_y: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] - shiftY[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":233 + * elif hi_y: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftY[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 233, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":234 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 234, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":236 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":237 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":238 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftY[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 238, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":239 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 239, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":236 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] + shiftZ[j]) + */ + goto __pyx_L48; + } + + /* "MDAnalysis/lib/_augment.pyx":241 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":242 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":243 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftY[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 243, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":244 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 244, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":241 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j] - shiftZ[j]) + */ + } + __pyx_L48:; + + /* "MDAnalysis/lib/_augment.pyx":231 + * indices.push_back(i) + * + * elif hi_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftY[j]) + */ + } + __pyx_L38:; + + /* "MDAnalysis/lib/_augment.pyx":246 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":247 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":248 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 248, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":249 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 249, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":246 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] + shiftZ[j]) + */ + goto __pyx_L53; + } + + /* "MDAnalysis/lib/_augment.pyx":251 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":252 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftX[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":253 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftX[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 253, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":254 + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_y: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 254, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":251 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j] - shiftZ[j]) + */ + } + __pyx_L53:; + + /* "MDAnalysis/lib/_augment.pyx":211 + * indices.push_back(i) + * + * elif hi_x: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftX[j]) + */ + } + __pyx_L13:; + + /* "MDAnalysis/lib/_augment.pyx":256 + * indices.push_back(i) + * + * if lo_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftY[j]) + */ + __pyx_t_15 = (__pyx_v_lo_y != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":257 + * + * if lo_y: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftY[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":258 + * if lo_y: + * for j in range(3): + * output.push_back(coord[j] + shiftY[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftY[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 258, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":259 + * for j in range(3): + * output.push_back(coord[j] + shiftY[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 259, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":261 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":262 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftY[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":263 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftY[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 263, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":264 + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 264, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":261 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] + shiftZ[j]) + */ + goto __pyx_L61; + } + + /* "MDAnalysis/lib/_augment.pyx":266 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":267 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftY[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":268 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftY[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 268, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":269 + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_y: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 269, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":266 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftY[j] - shiftZ[j]) + */ + } + __pyx_L61:; + + /* "MDAnalysis/lib/_augment.pyx":256 + * indices.push_back(i) + * + * if lo_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftY[j]) + */ + goto __pyx_L58; + } + + /* "MDAnalysis/lib/_augment.pyx":271 + * indices.push_back(i) + * + * elif hi_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftY[j]) + */ + __pyx_t_15 = (__pyx_v_hi_y != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":272 + * + * elif hi_y: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftY[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":273 + * elif hi_y: + * for j in range(3): + * output.push_back(coord[j] - shiftY[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftY[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 273, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":274 + * for j in range(3): + * output.push_back(coord[j] - shiftY[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 274, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":276 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":277 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftY[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":278 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftY[__pyx_v_j])) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 278, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":279 + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 279, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":276 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] + shiftZ[j]) + */ + goto __pyx_L68; + } + + /* "MDAnalysis/lib/_augment.pyx":281 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":282 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftY[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":283 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back((((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftY[__pyx_v_j])) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 283, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":284 + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * if lo_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 284, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":281 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftY[j] - shiftZ[j]) + */ + } + __pyx_L68:; + + /* "MDAnalysis/lib/_augment.pyx":271 + * indices.push_back(i) + * + * elif hi_y: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftY[j]) + */ + } + __pyx_L58:; + + /* "MDAnalysis/lib/_augment.pyx":286 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_lo_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":287 + * + * if lo_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] + shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":288 + * if lo_z: + * for j in range(3): + * output.push_back(coord[j] + shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * + */ + try { + __pyx_v_output.push_back(((__pyx_v_coord[__pyx_v_j]) + (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 288, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":289 + * for j in range(3): + * output.push_back(coord[j] + shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * + * elif hi_z: + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 289, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":286 + * indices.push_back(i) + * + * if lo_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] + shiftZ[j]) + */ + goto __pyx_L73; + } + + /* "MDAnalysis/lib/_augment.pyx":291 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftZ[j]) + */ + __pyx_t_15 = (__pyx_v_hi_z != 0); + if (__pyx_t_15) { + + /* "MDAnalysis/lib/_augment.pyx":292 + * + * elif hi_z: + * for j in range(3): # <<<<<<<<<<<<<< + * output.push_back(coord[j] - shiftZ[j]) + * indices.push_back(i) + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_j = __pyx_t_10; + + /* "MDAnalysis/lib/_augment.pyx":293 + * elif hi_z: + * for j in range(3): + * output.push_back(coord[j] - shiftZ[j]) # <<<<<<<<<<<<<< + * indices.push_back(i) + * n = indices.size() + */ + try { + __pyx_v_output.push_back(((__pyx_v_coord[__pyx_v_j]) - (__pyx_v_shiftZ[__pyx_v_j]))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 293, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_augment.pyx":294 + * for j in range(3): + * output.push_back(coord[j] - shiftZ[j]) + * indices.push_back(i) # <<<<<<<<<<<<<< + * n = indices.size() + * return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) + */ + try { + __pyx_v_indices.push_back(__pyx_v_i); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 294, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_augment.pyx":291 + * indices.push_back(i) + * + * elif hi_z: # <<<<<<<<<<<<<< + * for j in range(3): + * output.push_back(coord[j] - shiftZ[j]) + */ + } + __pyx_L73:; + } + + /* "MDAnalysis/lib/_augment.pyx":295 + * output.push_back(coord[j] - shiftZ[j]) + * indices.push_back(i) + * n = indices.size() # <<<<<<<<<<<<<< + * return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) + * + */ + __pyx_v_n = __pyx_v_indices.size(); + + /* "MDAnalysis/lib/_augment.pyx":296 + * indices.push_back(i) + * n = indices.size() + * return np.asarray(output, dtype=np.float32).reshape(n, 3), np.asarray(indices, dtype=np.int64) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __pyx_convert_vector_to_py_float(__pyx_v_output); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float32); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_16) < 0) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_16, __pyx_n_s_reshape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __pyx_t_16 = __Pyx_PyInt_FromSize_t(__pyx_v_n); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_3 = NULL; + __pyx_t_7 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_7 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_t_16, __pyx_int_3}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_t_16, __pyx_int_3}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (__pyx_t_3) { + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL; + } + __Pyx_GIVEREF(__pyx_t_16); + PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_7, __pyx_t_16); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_7, __pyx_int_3); + __pyx_t_16 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __pyx_convert_vector_to_py_int(__pyx_v_indices); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_int64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_16, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); + __pyx_t_1 = 0; + __pyx_t_4 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/_augment.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): # <<<<<<<<<<<<<< + * r"""Calculates the periodic images of particles which are within a distance + * `r` from the box walls. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_AddTraceback("MDAnalysis.lib._augment.augment_coordinates", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_coordinates, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_box, 1); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/_augment.pyx":301 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): # <<<<<<<<<<<<<< + * """Translate augmented indices back to original indices. + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_8_augment_3undo_augment(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_8_augment_2undo_augment[] = "Translate augmented indices back to original indices.\n\n Parameters\n ----------\n results : numpy.ndarray\n Array of dtype ``numpy.int64`` containing coordinate indices, including\n \"augmented\" indices.\n translation : numpy.ndarray\n Index map of dtype ``numpy.int64`` linking the augmented indices to the\n original particle indices such that\n ``translation[augmented_index] = original_index``.\n nreal : int\n Number of real coordinates, i.e., indices in `results` equal or larger\n than this need to be mapped to their real counterpart.\n\n Returns\n -------\n results : numpy.ndarray\n Modified input `results` with all the augmented indices translated to\n their corresponding initial original indices.\n\n Note\n ----\n Modifies the results array in place.\n\n See Also\n --------\n :meth:`augment_coordinates`\n\n\n .. versionadded:: 0.19.0\n "; +static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_8_augment_3undo_augment = {"undo_augment", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_8_augment_3undo_augment, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10MDAnalysis_3lib_8_augment_2undo_augment}; +static PyObject *__pyx_pw_10MDAnalysis_3lib_8_augment_3undo_augment(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + __Pyx_memviewslice __pyx_v_results = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_translation = { 0, 0, { 0 }, { 0 }, { 0 } }; + int __pyx_v_nreal; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("undo_augment (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_results,&__pyx_n_s_translation,&__pyx_n_s_nreal,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_translation)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("undo_augment", 1, 3, 3, 1); __PYX_ERR(0, 301, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_nreal)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("undo_augment", 1, 3, 3, 2); __PYX_ERR(0, 301, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "undo_augment") < 0)) __PYX_ERR(0, 301, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_results = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_results.memview)) __PYX_ERR(0, 301, __pyx_L3_error) + __pyx_v_translation = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_translation.memview)) __PYX_ERR(0, 301, __pyx_L3_error) + __pyx_v_nreal = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_nreal == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 301, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("undo_augment", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 301, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib._augment.undo_augment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_8_augment_2undo_augment(__pyx_self, __pyx_v_results, __pyx_v_translation, __pyx_v_nreal); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_8_augment_2undo_augment(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_results, __Pyx_memviewslice __pyx_v_translation, int __pyx_v_nreal) { + int __pyx_v_N; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + __pyx_t_5numpy_int64_t __pyx_t_7; + Py_ssize_t __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + __Pyx_RefNannySetupContext("undo_augment", 0); + + /* "MDAnalysis/lib/_augment.pyx":336 + * cdef int N + * cdef ssize_t i + * N = results.shape[0] # <<<<<<<<<<<<<< + * + * for i in range(N): + */ + __pyx_v_N = (__pyx_v_results.shape[0]); + + /* "MDAnalysis/lib/_augment.pyx":338 + * N = results.shape[0] + * + * for i in range(N): # <<<<<<<<<<<<<< + * if results[i] >= nreal: + * results[i] = translation[results[i] - nreal] + */ + __pyx_t_1 = __pyx_v_N; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "MDAnalysis/lib/_augment.pyx":339 + * + * for i in range(N): + * if results[i] >= nreal: # <<<<<<<<<<<<<< + * results[i] = translation[results[i] - nreal] + * return np.asarray(results, dtype=np.int64) + */ + __pyx_t_4 = __pyx_v_i; + __pyx_t_5 = (((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_results.data + __pyx_t_4 * __pyx_v_results.strides[0]) ))) >= __pyx_v_nreal) != 0); + if (__pyx_t_5) { + + /* "MDAnalysis/lib/_augment.pyx":340 + * for i in range(N): + * if results[i] >= nreal: + * results[i] = translation[results[i] - nreal] # <<<<<<<<<<<<<< + * return np.asarray(results, dtype=np.int64) + */ + __pyx_t_6 = __pyx_v_i; + __pyx_t_7 = ((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_results.data + __pyx_t_6 * __pyx_v_results.strides[0]) ))) - __pyx_v_nreal); + __pyx_t_8 = __pyx_v_i; + *((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_results.data + __pyx_t_8 * __pyx_v_results.strides[0]) )) = (*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_translation.data + __pyx_t_7 * __pyx_v_translation.strides[0]) ))); + + /* "MDAnalysis/lib/_augment.pyx":339 + * + * for i in range(N): + * if results[i] >= nreal: # <<<<<<<<<<<<<< + * results[i] = translation[results[i] - nreal] + * return np.asarray(results, dtype=np.int64) + */ + } + } + + /* "MDAnalysis/lib/_augment.pyx":341 + * if results[i] >= nreal: + * results[i] = translation[results[i] - nreal] + * return np.asarray(results, dtype=np.int64) # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_asarray); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_9 = __pyx_memoryview_fromslice(__pyx_v_results, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_int64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_int64_t, 0);; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_t_9 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_12 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_12, __pyx_n_s_int64); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_dtype, __pyx_t_13) < 0) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_11, __pyx_t_9); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 341, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_r = __pyx_t_13; + __pyx_t_13 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/_augment.pyx":301 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): # <<<<<<<<<<<<<< + * """Translate augmented indices back to original indices. + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_AddTraceback("MDAnalysis.lib._augment.undo_augment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_results, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_translation, 1); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fulfill the PEP. + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_i; + int __pyx_v_ndim; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + int __pyx_v_t; + char *__pyx_v_f; + PyArray_Descr *__pyx_v_descr = 0; + int __pyx_v_offset; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + char *__pyx_t_8; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + * + * cdef int i, ndim + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + */ + __pyx_v_endian_detector = 1; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + * cdef int i, ndim + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * + * ndim = PyArray_NDIM(self) + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + */ + __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not C contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 229, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 229, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L7_bool_binop_done; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not Fortran contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L7_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 233, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + * raise ValueError(u"ndarray is not Fortran contiguous") + * + * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + * + * info.buf = PyArray_DATA(self) + * info.ndim = ndim # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * # Allocate new buffer for strides and shape info. + */ + __pyx_v_info->ndim = __pyx_v_ndim; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< + * info.shape = info.strides + ndim + * for i in range(ndim): + */ + __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + * # This is allocated as one block, strides first. + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) + * info.shape = info.strides + ndim # <<<<<<<<<<<<<< + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + */ + __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) + * info.shape = info.strides + ndim + * for i in range(ndim): # <<<<<<<<<<<<<< + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] + */ + __pyx_t_4 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + * info.shape = info.strides + ndim + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + */ + (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< + * else: + * info.strides = PyArray_STRIDES(self) + */ + (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + goto __pyx_L9; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + */ + /*else*/ { + __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + * else: + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + */ + __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); + } + __pyx_L9:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) + */ + __pyx_v_info->suboffsets = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< + * info.readonly = not PyArray_ISWRITEABLE(self) + * + */ + __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< + * + * cdef int t + */ + __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + * + * cdef int t + * cdef char* f = NULL # <<<<<<<<<<<<<< + * cdef dtype descr = self.descr + * cdef int offset + */ + __pyx_v_f = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + * cdef int t + * cdef char* f = NULL + * cdef dtype descr = self.descr # <<<<<<<<<<<<<< + * cdef int offset + * + */ + __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + * cdef int offset + * + * info.obj = self # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(descr): + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * info.obj = self + * + * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + * + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num # <<<<<<<<<<<<<< + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + */ + __pyx_t_4 = __pyx_v_descr->type_num; + __pyx_v_t = __pyx_t_4; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); + if (!__pyx_t_2) { + goto __pyx_L15_next_or; + } else { + } + __pyx_t_2 = (__pyx_v_little_endian != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L14_bool_binop_done; + } + __pyx_L15_next_or:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L14_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 263, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + */ + switch (__pyx_v_t) { + case NPY_BYTE: + __pyx_v_f = ((char *)"b"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + */ + case NPY_UBYTE: + __pyx_v_f = ((char *)"B"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + */ + case NPY_SHORT: + __pyx_v_f = ((char *)"h"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + */ + case NPY_USHORT: + __pyx_v_f = ((char *)"H"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + */ + case NPY_INT: + __pyx_v_f = ((char *)"i"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + */ + case NPY_UINT: + __pyx_v_f = ((char *)"I"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + */ + case NPY_LONG: + __pyx_v_f = ((char *)"l"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + */ + case NPY_ULONG: + __pyx_v_f = ((char *)"L"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + */ + case NPY_LONGLONG: + __pyx_v_f = ((char *)"q"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + */ + case NPY_ULONGLONG: + __pyx_v_f = ((char *)"Q"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + */ + case NPY_FLOAT: + __pyx_v_f = ((char *)"f"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + */ + case NPY_DOUBLE: + __pyx_v_f = ((char *)"d"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + */ + case NPY_LONGDOUBLE: + __pyx_v_f = ((char *)"g"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + */ + case NPY_CFLOAT: + __pyx_v_f = ((char *)"Zf"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" + */ + case NPY_CDOUBLE: + __pyx_v_f = ((char *)"Zd"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f = "O" + * else: + */ + case NPY_CLONGDOUBLE: + __pyx_v_f = ((char *)"Zg"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + case NPY_OBJECT: + __pyx_v_f = ((char *)"O"); + break; + default: + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + * elif t == NPY_OBJECT: f = "O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * info.format = f + * return + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 282, __pyx_L1_error) + break; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f # <<<<<<<<<<<<<< + * return + * else: + */ + __pyx_v_info->format = __pyx_v_f; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f + * return # <<<<<<<<<<<<<< + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * info.obj = self + * + * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + * return + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + */ + /*else*/ { + __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, + */ + (__pyx_v_info->format[0]) = '^'; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + * info.format = PyObject_Malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 # <<<<<<<<<<<<<< + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + */ + __pyx_v_offset = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< + * info.format + _buffer_format_string_len, + * &offset) + */ + __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) + __pyx_v_f = __pyx_t_8; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + * info.format + _buffer_format_string_len, + * &offset) + * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + */ + (__pyx_v_f[0]) = '\x00'; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fulfill the PEP. + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + */ + +/* Python wrapper */ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); + __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__releasebuffer__", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * PyObject_Free(info.strides) + */ + PyObject_Free(__pyx_v_info->format); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * PyObject_Free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * PyObject_Free(info.strides) # <<<<<<<<<<<<<< + * # info.shape was stored after info.strides in the same block + * + */ + PyObject_Free(__pyx_v_info->strides); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * PyObject_Free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 785, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 788, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + * return () + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { + PyArray_Descr *__pyx_v_child = 0; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + PyObject *__pyx_v_fields = 0; + PyObject *__pyx_v_childname = NULL; + PyObject *__pyx_v_new_offset = NULL; + PyObject *__pyx_v_t = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + long __pyx_t_8; + char *__pyx_t_9; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + * + * cdef dtype child + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef tuple fields + */ + __pyx_v_endian_detector = 1; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + * cdef dtype child + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * cdef tuple fields + * + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + if (unlikely(__pyx_v_descr->names == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 805, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 805, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 805, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + * + * for childname in descr.names: + * fields = descr.fields[childname] # <<<<<<<<<<<<<< + * child, new_offset = fields + * + */ + if (unlikely(__pyx_v_descr->fields == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 806, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 806, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 806, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + * for childname in descr.names: + * fields = descr.fields[childname] + * child, new_offset = fields # <<<<<<<<<<<<<< + * + * if (end - f) - (new_offset - offset[0]) < 15: + */ + if (likely(__pyx_v_fields != Py_None)) { + PyObject* sequence = __pyx_v_fields; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 807, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 807, __pyx_L1_error) + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); + __pyx_t_3 = 0; + __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 809, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 809, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 809, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 810, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); + if (!__pyx_t_7) { + goto __pyx_L8_next_or; + } else { + } + __pyx_t_7 = (__pyx_v_little_endian != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_L8_next_or:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + * + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * # One could encode it in the format string and have Cython + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_6 = __pyx_t_7; + __pyx_L7_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 814, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + * + * # Output padding bytes + * while offset[0] < new_offset: # <<<<<<<<<<<<<< + * f[0] = 120 # "x"; pad byte + * f += 1 + */ + while (1) { + __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 824, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 824, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 824, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + * # Output padding bytes + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< + * f += 1 + * offset[0] += 1 + */ + (__pyx_v_f[0]) = 0x78; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte + * f += 1 # <<<<<<<<<<<<<< + * offset[0] += 1 + * + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + * f[0] = 120 # "x"; pad byte + * f += 1 + * offset[0] += 1 # <<<<<<<<<<<<<< + * + * offset[0] += child.itemsize + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + * offset[0] += 1 + * + * offset[0] += child.itemsize # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(child): + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); + if (__pyx_t_6) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + * + * if not PyDataType_HASFIELDS(child): + * t = child.type_num # <<<<<<<<<<<<<< + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 834, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + * + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 843, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 843, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 843, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 845, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 845, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 845, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 846, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 846, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 846, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 847, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 847, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 847, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 848, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 848, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 848, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 849, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 849, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 849, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 850, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 850, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 850, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x66; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 851, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 851, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 851, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x64; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 852, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 852, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 852, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x67; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 853, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 853, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 853, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (likely(__pyx_t_6)) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * f += 1 + * else: + */ + /*else*/ { + __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 855, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 855, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 855, __pyx_L1_error) + } + __pyx_L15:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * f += 1 # <<<<<<<<<<<<<< + * else: + * # Cython ignores struct boundary information ("T{...}"), + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + goto __pyx_L13; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + * # Cython ignores struct boundary information ("T{...}"), + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< + * return f + * + */ + /*else*/ { + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(1, 860, __pyx_L1_error) + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) + * return f # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + * return () + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_child); + __Pyx_XDECREF(__pyx_v_fields); + __Pyx_XDECREF(__pyx_v_childname); + __Pyx_XDECREF(__pyx_v_new_offset); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + PyObject *__pyx_v_baseptr; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("set_array_base", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + __pyx_t_1 = (__pyx_v_base == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + * cdef PyObject* baseptr + * if base is None: + * baseptr = NULL # <<<<<<<<<<<<<< + * else: + * Py_INCREF(base) # important to do this before decref below! + */ + __pyx_v_baseptr = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + goto __pyx_L3; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + * baseptr = NULL + * else: + * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< + * baseptr = base + * Py_XDECREF(arr.base) + */ + /*else*/ { + Py_INCREF(__pyx_v_base); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + * else: + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base # <<<<<<<<<<<<<< + * Py_XDECREF(arr.base) + * arr.base = baseptr + */ + __pyx_v_baseptr = ((PyObject *)__pyx_v_base); + } + __pyx_L3:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base + * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< + * arr.base = baseptr + * + */ + Py_XDECREF(__pyx_v_arr->base); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + * baseptr = base + * Py_XDECREF(arr.base) + * arr.base = baseptr # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_v_arr->base = __pyx_v_baseptr; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: + * return None # <<<<<<<<<<<<<< + * else: + * return arr.base + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + * return None + * else: + * return arr.base # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); + __pyx_r = ((PyObject *)__pyx_v_arr->base); + goto __pyx_L0; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_array", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + * cdef inline int import_array() except -1: + * try: + * _import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + * try: + * _import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 999, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1000, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1000, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_umath", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1005, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1006, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1006, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_ufunc", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1011, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1012, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1012, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "carray.from_py":77 + * + * @cname("__Pyx_carray_from_py_float") + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< + * cdef Py_ssize_t i = length + * try: + */ + +static int __Pyx_carray_from_py_float(PyObject *__pyx_v_o, float *__pyx_v_v, Py_ssize_t __pyx_v_length) { + Py_ssize_t __pyx_v_i; + PyObject *__pyx_v_item = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + PyObject *(*__pyx_t_9)(PyObject *); + PyObject *__pyx_t_10 = NULL; + float __pyx_t_11; + char const *__pyx_t_12; + __Pyx_RefNannySetupContext("__Pyx_carray_from_py_float", 0); + + /* "carray.from_py":78 + * @cname("__Pyx_carray_from_py_float") + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length # <<<<<<<<<<<<<< + * try: + * i = len(o) + */ + __pyx_v_i = __pyx_v_length; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "carray.from_py":80 + * cdef Py_ssize_t i = length + * try: + * i = len(o) # <<<<<<<<<<<<<< + * except (TypeError, OverflowError): + * pass + */ + __pyx_t_4 = PyObject_Length(__pyx_v_o); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(2, 80, __pyx_L3_error) + __pyx_v_i = __pyx_t_4; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "carray.from_py":81 + * try: + * i = len(o) + * except (TypeError, OverflowError): # <<<<<<<<<<<<<< + * pass + * if i == length: + */ + __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_OverflowError); + if (__pyx_t_5) { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L4_exception_handled; + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L4_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L8_try_end:; + } + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_t_4 = 0; + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_7 = __pyx_v_o; __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0; + __pyx_t_9 = NULL; + } else { + __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 84, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_9)) { + if (likely(PyList_CheckExact(__pyx_t_7))) { + if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } else { + if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } + } else { + __pyx_t_10 = __pyx_t_9(__pyx_t_7); + if (unlikely(!__pyx_t_10)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 84, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_10); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_10); + __pyx_t_10 = 0; + __pyx_v_i = __pyx_t_4; + __pyx_t_4 = (__pyx_t_4 + 1); + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + __pyx_t_6 = ((__pyx_v_i >= __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":86 + * for i, item in enumerate(o): + * if i >= length: + * break # <<<<<<<<<<<<<< + * v[i] = item + * else: + */ + goto __pyx_L11_break; + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + } + + /* "carray.from_py":87 + * if i >= length: + * break + * v[i] = item # <<<<<<<<<<<<<< + * else: + * i += 1 # convert index to length + */ + __pyx_t_11 = __pyx_PyFloat_AsFloat(__pyx_v_item); if (unlikely((__pyx_t_11 == (float)-1) && PyErr_Occurred())) __PYX_ERR(2, 87, __pyx_L1_error) + (__pyx_v_v[__pyx_v_i]) = __pyx_t_11; + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + } + /*else*/ { + + /* "carray.from_py":89 + * v[i] = item + * else: + * i += 1 # convert index to length # <<<<<<<<<<<<<< + * if i == length: + * return 0 + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":91 + * i += 1 # convert index to length + * if i == length: + * return 0 # <<<<<<<<<<<<<< + * + * PyErr_Format( + */ + __pyx_r = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L0; + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + } + } + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_L11_break:; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + } + + /* "carray.from_py":96 + * IndexError, + * ("too many values found during array assignment, expected %zd" + * if i >= length else # <<<<<<<<<<<<<< + * "not enough values found during array assignment, expected %zd, got %zd"), + * length, i) + */ + if (((__pyx_v_i >= __pyx_v_length) != 0)) { + __pyx_t_12 = ((char const *)"too many values found during array assignment, expected %zd"); + } else { + __pyx_t_12 = ((char const *)"not enough values found during array assignment, expected %zd, got %zd"); + } + + /* "carray.from_py":93 + * return 0 + * + * PyErr_Format( # <<<<<<<<<<<<<< + * IndexError, + * ("too many values found during array assignment, expected %zd" + */ + __pyx_t_7 = PyErr_Format(__pyx_builtin_IndexError, __pyx_t_12, __pyx_v_length, __pyx_v_i); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":77 + * + * @cname("__Pyx_carray_from_py_float") + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< + * cdef Py_ssize_t i = length + * try: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("carray.from_py.__Pyx_carray_from_py_float", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __Pyx_carray_from_py_float___5b_3_5d_(PyObject *__pyx_v_o, float (*__pyx_v_v)[3], Py_ssize_t __pyx_v_length) { + Py_ssize_t __pyx_v_i; + PyObject *__pyx_v_item = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + PyObject *(*__pyx_t_9)(PyObject *); + PyObject *__pyx_t_10 = NULL; + float __pyx_t_11[3]; + char const *__pyx_t_12; + __Pyx_RefNannySetupContext("__Pyx_carray_from_py_float___5b_3_5d_", 0); + + /* "carray.from_py":78 + * @cname("__Pyx_carray_from_py_float___5b_3_5d_") + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length # <<<<<<<<<<<<<< + * try: + * i = len(o) + */ + __pyx_v_i = __pyx_v_length; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "carray.from_py":80 + * cdef Py_ssize_t i = length + * try: + * i = len(o) # <<<<<<<<<<<<<< + * except (TypeError, OverflowError): + * pass + */ + __pyx_t_4 = PyObject_Length(__pyx_v_o); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(2, 80, __pyx_L3_error) + __pyx_v_i = __pyx_t_4; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "carray.from_py":81 + * try: + * i = len(o) + * except (TypeError, OverflowError): # <<<<<<<<<<<<<< + * pass + * if i == length: + */ + __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_OverflowError); + if (__pyx_t_5) { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L4_exception_handled; + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L4_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L8_try_end:; + } + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_t_4 = 0; + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_7 = __pyx_v_o; __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0; + __pyx_t_9 = NULL; + } else { + __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 84, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_9)) { + if (likely(PyList_CheckExact(__pyx_t_7))) { + if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } else { + if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } + } else { + __pyx_t_10 = __pyx_t_9(__pyx_t_7); + if (unlikely(!__pyx_t_10)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 84, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_10); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_10); + __pyx_t_10 = 0; + __pyx_v_i = __pyx_t_4; + __pyx_t_4 = (__pyx_t_4 + 1); + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + __pyx_t_6 = ((__pyx_v_i >= __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":86 + * for i, item in enumerate(o): + * if i >= length: + * break # <<<<<<<<<<<<<< + * v[i] = item + * else: + */ + goto __pyx_L11_break; + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + } + + /* "carray.from_py":87 + * if i >= length: + * break + * v[i] = item # <<<<<<<<<<<<<< + * else: + * i += 1 # convert index to length + */ + if (unlikely(__Pyx_carray_from_py_float(__pyx_v_item, __pyx_t_11, 3) < 0)) __PYX_ERR(2, 87, __pyx_L1_error) + memcpy(&((__pyx_v_v[__pyx_v_i])[0]), __pyx_t_11, sizeof((__pyx_v_v[__pyx_v_i])[0]) * (3)); + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + } + /*else*/ { + + /* "carray.from_py":89 + * v[i] = item + * else: + * i += 1 # convert index to length # <<<<<<<<<<<<<< + * if i == length: + * return 0 + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":91 + * i += 1 # convert index to length + * if i == length: + * return 0 # <<<<<<<<<<<<<< + * + * PyErr_Format( + */ + __pyx_r = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L0; + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + } + } + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_L11_break:; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + } + + /* "carray.from_py":96 + * IndexError, + * ("too many values found during array assignment, expected %zd" + * if i >= length else # <<<<<<<<<<<<<< + * "not enough values found during array assignment, expected %zd, got %zd"), + * length, i) + */ + if (((__pyx_v_i >= __pyx_v_length) != 0)) { + __pyx_t_12 = ((char const *)"too many values found during array assignment, expected %zd"); + } else { + __pyx_t_12 = ((char const *)"not enough values found during array assignment, expected %zd, got %zd"); + } + + /* "carray.from_py":93 + * return 0 + * + * PyErr_Format( # <<<<<<<<<<<<<< + * IndexError, + * ("too many values found during array assignment, expected %zd" + */ + __pyx_t_7 = PyErr_Format(__pyx_builtin_IndexError, __pyx_t_12, __pyx_v_length, __pyx_v_i); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":77 + * + * @cname("__Pyx_carray_from_py_float___5b_3_5d_") + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< + * cdef Py_ssize_t i = length + * try: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("carray.from_py.__Pyx_carray_from_py_float___5b_3_5d_", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py_float") + * cdef object __pyx_convert_vector_to_py_float(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + +static PyObject *__pyx_convert_vector_to_py_float(const std::vector &__pyx_v_v) { + size_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + size_t __pyx_t_2; + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_float", 0); + + /* "vector.to_py":61 + * @cname("__pyx_convert_vector_to_py_float") + * cdef object __pyx_convert_vector_to_py_float(vector[X]& v): + * return [v[i] for i in range(v.size())] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_v_v.size(); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + __pyx_t_5 = PyFloat_FromDouble((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py_float") + * cdef object __pyx_convert_vector_to_py_float(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("vector.to_py.__pyx_convert_vector_to_py_float", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_convert_vector_to_py_int(const std::vector &__pyx_v_v) { + size_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + size_t __pyx_t_2; + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_int", 0); + + /* "vector.to_py":61 + * @cname("__pyx_convert_vector_to_py_int") + * cdef object __pyx_convert_vector_to_py_int(vector[X]& v): + * return [v[i] for i in range(v.size())] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_v_v.size(); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + __pyx_t_5 = __Pyx_PyInt_From_int((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py_int") + * cdef object __pyx_convert_vector_to_py_int(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("vector.to_py.__pyx_convert_vector_to_py_int", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + PyObject* values[5] = {0,0,0,0,0}; + values[3] = ((PyObject *)__pyx_n_s_c); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_shape)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_itemsize)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(2, 121, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_format)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(2, 121, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mode); + if (value) { values[3] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_allocate_buffer); + if (value) { values[4] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 121, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 121, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 122, __pyx_L3_error) + } else { + + /* "View.MemoryView":122 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 121, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(2, 121, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(2, 121, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_dim; + PyObject **__pyx_v_p; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + char *__pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + Py_ssize_t __pyx_t_11; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":128 + * cdef PyObject **p + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 128, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(2, 128, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":129 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":131 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") + * + */ + __pyx_t_2 = ((!(__pyx_v_self->ndim != 0)) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":132 + * + * if not self.ndim: + * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 132, __pyx_L1_error) + + /* "View.MemoryView":131 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") + * + */ + } + + /* "View.MemoryView":134 + * raise ValueError("Empty shape tuple for cython.array") + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") + * + */ + __pyx_t_2 = ((__pyx_v_itemsize <= 0) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":135 + * + * if itemsize <= 0: + * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 135, __pyx_L1_error) + + /* "View.MemoryView":134 + * raise ValueError("Empty shape tuple for cython.array") + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") + * + */ + } + + /* "View.MemoryView":137 + * raise ValueError("itemsize <= 0 for cython.array") + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":138 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":137 + * raise ValueError("itemsize <= 0 for cython.array") + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":139 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(2, 139, __pyx_L1_error) + __pyx_t_5 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":140 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(2, 140, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) __PYX_ERR(2, 140, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_6; + + /* "View.MemoryView":143 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":144 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":146 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") + * + */ + __pyx_t_4 = ((!(__pyx_v_self->_shape != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":147 + * + * if not self._shape: + * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(2, 147, __pyx_L1_error) + + /* "View.MemoryView":146 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") + * + */ + } + + /* "View.MemoryView":150 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + */ + __pyx_t_7 = 0; + __pyx_t_5 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_5); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(2, 150, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_5, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 150, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_dim = __pyx_t_8; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":151 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim + */ + __pyx_t_4 = ((__pyx_v_dim <= 0) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":152 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_9); + __pyx_t_3 = 0; + __pyx_t_9 = 0; + __pyx_t_9 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(2, 152, __pyx_L1_error) + + /* "View.MemoryView":151 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":153 + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":150 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + */ + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":156 + * + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 156, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":157 + * cdef char order + * if mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * elif mode == 'c': + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":158 + * if mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * elif mode == 'c': + * order = b'C' + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":156 + * + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L10; + } + + /* "View.MemoryView":159 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 159, __pyx_L1_error) + if (likely(__pyx_t_4)) { + + /* "View.MemoryView":160 + * self.mode = u'fortran' + * elif mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * else: + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":161 + * elif mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":159 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L10; + } + + /* "View.MemoryView":163 + * self.mode = u'c' + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 163, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 163, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(2, 163, __pyx_L1_error) + } + __pyx_L10:; + + /* "View.MemoryView":165 + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + * + * self.len = fill_contig_strides_array(self._shape, self._strides, # <<<<<<<<<<<<<< + * itemsize, self.ndim, order) + * + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":168 + * itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * if allocate_buffer: + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":169 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * if allocate_buffer: + * + */ + __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 169, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 169, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_4; + + /* "View.MemoryView":170 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = (__pyx_v_allocate_buffer != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":173 + * + * + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError("unable to allocate array data.") + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":174 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ + __pyx_t_4 = ((!(__pyx_v_self->data != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":175 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(2, 175, __pyx_L1_error) + + /* "View.MemoryView":174 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ + } + + /* "View.MemoryView":177 + * raise MemoryError("unable to allocate array data.") + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): + */ + __pyx_t_4 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":178 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len / itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":179 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len / itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(2, 179, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(2, 179, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_itemsize); + __pyx_t_8 = __pyx_t_1; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_8; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "View.MemoryView":180 + * p = self.data + * for i in range(self.len / itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":181 + * for i in range(self.len / itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":177 + * raise MemoryError("unable to allocate array data.") + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): + */ + } + + /* "View.MemoryView":170 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":184 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + char *__pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + Py_ssize_t *__pyx_t_7; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":185 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":186 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 186, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":187 + * cdef int bufmode = -1 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L3; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 188, __pyx_L1_error) + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L3:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + __pyx_t_1 = ((!((__pyx_v_flags & __pyx_v_bufmode) != 0)) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * info.ndim = self.ndim + */ + __pyx_t_4 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_4; + + /* "View.MemoryView":193 + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_5 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_5; + + /* "View.MemoryView":194 + * info.buf = self.data + * info.len = self.len + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_6 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":195 + * info.len = self.len + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * info.suboffsets = NULL + */ + __pyx_t_7 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_7; + + /* "View.MemoryView":196 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = self.itemsize + */ + __pyx_t_7 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_7; + + /* "View.MemoryView":197 + * info.shape = self._shape + * info.strides = self._strides + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":198 + * info.strides = self._strides + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * + */ + __pyx_t_5 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_5; + + /* "View.MemoryView":199 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":201 + * info.readonly = 0 + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":202 + * + * if flags & PyBUF_FORMAT: + * info.format = self.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":201 + * info.readonly = 0 + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":204 + * info.format = self.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.obj = self + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L5:; + + /* "View.MemoryView":206 + * info.format = NULL + * + * info.obj = self # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":184 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: + */ + __pyx_t_1 = ((__pyx_v_self->callback_free_data != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, + */ + __pyx_t_1 = (__pyx_v_self->free_data != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + */ + __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":215 + * elif self.free_data: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, # <<<<<<<<<<<<<< + * self._strides, self.ndim, False) + * free(self.data) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + */ + } + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, + */ + } + __pyx_L3:; + + /* "View.MemoryView":218 + * self._strides, self.ndim, False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":221 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":222 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 222, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":221 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":225 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_memview", 0); + + /* "View.MemoryView":226 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":227 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":225 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":229 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__", 0); + + /* "View.MemoryView":230 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":229 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":232 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getattr__", 0); + + /* "View.MemoryView":233 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":232 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":235 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getitem__", 0); + + /* "View.MemoryView":236 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":235 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":238 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + + /* "View.MemoryView":239 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(2, 239, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":238 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":243 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("array_cwrapper", 0); + + /* "View.MemoryView":247 + * cdef array result + * + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + */ + __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":248 + * + * if buf == NULL: + * result = array(shape, itemsize, format, mode.decode('ASCII')) # <<<<<<<<<<<<<< + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":247 + * cdef array result + * + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":250 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf + */ + /*else*/ { + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_3); + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_3 = 0; + + /* "View.MemoryView":251 + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(2, 251, __pyx_L1_error) + + /* "View.MemoryView":250 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf + */ + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":252 + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":254 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":243 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":280 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(2, 280, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 280, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 0); + + /* "View.MemoryView":281 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":280 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":282 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "View.MemoryView":283 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":282 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.name,) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + int __pyx_v_use_setstate; + PyObject *__pyx_v_state = NULL; + PyObject *__pyx_v__dict = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":4 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":5 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":6 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); + __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); + __pyx_t_4 = 0; + + /* "(tree fragment)":7 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":5 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":9 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + __pyx_t_3 = (__pyx_v_use_setstate != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":11 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + } + + /* "(tree fragment)":13 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __pyx_t_5 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.name,) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":14 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 15, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":14 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":297 + * + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory + */ + +static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) { + Py_intptr_t __pyx_v_aligned_p; + size_t __pyx_v_offset; + void *__pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":299 + * cdef void *align_pointer(void *memory, size_t alignment) nogil: + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory # <<<<<<<<<<<<<< + * cdef size_t offset + * + */ + __pyx_v_aligned_p = ((Py_intptr_t)__pyx_v_memory); + + /* "View.MemoryView":303 + * + * with cython.cdivision(True): + * offset = aligned_p % alignment # <<<<<<<<<<<<<< + * + * if offset > 0: + */ + __pyx_v_offset = (__pyx_v_aligned_p % __pyx_v_alignment); + + /* "View.MemoryView":305 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset + * + */ + __pyx_t_1 = ((__pyx_v_offset > 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":306 + * + * if offset > 0: + * aligned_p += alignment - offset # <<<<<<<<<<<<<< + * + * return aligned_p + */ + __pyx_v_aligned_p = (__pyx_v_aligned_p + (__pyx_v_alignment - __pyx_v_offset)); + + /* "View.MemoryView":305 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset + * + */ + } + + /* "View.MemoryView":308 + * aligned_p += alignment - offset + * + * return aligned_p # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((void *)__pyx_v_aligned_p); + goto __pyx_L0; + + /* "View.MemoryView":297 + * + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":344 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_obj)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flags)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(2, 344, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dtype_is_object); + if (value) { values[2] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 344, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 344, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 344, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 344, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "View.MemoryView":345 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":346 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":347 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + __pyx_t_3 = (__pyx_t_2 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_obj != Py_None); + __pyx_t_2 = (__pyx_t_3 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":348 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 348, __pyx_L1_error) + + /* "View.MemoryView":349 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = ((((PyObject *)__pyx_v_self->view.obj) == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":350 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":351 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * global __pyx_memoryview_thread_locks_used + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":349 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":347 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":354 + * + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":356 + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":354 + * + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":357 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":358 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":359 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":360 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(2, 360, __pyx_L1_error) + + /* "View.MemoryView":359 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":357 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":362 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":363 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = (((__pyx_v_self->view.format[0]) == 'O') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_2 = (((__pyx_v_self->view.format[1]) == '\x00') != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":362 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L10; + } + + /* "View.MemoryView":365 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L10:; + + /* "View.MemoryView":367 + * self.dtype_is_object = dtype_is_object + * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( # <<<<<<<<<<<<<< + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL + */ + __pyx_v_self->acquisition_count_aligned_p = ((__pyx_atomic_int *)__pyx_align_pointer(((void *)(&(__pyx_v_self->acquisition_count[0]))), (sizeof(__pyx_atomic_int)))); + + /* "View.MemoryView":369 + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":344 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":371 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyThread_type_lock __pyx_t_6; + PyThread_type_lock __pyx_t_7; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":372 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":373 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * + * cdef int i + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":372 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * + */ + } + + /* "View.MemoryView":377 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_2 = ((__pyx_v_self->lock != NULL) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":378 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_3 = __pyx_memoryview_thread_locks_used; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":379 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_2 = (((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":380 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":381 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_2 = ((__pyx_v_i != __pyx_memoryview_thread_locks_used) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":383 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_7 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":382 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_6; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_7; + + /* "View.MemoryView":381 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":384 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":379 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":386 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":377 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":371 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":388 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + __Pyx_RefNannySetupContext("get_item_pointer", 0); + + /* "View.MemoryView":390 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":392 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 392, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 392, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 392, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 392, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":393 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 393, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(2, 393, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":392 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":395 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":388 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":398 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + char *__pyx_t_6; + __Pyx_RefNannySetupContext("__getitem__", 0); + + /* "View.MemoryView":399 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":400 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":399 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":402 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (likely(__pyx_t_3 != Py_None)) { + PyObject* sequence = __pyx_t_3; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(2, 402, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 402, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_v_indices = __pyx_t_5; + __pyx_t_5 = 0; + + /* "View.MemoryView":405 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 405, __pyx_L1_error) + if (__pyx_t_2) { + + /* "View.MemoryView":406 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":405 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":408 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(2, 408, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_6; + + /* "View.MemoryView":409 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 409, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":398 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":411 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":412 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") + * + */ + __pyx_t_1 = (__pyx_v_self->view.readonly != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":413 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(2, 413, __pyx_L1_error) + + /* "View.MemoryView":412 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") + * + */ + } + + /* "View.MemoryView":415 + * raise TypeError("Cannot assign to read-only memoryview") + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(2, 415, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 415, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":417 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 417, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":418 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_obj = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":419 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 419, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":420 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":419 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":422 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(2, 422, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":417 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":424 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":411 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":426 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":427 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":429 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int((__pyx_v_self->flags | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":430 + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 430, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":429 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":431 + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(2, 431, __pyx_L6_except_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":432 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + __pyx_L6_except_error:; + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":427 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":434 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":426 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":436 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 0); + + /* "View.MemoryView":440 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(2, 440, __pyx_L1_error) + + /* "View.MemoryView":441 + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], # <<<<<<<<<<<<<< + * src.ndim, dst.ndim, self.dtype_is_object) + * + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(2, 441, __pyx_L1_error) + + /* "View.MemoryView":442 + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":440 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + __pyx_t_4 = __pyx_memoryview_copy_contents((__pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice))[0]), (__pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice))[0]), __pyx_t_2, __pyx_t_3, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 440, __pyx_L1_error) + + /* "View.MemoryView":436 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":444 + * src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + char const *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 0); + + /* "View.MemoryView":446 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_v_dst_slice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); + + /* "View.MemoryView":453 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_1 = ((((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":454 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":455 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_1 = ((__pyx_v_tmp == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":456 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(2, 456, __pyx_L1_error) + + /* "View.MemoryView":455 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":457 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":453 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":459 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":461 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":462 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":463 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":462 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":465 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 465, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":469 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_1 = ((__pyx_v_self->view.suboffsets != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":470 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_2 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 470, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":469 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":471 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":474 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8) < 0)) __Pyx_ErrFetch(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __pyx_t_3 = __pyx_lineno; __pyx_t_4 = __pyx_clineno; __pyx_t_5 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11); + } + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ErrRestore(__pyx_t_6, __pyx_t_7, __pyx_t_8); + __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; + __pyx_lineno = __pyx_t_3; __pyx_clineno = __pyx_t_4; __pyx_filename = __pyx_t_5; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":444 + * src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":476 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("setitem_indexed", 0); + + /* "View.MemoryView":477 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(2, 477, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":478 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 478, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":476 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":480 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + size_t __pyx_t_10; + int __pyx_t_11; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); + + /* "View.MemoryView":483 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 483, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":486 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 486, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":488 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError("Unable to convert item to object") + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_7) { + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; + } + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_6); + __Pyx_INCREF(__pyx_v_bytesitem); + __Pyx_GIVEREF(__pyx_v_bytesitem); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_bytesitem); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":492 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_10 = strlen(__pyx_v_self->view.format); + __pyx_t_11 = ((__pyx_t_10 == 1) != 0); + if (__pyx_t_11) { + + /* "View.MemoryView":493 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":492 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":494 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":489 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError("Unable to convert item to object") + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 489, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_9); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(2, 489, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_1); + + /* "View.MemoryView":490 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 490, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(2, 490, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":480 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":496 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + char *__pyx_t_11; + char *__pyx_t_12; + char *__pyx_t_13; + char *__pyx_t_14; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); + + /* "View.MemoryView":499 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 499, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":504 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "View.MemoryView":505 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 505, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":504 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":507 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_7 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + { + __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + if (__pyx_t_5) { + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; + } + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_value); + __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 507, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":509 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_9 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(2, 509, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_10 = __pyx_v_bytesvalue; + __pyx_t_12 = PyBytes_AS_STRING(__pyx_t_10); + __pyx_t_13 = (__pyx_t_12 + PyBytes_GET_SIZE(__pyx_t_10)); + for (__pyx_t_14 = __pyx_t_12; __pyx_t_14 < __pyx_t_13; __pyx_t_14++) { + __pyx_t_11 = __pyx_t_14; + __pyx_v_c = (__pyx_t_11[0]); + + /* "View.MemoryView":510 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_9; + + /* "View.MemoryView":509 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_9 = (__pyx_t_9 + 1); + + /* "View.MemoryView":510 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + + /* "View.MemoryView":496 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":513 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t *__pyx_t_4; + char *__pyx_t_5; + void *__pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":514 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->view.readonly != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":515 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 515, __pyx_L1_error) + + /* "View.MemoryView":514 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + */ + } + + /* "View.MemoryView":517 + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":518 + * + * if flags & PyBUF_STRIDES: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_4 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_4; + + /* "View.MemoryView":517 + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":520 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":522 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":523 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_4 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_4; + + /* "View.MemoryView":522 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":525 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":527 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":528 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_4 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_4; + + /* "View.MemoryView":527 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":530 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":532 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":533 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_5 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_5; + + /* "View.MemoryView":532 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":535 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":537 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_6 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_6; + + /* "View.MemoryView":538 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_7 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_7; + + /* "View.MemoryView":539 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_8 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_8; + + /* "View.MemoryView":540 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_8 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_8; + + /* "View.MemoryView":541 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":542 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":513 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":548 + * + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":549 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 549, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(2, 549, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":550 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 550, __pyx_L1_error) + + /* "View.MemoryView":551 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":548 + * + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":555 + * @property + * def base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":558 + * + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":559 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":558 + * + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":562 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":563 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError("Buffer view does not expose strides") + */ + __pyx_t_1 = ((__pyx_v_self->view.strides == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":565 + * if self.view.strides == NULL: + * + * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 565, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(2, 565, __pyx_L1_error) + + /* "View.MemoryView":563 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError("Buffer view does not expose strides") + */ + } + + /* "View.MemoryView":567 + * raise ValueError("Buffer view does not expose strides") + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":562 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":570 + * + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + Py_ssize_t *__pyx_t_6; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":571 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = ((__pyx_v_self->view.suboffsets == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":572 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__22, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":574 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_6 = __pyx_v_self->view.suboffsets; __pyx_t_6 < __pyx_t_5; __pyx_t_6++) { + __pyx_t_4 = __pyx_t_6; + __pyx_v_suboffset = (__pyx_t_4[0]); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":570 + * + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":577 + * + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":578 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 578, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":577 + * + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":581 + * + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":582 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":585 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":586 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":585 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":589 + * + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":590 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":591 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":593 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_4 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.shape; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 593, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_6); + __pyx_t_6 = 0; + + /* "View.MemoryView":594 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_6); + __pyx_t_6 = 0; + } + + /* "View.MemoryView":596 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":590 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":598 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":589 + * + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":600 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__len__", 0); + + /* "View.MemoryView":601 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = ((__pyx_v_self->view.ndim >= 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":602 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":601 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":604 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":600 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":606 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "View.MemoryView":607 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":608 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 608, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":607 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":606 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__str__", 0); + + /* "View.MemoryView":611 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":614 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("is_c_contig", 0); + + /* "View.MemoryView":617 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_v_mslice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); + + /* "View.MemoryView":618 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":614 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("is_f_contig", 0); + + /* "View.MemoryView":623 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_v_mslice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); + + /* "View.MemoryView":624 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 624, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":626 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy", 0); + + /* "View.MemoryView":628 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":630 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":631 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 631, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":636 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 636, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":626 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":638 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy_fortran", 0); + + /* "View.MemoryView":640 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":642 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":643 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 643, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":648 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 648, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":638 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":652 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 0); + + /* "View.MemoryView":653 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":654 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":655 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":652 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":658 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("memoryview_check", 0); + + /* "View.MemoryView":659 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":658 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":661 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + CYTHON_UNUSED PyObject *__pyx_v_idx = NULL; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + PyObject *(*__pyx_t_6)(PyObject *); + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("_unellipsify", 0); + + /* "View.MemoryView":666 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: + */ + __pyx_t_1 = PyTuple_Check(__pyx_v_index); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":667 + * """ + * if not isinstance(index, tuple): + * tup = (index,) # <<<<<<<<<<<<<< + * else: + * tup = index + */ + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 667, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index); + __pyx_v_tup = __pyx_t_3; + __pyx_t_3 = 0; + + /* "View.MemoryView":666 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":669 + * tup = (index,) + * else: + * tup = index # <<<<<<<<<<<<<< + * + * result = [] + */ + /*else*/ { + __Pyx_INCREF(__pyx_v_index); + __pyx_v_tup = __pyx_v_index; + } + __pyx_L3:; + + /* "View.MemoryView":671 + * tup = index + * + * result = [] # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 671, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_result = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":672 + * + * result = [] + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * for idx, item in enumerate(tup): + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":673 + * result = [] + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * for idx, item in enumerate(tup): + * if item is Ellipsis: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":674 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + __Pyx_INCREF(__pyx_int_0); + __pyx_t_3 = __pyx_int_0; + if (likely(PyList_CheckExact(__pyx_v_tup)) || PyTuple_CheckExact(__pyx_v_tup)) { + __pyx_t_4 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 674, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_6)) { + if (likely(PyList_CheckExact(__pyx_t_4))) { + if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 674, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } else { + if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 674, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } + } else { + __pyx_t_7 = __pyx_t_6(__pyx_t_4); + if (unlikely(!__pyx_t_7)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 674, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_7); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_3); + __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); + __pyx_t_3 = __pyx_t_7; + __pyx_t_7 = 0; + + /* "View.MemoryView":675 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":676 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True + */ + __pyx_t_1 = ((!(__pyx_v_seen_ellipsis != 0)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":677 + * if item is Ellipsis: + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * else: + */ + __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(2, 677, __pyx_L1_error) + __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__25); + __Pyx_GIVEREF(__pyx_slice__25); + PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__25); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 677, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":678 + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * else: + * result.append(slice(None)) + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":676 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True + */ + goto __pyx_L7; + } + + /* "View.MemoryView":680 + * seen_ellipsis = True + * else: + * result.append(slice(None)) # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__26); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 680, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":681 + * else: + * result.append(slice(None)) + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":675 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + goto __pyx_L6; + } + + /* "View.MemoryView":683 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + __pyx_t_10 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = ((!(PyIndex_Check(__pyx_v_item) != 0)) != 0); + __pyx_t_1 = __pyx_t_10; + __pyx_L9_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":684 + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + * raise TypeError("Cannot index with type '%s'" % type(item)) # <<<<<<<<<<<<<< + * + * have_slices = have_slices or isinstance(item, slice) + */ + __pyx_t_7 = __Pyx_PyString_Format(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_11, 0, 0, 0); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __PYX_ERR(2, 684, __pyx_L1_error) + + /* "View.MemoryView":683 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + */ + } + + /* "View.MemoryView":686 + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + * have_slices = have_slices or isinstance(item, slice) # <<<<<<<<<<<<<< + * result.append(item) + * + */ + __pyx_t_10 = (__pyx_v_have_slices != 0); + if (!__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = PySlice_Check(__pyx_v_item); + __pyx_t_2 = (__pyx_t_10 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_have_slices = __pyx_t_1; + + /* "View.MemoryView":687 + * + * have_slices = have_slices or isinstance(item, slice) + * result.append(item) # <<<<<<<<<<<<<< + * + * nslices = ndim - len(result) + */ + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 687, __pyx_L1_error) + } + __pyx_L6:; + + /* "View.MemoryView":674 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":689 + * result.append(item) + * + * nslices = ndim - len(result) # <<<<<<<<<<<<<< + * if nslices: + * result.extend([slice(None)] * nslices) + */ + __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(2, 689, __pyx_L1_error) + __pyx_v_nslices = (__pyx_v_ndim - __pyx_t_5); + + /* "View.MemoryView":690 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + __pyx_t_1 = (__pyx_v_nslices != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":691 + * nslices = ndim - len(result) + * if nslices: + * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< + * + * return have_slices or nslices, tuple(result) + */ + __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 691, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__27); + __Pyx_GIVEREF(__pyx_slice__27); + PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__27); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 691, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":690 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + } + + /* "View.MemoryView":693 + * result.extend([slice(None)] * nslices) + * + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_L14_bool_binop_done:; + __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_4); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_r = ((PyObject*)__pyx_t_11); + __pyx_t_11 = 0; + goto __pyx_L0; + + /* "View.MemoryView":661 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":695 + * return have_slices or nslices, tuple(result) + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("assert_direct_dimensions", 0); + + /* "View.MemoryView":696 + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":697 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") + * + */ + __pyx_t_4 = ((__pyx_v_suboffset >= 0) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":698 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(2, 698, __pyx_L1_error) + + /* "View.MemoryView":697 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") + * + */ + } + } + + /* "View.MemoryView":695 + * return have_slices or nslices, tuple(result) + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":705 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + struct __pyx_memoryview_obj *__pyx_t_4; + char *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *(*__pyx_t_8)(PyObject *); + PyObject *__pyx_t_9 = NULL; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + Py_ssize_t __pyx_t_12; + __Pyx_RefNannySetupContext("memview_slice", 0); + + /* "View.MemoryView":706 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":713 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":717 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(!Py_OptimizeFlag)) { + if (unlikely(!((__pyx_v_memview->view.ndim > 0) != 0))) { + PyErr_SetNone(PyExc_AssertionError); + __PYX_ERR(2, 717, __pyx_L1_error) + } + } + #endif + + /* "View.MemoryView":719 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":720 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 720, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":721 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":719 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":723 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":724 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":730 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_4 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_4; + + /* "View.MemoryView":731 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_5; + + /* "View.MemoryView":736 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":737 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":741 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( + */ + __pyx_t_6 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_3 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; + __pyx_t_8 = NULL; + } else { + __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 741, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_8)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 741, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } else { + if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 741, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } + } else { + __pyx_t_9 = __pyx_t_8(__pyx_t_3); + if (unlikely(!__pyx_t_9)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 741, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_9); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_v_dim = __pyx_t_6; + __pyx_t_6 = (__pyx_t_6 + 1); + + /* "View.MemoryView":742 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_2 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":746 + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + * index, 0, 0, # start, stop, step # <<<<<<<<<<<<<< + * 0, 0, 0, # have_{start,stop,step} + * False) + */ + __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 746, __pyx_L1_error) + + /* "View.MemoryView":743 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 743, __pyx_L1_error) + + /* "View.MemoryView":742 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + goto __pyx_L6; + } + + /* "View.MemoryView":749 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_2 = (__pyx_v_index == Py_None); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":750 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":751 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":752 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":753 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":749 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":755 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 755, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 755, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 755, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_10; + + /* "View.MemoryView":756 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 756, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 756, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 756, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_10; + + /* "View.MemoryView":757 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 757, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 757, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 757, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_10; + + /* "View.MemoryView":759 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 759, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":760 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 760, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":761 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 761, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":763 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 763, __pyx_L1_error) + + /* "View.MemoryView":769 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":741 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( + */ + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":771 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":772 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); + + /* "View.MemoryView":773 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 773, __pyx_L1_error) } + + /* "View.MemoryView":774 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 774, __pyx_L1_error) } + + /* "View.MemoryView":772 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 772, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":771 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":777 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF(((PyObject *)__pyx_r)); + + /* "View.MemoryView":778 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "View.MemoryView":777 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 777, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":705 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":802 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":822 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":824 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":825 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":824 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":826 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":827 + * start += shape + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 827, __pyx_L1_error) + + /* "View.MemoryView":826 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":822 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":830 + * else: + * + * negative_step = have_step != 0 and step < 0 # <<<<<<<<<<<<<< + * + * if have_step and step == 0: + */ + /*else*/ { + __pyx_t_1 = ((__pyx_v_have_step != 0) != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step < 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L6_bool_binop_done:; + __pyx_v_negative_step = __pyx_t_2; + + /* "View.MemoryView":832 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) + * + */ + __pyx_t_1 = (__pyx_v_have_step != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step == 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L9_bool_binop_done:; + if (__pyx_t_2) { + + /* "View.MemoryView":833 + * + * if have_step and step == 0: + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 833, __pyx_L1_error) + + /* "View.MemoryView":832 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) + * + */ + } + + /* "View.MemoryView":836 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":837 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":838 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":839 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":840 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":839 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":837 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":841 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = ((__pyx_v_start >= __pyx_v_shape) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":842 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":843 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":842 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":845 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L14:; + + /* "View.MemoryView":841 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L12:; + + /* "View.MemoryView":836 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L11; + } + + /* "View.MemoryView":847 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":847 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L15; + } + + /* "View.MemoryView":850 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L15:; + } + __pyx_L11:; + + /* "View.MemoryView":852 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":853 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":854 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":855 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":856 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":855 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":853 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L17; + } + + /* "View.MemoryView":857 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = ((__pyx_v_stop > __pyx_v_shape) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":858 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":857 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L17:; + + /* "View.MemoryView":852 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L16; + } + + /* "View.MemoryView":860 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":861 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":860 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":863 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * if not have_step: + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L19:; + } + __pyx_L16:; + + /* "View.MemoryView":865 + * stop = shape + * + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 + * + */ + __pyx_t_2 = ((!(__pyx_v_have_step != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":866 + * + * if not have_step: + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + + /* "View.MemoryView":865 + * stop = shape + * + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 + * + */ + } + + /* "View.MemoryView":870 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":872 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":873 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":872 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":875 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = ((__pyx_v_new_shape < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":875 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":879 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":880 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":881 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":884 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = (((__pyx_v_suboffset_dim[0]) < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":885 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":884 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L23; + } + + /* "View.MemoryView":887 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L23:; + + /* "View.MemoryView":889 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":890 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":891 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = ((__pyx_v_new_ndim == 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":892 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":891 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L26; + } + + /* "View.MemoryView":894 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":895 + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 894, __pyx_L1_error) + } + __pyx_L26:; + + /* "View.MemoryView":890 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L25; + } + + /* "View.MemoryView":897 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L25:; + + /* "View.MemoryView":889 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":899 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":802 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":905 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("pybuffer_index", 0); + + /* "View.MemoryView":907 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":908 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":911 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize + */ + __pyx_t_2 = ((__pyx_v_view->ndim == 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if view.ndim == 0: + * shape = view.len / itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(2, 912, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(2, 912, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + + /* "View.MemoryView":913 + * if view.ndim == 0: + * shape = view.len / itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":911 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":915 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":916 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":917 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = ((__pyx_v_view->suboffsets != NULL) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":918 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":917 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":920 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = ((__pyx_v_index < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":922 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + __pyx_t_2 = ((__pyx_v_index < 0) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":923 + * index += view.shape[dim] + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 923, __pyx_L1_error) + + /* "View.MemoryView":922 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + } + + /* "View.MemoryView":920 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":925 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + __pyx_t_2 = ((__pyx_v_index >= __pyx_v_shape) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":926 + * + * if index >= shape: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 926, __pyx_L1_error) + + /* "View.MemoryView":925 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + } + + /* "View.MemoryView":928 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":929 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":930 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":929 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":932 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":905 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":938 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + + /* "View.MemoryView":939 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":941 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":942 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":946 + * + * cdef int i, j + * for i in range(ndim / 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":947 + * cdef int i, j + * for i in range(ndim / 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":948 + * for i in range(ndim / 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":949 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":951 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0) != 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0) != 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":952 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 1 + */ + __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 952, __pyx_L1_error) + + /* "View.MemoryView":951 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":954 + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "View.MemoryView":938 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = 0; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":971 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":972 + * + * def __dealloc__(self): + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XDEC_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":971 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":974 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); + + /* "View.MemoryView":975 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = ((__pyx_v_self->to_object_func != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":976 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":975 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":978 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 978, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":974 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":980 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); + + /* "View.MemoryView":981 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = ((__pyx_v_self->to_dtype_func != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":982 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 982, __pyx_L1_error) + + /* "View.MemoryView":981 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":984 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * @property + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":980 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":987 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":988 + * @property + * def base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":987 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":994 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + __Pyx_RefNannySetupContext("memoryview_fromslice", 0); + + /* "View.MemoryView":1002 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = ((((PyObject *)__pyx_v_memviewslice.memview) == Py_None) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1003 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1002 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1008 + * + * + * result = _memoryviewslice(None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1010 + * result = _memoryviewslice(None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1011 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview).base + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1013 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview).base # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1014 + * + * result.from_object = ( memviewslice.memview).base + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1016 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1017 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1018 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1019 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1020 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1022 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1023 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1022 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1025 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1027 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1028 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1031 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1032 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1033 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1034 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1035 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1033 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1037 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1038 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1038, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1039 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1039, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1039, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 1039, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1041 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1042 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1044 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":994 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1047 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_slice_from_memview", 0); + + /* "View.MemoryView":1050 + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1051 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 1051, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":1052 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1050 + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1054 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1055 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1047 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_WriteUnraisable("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1058 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + __Pyx_RefNannyDeclarations + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + __Pyx_RefNannySetupContext("slice_copy", 0); + + /* "View.MemoryView":1062 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1063 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1064 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1066 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1067 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1069 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1070 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1071 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1072 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + if ((__pyx_v_suboffsets != 0)) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1058 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":1075 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy", 0); + + /* "View.MemoryView":1078 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1079 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1079, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1075 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1082 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *(*__pyx_t_3)(char *); + int (*__pyx_t_4)(char *, PyObject *); + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 0); + + /* "View.MemoryView":1089 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1090 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_3; + + /* "View.MemoryView":1091 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_4 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_4; + + /* "View.MemoryView":1089 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1093 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1094 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1096 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1098 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1096, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1082 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1104 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":1105 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: + */ + __pyx_t_1 = ((__pyx_v_arg < 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1106 + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: + * return -arg # <<<<<<<<<<<<<< + * else: + * return arg + */ + __pyx_r = (-__pyx_v_arg); + goto __pyx_L0; + + /* "View.MemoryView":1105 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: + */ + } + + /* "View.MemoryView":1108 + * return -arg + * else: + * return arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + /*else*/ { + __pyx_r = __pyx_v_arg; + goto __pyx_L0; + } + + /* "View.MemoryView":1104 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1111 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1116 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1117 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1119 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1120 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1121 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1122 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1120 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1124 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1125 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1126 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1127 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1125 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1129 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = ((abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1130 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1129 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1132 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1111 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1135 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + + /* "View.MemoryView":1142 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1143 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1144 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = ((__pyx_v_src_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_dst_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1149 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_3 = (__pyx_t_2 != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1152 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1153 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1154 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1155 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1157 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1158 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1162 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1163 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1135 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1165 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1168 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1165 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1172 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1175 + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + * cdef Py_ssize_t size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1177 + * cdef Py_ssize_t size = src.memview.view.itemsize + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * size *= src.shape[i] + * + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1178 + * + * for i in range(ndim): + * size *= src.shape[i] # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * (__pyx_v_src->shape[__pyx_v_i])); + } + + /* "View.MemoryView":1180 + * size *= src.shape[i] + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1172 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1183 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1192 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = ((__pyx_v_order == 'F') != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1193 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride = stride * shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1194 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride = stride * shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1195 + * for idx in range(ndim): + * strides[idx] = stride + * stride = stride * shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1192 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1197 + * stride = stride * shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride = stride * shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1198 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride = stride * shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1199 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride = stride * shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1201 + * stride = stride * shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1183 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1204 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1215 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1216 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1218 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err(MemoryError, NULL) + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1219 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) + * + */ + __pyx_t_2 = ((!(__pyx_v_result != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1220 + * result = malloc(size) + * if not result: + * _err(MemoryError, NULL) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 1220, __pyx_L1_error) + + /* "View.MemoryView":1219 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) + * + */ + } + + /* "View.MemoryView":1223 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1224 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1225 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1226 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1227 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1229 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, # <<<<<<<<<<<<<< + * ndim, order) + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = (((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1204 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = NULL; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1250 + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + * (i, extent1, extent2)) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % # <<<<<<<<<<<<<< + * (i, extent1, extent2)) + * + */ + __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(2, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1253 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_error); + + /* "View.MemoryView":1254 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: + * raise error(msg.decode('ascii') % dim) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_v_error); + __pyx_t_3 = __pyx_v_error; __pyx_t_2 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + if (!__pyx_t_2) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 1254, __pyx_L1_error) + + /* "View.MemoryView":1253 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1257 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_error); + + /* "View.MemoryView":1258 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) + * else: + */ + __pyx_t_1 = ((__pyx_v_msg != NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":1259 + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: + * raise error(msg.decode('ascii')) # <<<<<<<<<<<<<< + * else: + * raise error + */ + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_error); + __pyx_t_4 = __pyx_v_error; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + if (!__pyx_t_5) { + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(2, 1259, __pyx_L1_error) + + /* "View.MemoryView":1258 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) + * else: + */ + } + + /* "View.MemoryView":1261 + * raise error(msg.decode('ascii')) + * else: + * raise error # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_contents') + */ + /*else*/ { + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + __PYX_ERR(2, 1261, __pyx_L1_error) + } + + /* "View.MemoryView":1257 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1264 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_t_8; + + /* "View.MemoryView":1272 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1273 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1275 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1276 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1277 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1280 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = ((__pyx_v_src_ndim < __pyx_v_dst_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1281 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1280 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1282 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = ((__pyx_v_dst_ndim < __pyx_v_src_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1283 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1282 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1285 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + if (((__pyx_t_3 > __pyx_t_4) != 0)) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1287 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1288 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1289 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1291 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1289 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1293 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1293, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1288 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1295 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = (((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1296 + * + * if src.suboffsets[i] >= 0: + * _err_dim(ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1296, __pyx_L1_error) + + /* "View.MemoryView":1295 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1298 + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = (__pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1300 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = ((!(__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim) != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1300 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1303 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(2, 1303, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1304 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1298 + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1306 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = ((!(__pyx_v_broadcasting != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1309 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1309 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1311 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1312 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1311 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1314 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + __pyx_t_2 = (__pyx_v_direct_copy != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1316 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1317 + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1318 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1319 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1320 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1314 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + } + + /* "View.MemoryView":1306 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1322 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + __pyx_t_8 = (__pyx_t_2 != 0); + if (__pyx_t_8) { + + /* "View.MemoryView":1325 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1325, __pyx_L1_error) + + /* "View.MemoryView":1326 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1326, __pyx_L1_error) + + /* "View.MemoryView":1322 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1328 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1329 + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1330 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1332 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1333 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1264 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1336 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1340 + * int ndim_other) nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1342 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1343 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1344 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1345 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1347 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1348 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1349 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1350 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1336 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1358 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: + * + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + int __pyx_t_1; + + /* "View.MemoryView":1362 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) + */ + __pyx_t_1 = (__pyx_v_dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1363 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, # <<<<<<<<<<<<<< + * dst.strides, ndim, inc) + * + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1362 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) + */ + } + + /* "View.MemoryView":1358 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":1367 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + __Pyx_RefNannyDeclarations + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("refcount_objects_in_slice_with_gil", 0); + + /* "View.MemoryView":1370 + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1367 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1373 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("refcount_objects_in_slice", 0); + + /* "View.MemoryView":1377 + * cdef Py_ssize_t i + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1378 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":1379 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + __pyx_t_4 = (__pyx_v_inc != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":1380 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1379 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1382 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1378 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1384 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, inc) + * + */ + /*else*/ { + + /* "View.MemoryView":1385 + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, + * ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += strides[0] + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1387 + * ndim - 1, inc) + * + * data += strides[0] # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + (__pyx_v_strides[0])); + } + + /* "View.MemoryView":1373 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":1393 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1396 + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1397 + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, # <<<<<<<<<<<<<< + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1399 + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1393 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1403 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1407 + * size_t itemsize, void *item) nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1408 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1410 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1411 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1412 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1413 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1410 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1415 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1416 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, itemsize, item) + * data += stride + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1418 + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1403 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = NULL; + PyObject *__pyx_v___pyx_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 0); + + /* "(tree fragment)":2 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xb068931) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":3 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":4 + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_5) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":2 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":5 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_6) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_INCREF(__pyx_v___pyx_type); + __Pyx_GIVEREF(__pyx_v___pyx_type); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v___pyx_type); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_7 = (__pyx_t_1 != 0); + if (__pyx_t_7) { + + /* "(tree fragment)":7 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 7, __pyx_L1_error) + __pyx_t_3 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":8 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 0); + + /* "(tree fragment)":10 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 10, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 11, __pyx_L1_error) + } + __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 11, __pyx_L1_error) + __pyx_t_4 = ((__pyx_t_3 > 1) != 0); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 11, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 != 0); + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":12 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (!__pyx_t_8) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8); __pyx_t_8 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_array___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + (*Py_TYPE(o)->tp_free)(o); +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_array_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_array_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._augment.array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._augment.Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_memoryview___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"is_c_contig", (PyCFunction)__pyx_memoryview_is_c_contig, METH_NOARGS, 0}, + {"is_f_contig", (PyCFunction)__pyx_memoryview_is_f_contig, METH_NOARGS, 0}, + {"copy", (PyCFunction)__pyx_memoryview_copy, METH_NOARGS, 0}, + {"copy_fortran", (PyCFunction)__pyx_memoryview_copy_fortran, METH_NOARGS, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._augment.memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_memoryviewslice___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XDEC_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyObject *__pyx_getprop___pyx_memoryviewslice_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(o); +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets__memoryviewslice[] = { + {(char *)"base", __pyx_getprop___pyx_memoryviewslice_base, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._augment._memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + "Internal class for passing memoryview slices to Python", /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets__memoryviewslice, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec__augment(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec__augment}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "_augment", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_index_with_type_s, __pyx_k_Cannot_index_with_type_s, sizeof(__pyx_k_Cannot_index_with_type_s), 0, 0, 1, 0}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_k_Incompatible_checksums_s_vs_0xb0, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xb0), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 0, 1, 0}, + {&__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_k_Invalid_shape_in_axis_d_d, sizeof(__pyx_k_Invalid_shape_in_axis_d_d), 0, 0, 1, 0}, + {&__pyx_n_s_MDAnalysis_lib__augment, __pyx_k_MDAnalysis_lib__augment, sizeof(__pyx_k_MDAnalysis_lib__augment), 0, 0, 1, 1}, + {&__pyx_kp_s_MDAnalysis_lib__augment_pyx, __pyx_k_MDAnalysis_lib__augment_pyx, sizeof(__pyx_k_MDAnalysis_lib__augment_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_n_s_N, __pyx_k_N, sizeof(__pyx_k_N), 0, 0, 1, 1}, + {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 0, 1, 0}, + {&__pyx_n_s_OverflowError, __pyx_k_OverflowError, sizeof(__pyx_k_OverflowError), 0, 0, 1, 1}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_n_s_asarray, __pyx_k_asarray, sizeof(__pyx_k_asarray), 0, 0, 1, 1}, + {&__pyx_n_s_augment_coordinates, __pyx_k_augment_coordinates, sizeof(__pyx_k_augment_coordinates), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_box, __pyx_k_box, sizeof(__pyx_k_box), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_coord, __pyx_k_coord, sizeof(__pyx_k_coord), 0, 0, 1, 1}, + {&__pyx_n_s_coordinates, __pyx_k_coordinates, sizeof(__pyx_k_coordinates), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_n_s_dm, __pyx_k_dm, sizeof(__pyx_k_dm), 0, 0, 1, 1}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_end, __pyx_k_end, sizeof(__pyx_k_end), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32, __pyx_k_float32, sizeof(__pyx_k_float32), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_hi_x, __pyx_k_hi_x, sizeof(__pyx_k_hi_x), 0, 0, 1, 1}, + {&__pyx_n_s_hi_y, __pyx_k_hi_y, sizeof(__pyx_k_hi_y), 0, 0, 1, 1}, + {&__pyx_n_s_hi_z, __pyx_k_hi_z, sizeof(__pyx_k_hi_z), 0, 0, 1, 1}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_indices, __pyx_k_indices, sizeof(__pyx_k_indices), 0, 0, 1, 1}, + {&__pyx_n_s_int64, __pyx_k_int64, sizeof(__pyx_k_int64), 0, 0, 1, 1}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, + {&__pyx_n_s_lo_x, __pyx_k_lo_x, sizeof(__pyx_k_lo_x), 0, 0, 1, 1}, + {&__pyx_n_s_lo_y, __pyx_k_lo_y, sizeof(__pyx_k_lo_y), 0, 0, 1, 1}, + {&__pyx_n_s_lo_z, __pyx_k_lo_z, sizeof(__pyx_k_lo_z), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_mdamath, __pyx_k_mdamath, sizeof(__pyx_k_mdamath), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, + {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_norm, __pyx_k_norm, sizeof(__pyx_k_norm), 0, 0, 1, 1}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_nreal, __pyx_k_nreal, sizeof(__pyx_k_nreal), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, + {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_other, __pyx_k_other, sizeof(__pyx_k_other), 0, 0, 1, 1}, + {&__pyx_n_s_output, __pyx_k_output, sizeof(__pyx_k_output), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_getbuffer, __pyx_k_pyx_getbuffer, sizeof(__pyx_k_pyx_getbuffer), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_r, __pyx_k_r, sizeof(__pyx_k_r), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reciprocal, __pyx_k_reciprocal, sizeof(__pyx_k_reciprocal), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_reshape, __pyx_k_reshape, sizeof(__pyx_k_reshape), 0, 0, 1, 1}, + {&__pyx_n_s_results, __pyx_k_results, sizeof(__pyx_k_results), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_shiftX, __pyx_k_shiftX, sizeof(__pyx_k_shiftX), 0, 0, 1, 1}, + {&__pyx_n_s_shiftY, __pyx_k_shiftY, sizeof(__pyx_k_shiftY), 0, 0, 1, 1}, + {&__pyx_n_s_shiftZ, __pyx_k_shiftZ, sizeof(__pyx_k_shiftZ), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_translation, __pyx_k_translation, sizeof(__pyx_k_translation), 0, 0, 1, 1}, + {&__pyx_n_s_triclinic_vectors, __pyx_k_triclinic_vectors, sizeof(__pyx_k_triclinic_vectors), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_n_s_undo_augment, __pyx_k_undo_augment, sizeof(__pyx_k_undo_augment), 0, 0, 1, 1}, + {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 229, __pyx_L1_error) + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 810, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 1000, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(2, 81, __pyx_L1_error) + __pyx_builtin_OverflowError = __Pyx_GetBuiltinName(__pyx_n_s_OverflowError); if (!__pyx_builtin_OverflowError) __PYX_ERR(2, 81, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(2, 84, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(2, 94, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(2, 147, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(2, 399, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(2, 608, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 229, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 1000, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 1006, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 1012, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "View.MemoryView":132 + * + * if not self.ndim: + * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "View.MemoryView":135 + * + * if itemsize <= 0: + * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(2, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + + /* "View.MemoryView":138 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_n_s_ASCII); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(2, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "View.MemoryView":147 + * + * if not self._shape: + * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(2, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + + /* "View.MemoryView":175 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(2, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(2, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "View.MemoryView":413 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "View.MemoryView":490 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(2, 490, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":515 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(2, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "View.MemoryView":565 + * if self.view.strides == NULL: + * + * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(2, 565, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "View.MemoryView":572 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__22 = PyTuple_New(1); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + PyTuple_SET_ITEM(__pyx_tuple__22, 0, __pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + + /* "View.MemoryView":677 + * if item is Ellipsis: + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * else: + */ + __pyx_slice__25 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__25)) __PYX_ERR(2, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__25); + __Pyx_GIVEREF(__pyx_slice__25); + + /* "View.MemoryView":680 + * seen_ellipsis = True + * else: + * result.append(slice(None)) # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_slice__26 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__26)) __PYX_ERR(2, 680, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__26); + __Pyx_GIVEREF(__pyx_slice__26); + + /* "View.MemoryView":691 + * nslices = ndim - len(result) + * if nslices: + * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< + * + * return have_slices or nslices, tuple(result) + */ + __pyx_slice__27 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__27)) __PYX_ERR(2, 691, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__27); + __Pyx_GIVEREF(__pyx_slice__27); + + /* "View.MemoryView":698 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(2, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__29 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + + /* "MDAnalysis/lib/_augment.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): # <<<<<<<<<<<<<< + * r"""Calculates the periodic images of particles which are within a distance + * `r` from the box walls. + */ + __pyx_tuple__31 = PyTuple_Pack(24, __pyx_n_s_coordinates, __pyx_n_s_box, __pyx_n_s_r, __pyx_n_s_lo_x, __pyx_n_s_hi_x, __pyx_n_s_lo_y, __pyx_n_s_hi_y, __pyx_n_s_lo_z, __pyx_n_s_hi_z, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_N, __pyx_n_s_norm, __pyx_n_s_shiftX, __pyx_n_s_shiftY, __pyx_n_s_shiftZ, __pyx_n_s_coord, __pyx_n_s_end, __pyx_n_s_other, __pyx_n_s_dm, __pyx_n_s_reciprocal, __pyx_n_s_output, __pyx_n_s_indices, __pyx_n_s_n); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__31); + __Pyx_GIVEREF(__pyx_tuple__31); + __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(3, 0, 24, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib__augment_pyx, __pyx_n_s_augment_coordinates, 39, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 39, __pyx_L1_error) + + /* "MDAnalysis/lib/_augment.pyx":301 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): # <<<<<<<<<<<<<< + * """Translate augmented indices back to original indices. + * + */ + __pyx_tuple__33 = PyTuple_Pack(5, __pyx_n_s_results, __pyx_n_s_translation, __pyx_n_s_nreal, __pyx_n_s_N, __pyx_n_s_i); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__33); + __Pyx_GIVEREF(__pyx_tuple__33); + __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib__augment_pyx, __pyx_n_s_undo_augment, 301, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 301, __pyx_L1_error) + + /* "View.MemoryView":285 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__35 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(2, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__35); + __Pyx_GIVEREF(__pyx_tuple__35); + + /* "View.MemoryView":286 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(2, 286, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__36); + __Pyx_GIVEREF(__pyx_tuple__36); + + /* "View.MemoryView":287 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__37 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(2, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__37); + __Pyx_GIVEREF(__pyx_tuple__37); + + /* "View.MemoryView":290 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__38 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(2, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); + + /* "View.MemoryView":291 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(2, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__39); + __Pyx_GIVEREF(__pyx_tuple__39); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_tuple__40 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__40); + __Pyx_GIVEREF(__pyx_tuple__40); + __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_modinit_global_init_code(void); /*proto*/ +static int __Pyx_modinit_variable_export_code(void); /*proto*/ +static int __Pyx_modinit_function_export_code(void); /*proto*/ +static int __Pyx_modinit_type_init_code(void); /*proto*/ +static int __Pyx_modinit_type_import_code(void); /*proto*/ +static int __Pyx_modinit_variable_import_code(void); /*proto*/ +static int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 104, __pyx_L1_error) + __pyx_type___pyx_array.tp_print = 0; + if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(2, 104, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 104, __pyx_L1_error) + __pyx_array_type = &__pyx_type___pyx_array; + if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 278, __pyx_L1_error) + __pyx_type___pyx_MemviewEnum.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_MemviewEnum.tp_dictoffset && __pyx_type___pyx_MemviewEnum.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_MemviewEnum.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 278, __pyx_L1_error) + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 329, __pyx_L1_error) + __pyx_type___pyx_memoryview.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryview.tp_dictoffset && __pyx_type___pyx_memoryview.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_memoryview.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(2, 329, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 329, __pyx_L1_error) + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_type___pyx_memoryviewslice.tp_base = __pyx_memoryview_type; + if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 960, __pyx_L1_error) + __pyx_type___pyx_memoryviewslice.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryviewslice.tp_dictoffset && __pyx_type___pyx_memoryviewslice.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_memoryviewslice.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(2, 960, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 960, __pyx_L1_error) + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(3, 9, __pyx_L1_error) + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) __PYX_ERR(1, 164, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) __PYX_ERR(1, 186, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) __PYX_ERR(1, 190, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) __PYX_ERR(1, 199, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) __PYX_ERR(1, 872, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = __Pyx_ImportModule("MDAnalysis.lib._cutil"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "_dot", (void (**)(void))&__pyx_f_10MDAnalysis_3lib_6_cutil__dot, "float (float *, float *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "_cross", (void (**)(void))&__pyx_f_10MDAnalysis_3lib_6_cutil__cross, "void (float *, float *, float *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "_norm", (void (**)(void))&__pyx_f_10MDAnalysis_3lib_6_cutil__norm, "float (float *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + + +#if PY_MAJOR_VERSION < 3 +#ifdef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC void +#else +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#endif +#else +#ifdef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#endif +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC init_augment(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC init_augment(void) +#else +__Pyx_PyMODINIT_FUNC PyInit__augment(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit__augment(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + result = PyDict_SetItemString(moddict, to_name, value); + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__") < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static int __pyx_pymod_exec__augment(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + static PyThread_type_lock __pyx_t_3[8]; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m && __pyx_m == __pyx_pyinit_module) return 0; + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__augment(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("_augment", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_MDAnalysis__lib___augment) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "MDAnalysis.lib._augment")) { + if (unlikely(PyDict_SetItemString(modules, "MDAnalysis.lib._augment", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely(__Pyx_modinit_type_init_code() != 0)) goto __pyx_L1_error; + if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; + (void)__Pyx_modinit_variable_import_code(); + if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "MDAnalysis/lib/_augment.pyx":25 + * + * import cython + * import numpy as np # <<<<<<<<<<<<<< + * from .mdamath import triclinic_vectors + * cimport numpy as np + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "MDAnalysis/lib/_augment.pyx":26 + * import cython + * import numpy as np + * from .mdamath import triclinic_vectors # <<<<<<<<<<<<<< + * cimport numpy as np + * cimport _cutil + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_triclinic_vectors); + __Pyx_GIVEREF(__pyx_n_s_triclinic_vectors); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_triclinic_vectors); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_mdamath, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_triclinic_vectors); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_triclinic_vectors, __pyx_t_1) < 0) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_augment.pyx":34 + * + * + * __all__ = ['augment_coordinates', 'undo_augment'] # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_augment_coordinates); + __Pyx_GIVEREF(__pyx_n_s_augment_coordinates); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_augment_coordinates); + __Pyx_INCREF(__pyx_n_s_undo_augment); + __Pyx_GIVEREF(__pyx_n_s_undo_augment); + PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_undo_augment); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_t_2) < 0) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_augment.pyx":39 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def augment_coordinates(float[:, ::1] coordinates, float[:] box, float r): # <<<<<<<<<<<<<< + * r"""Calculates the periodic images of particles which are within a distance + * `r` from the box walls. + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_8_augment_1augment_coordinates, NULL, __pyx_n_s_MDAnalysis_lib__augment); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_augment_coordinates, __pyx_t_2) < 0) __PYX_ERR(0, 39, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_augment.pyx":301 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def undo_augment(np.int64_t[:] results, np.int64_t[:] translation, int nreal): # <<<<<<<<<<<<<< + * """Translate augmented indices back to original indices. + * + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_8_augment_3undo_augment, NULL, __pyx_n_s_MDAnalysis_lib__augment); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_undo_augment, __pyx_t_2) < 0) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_augment.pyx":1 + * # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- # <<<<<<<<<<<<<< + * # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + * # + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":208 + * info.obj = self + * + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __pyx_t_2 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_2) < 0) __PYX_ERR(2, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":285 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":286 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 286, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":287 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":290 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":291 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":315 + * + * DEF THREAD_LOCKS_PREALLOCATED = 8 + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":316 + * DEF THREAD_LOCKS_PREALLOCATED = 8 + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_3[0] = PyThread_allocate_lock(); + __pyx_t_3[1] = PyThread_allocate_lock(); + __pyx_t_3[2] = PyThread_allocate_lock(); + __pyx_t_3[3] = PyThread_allocate_lock(); + __pyx_t_3[4] = PyThread_allocate_lock(); + __pyx_t_3[5] = PyThread_allocate_lock(); + __pyx_t_3[6] = PyThread_allocate_lock(); + __pyx_t_3[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_3, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":544 + * info.obj = self + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 544, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_2) < 0) __PYX_ERR(2, 544, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_memoryview_type); + + /* "View.MemoryView":990 + * return self.from_object + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_2) < 0) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init MDAnalysis.lib._augment", 0, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init MDAnalysis.lib._augment"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* GetModuleGlobalName */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + if (likely(result)) { + Py_INCREF(result); + } else if (unlikely(PyErr_Occurred())) { + result = NULL; + } else { +#else + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +/* PyCFunctionFastCall */ + #if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ + #if CYTHON_FAST_PYCALL +#include "frameobject.h" +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = f->f_localsplus; + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCall */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* MemviewSliceInit */ + static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (!buf) { + PyErr_SetString(PyExc_ValueError, + "buf is NULL."); + goto fail; + } else if (memviewslice->memview || memviewslice->data) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + int first_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (!memview || (PyObject *) memview == Py_None) + return; + if (__pyx_get_slice_count(memview) < 0) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + first_time = __pyx_add_acquisition_count(memview) == 0; + if (first_time) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } +} +static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + int last_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (!memview ) { + return; + } else if ((PyObject *) memview == Py_None) { + memslice->memview = NULL; + return; + } + if (__pyx_get_slice_count(memview) <= 0) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + last_time = __pyx_sub_acquisition_count(memview) == 1; + memslice->data = NULL; + if (last_time) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + memslice->memview = NULL; + } +} + +/* PyErrFetchRestore */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* RaiseException */ + #if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* DictGetItem */ + #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) + PyErr_SetObject(PyExc_KeyError, args); + Py_XDECREF(args); + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* RaiseTooManyValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ + static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +/* SaveResetException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if PY_VERSION_HEX >= 0x030700A3 + *type = tstate->exc_state.exc_type; + *value = tstate->exc_state.exc_value; + *tb = tstate->exc_state.exc_traceback; + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + #endif + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = type; + tstate->exc_state.exc_value = value; + tstate->exc_state.exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* PyErrExceptionMatches */ + #if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; icurexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + if (unlikely(PyTuple_Check(err))) + return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* GetException */ + #if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { +#endif + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = local_type; + tstate->exc_state.exc_value = local_value; + tstate->exc_state.exc_traceback = local_tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", + name, type->tp_name, Py_TYPE(obj)->tp_name); + return 0; +} + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* None */ + static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* GetAttr */ + static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetItemInt */ + static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* ObjectGetItem */ + #if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { + PyObject *runerr; + Py_ssize_t key_value; + PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; + if (unlikely(!(m && m->sq_item))) { + PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); + return NULL; + } + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { + PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; + if (likely(m && m->mp_subscript)) { + return m->mp_subscript(obj, key); + } + return __Pyx_PyObject_GetIndex(obj, key); +} +#endif + +/* decode_c_string */ + static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { + Py_ssize_t length; + if (unlikely((start < 0) | (stop < 0))) { + size_t slen = strlen(cstring); + if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, + "c-string too long to convert to Python"); + return NULL; + } + length = (Py_ssize_t) slen; + if (start < 0) { + start += length; + if (start < 0) + start = 0; + } + if (stop < 0) + stop += length; + } + length = stop - start; + if (unlikely(length <= 0)) + return PyUnicode_FromUnicode(NULL, 0); + cstring += start; + if (decode_func) { + return decode_func(cstring, length, errors); + } else { + return PyUnicode_Decode(cstring, length, encoding, errors); + } +} + +/* GetAttr3 */ + static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r = __Pyx_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +} + +/* SwapException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = *type; + tstate->exc_state.exc_value = *value; + tstate->exc_state.exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + const digit* digits = ((PyLongObject*)op1)->ob_digit; + const Py_ssize_t size = Py_SIZE(op1); + if (likely(__Pyx_sst_abs(size) <= 1)) { + a = likely(size) ? digits[0] : 0; + if (size == -1) a = -a; + } else { + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; + double a = PyFloat_AS_DOUBLE(op1); + double result; + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* None */ + static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* None */ + static CYTHON_INLINE long __Pyx_div_long(long a, long b) { + long q = a / b; + long r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* WriteUnraisableException */ + static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, + CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, + int full_traceback, CYTHON_UNUSED int nogil) { + PyObject *old_exc, *old_val, *old_tb; + PyObject *ctx; + __Pyx_PyThreadState_declare +#ifdef WITH_THREAD + PyGILState_STATE state; + if (nogil) + state = PyGILState_Ensure(); +#ifdef _MSC_VER + else state = (PyGILState_STATE)-1; +#endif +#endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); + if (full_traceback) { + Py_XINCREF(old_exc); + Py_XINCREF(old_val); + Py_XINCREF(old_tb); + __Pyx_ErrRestore(old_exc, old_val, old_tb); + PyErr_PrintEx(1); + } + #if PY_MAJOR_VERSION < 3 + ctx = PyString_FromString(name); + #else + ctx = PyUnicode_FromString(name); + #endif + __Pyx_ErrRestore(old_exc, old_val, old_tb); + if (!ctx) { + PyErr_WriteUnraisable(Py_None); + } else { + PyErr_WriteUnraisable(ctx); + Py_DECREF(ctx); + } +#ifdef WITH_THREAD + if (nogil) + PyGILState_Release(state); +#endif +} + +/* ImportFrom */ + static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ + static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (unlikely(!r)) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'%.50s' object has no attribute '%U'", + tp->tp_name, attr_name); +#else + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(attr_name)); +#endif + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* SetVTable */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX >= 0x02070000 + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#else + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* SetupReduce */ + static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; +#else + if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; +#endif +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; + setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto GOOD; +BAD: + if (!PyErr_Occurred()) + PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); + ret = -1; +GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + use_cline = __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback); + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (PyObject_Not(use_cline) != 0) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + else if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* Capsule */ + static CYTHON_INLINE PyObject * +__pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) +{ + PyObject *cobj; +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(p, sig, NULL); +#else + cobj = PyCObject_FromVoidPtr(p, NULL); +#endif + return cobj; +} + +/* IsLittleEndian */ + static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ + static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t < '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparseable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static PyObject * +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number; + int ndim = ctx->head->field->type->ndim; +; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) + return PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + if (*ts != ',' && *ts != ')') + return PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + if (*ts == ',') ts++; + i++; + } + if (i != ndim) + return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return NULL; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return Py_None; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if (ctx->enc_type == *ts && got_Z == ctx->is_complex && + ctx->enc_packmode == ctx->new_packmode) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (buf->strides[dim] != sizeof(void *)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (buf->strides[dim] != buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (stride < buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (spec & (__Pyx_MEMVIEW_PTR)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (buf->suboffsets) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) +{ + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (buf->suboffsets && buf->suboffsets[dim] >= 0) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (!buf->suboffsets || (buf->suboffsets && buf->suboffsets[dim] < 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) + { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (buf->ndim != ndim) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if ((unsigned) buf->itemsize != dtype->size) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (!__pyx_check_strides(buf, i, ndim, spec)) + goto fail; + if (!__pyx_check_suboffsets(buf, i, ndim, spec)) + goto fail; + } + if (buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_FOLLOW), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_CONTIG) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, __Pyx_IS_C_CONTIG, + (PyBUF_C_CONTIGUOUS | PyBUF_FORMAT) | writable_flag, 2, + &__Pyx_TypeInfo_float, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_float(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 1, + &__Pyx_TypeInfo_float, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 1, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* MemviewDtypeToObject */ + static CYTHON_INLINE PyObject *__pyx_memview_get_float(const char *itemp) { + return (PyObject *) PyFloat_FromDouble(*(float *) itemp); +} +static CYTHON_INLINE int __pyx_memview_set_float(const char *itemp, PyObject *obj) { + float value = __pyx_PyFloat_AsFloat(obj); + if ((value == (float)-1) && PyErr_Occurred()) + return 0; + *(float *) itemp = value; + return 1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int64) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int64) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(npy_int64), + little, !is_unsigned); + } +} + +/* MemviewDtypeToObject */ + static CYTHON_INLINE PyObject *__pyx_memview_get_nn___pyx_t_5numpy_int64_t(const char *itemp) { + return (PyObject *) __Pyx_PyInt_From_npy_int64(*(__pyx_t_5numpy_int64_t *) itemp); +} +static CYTHON_INLINE int __pyx_memview_set_nn___pyx_t_5numpy_int64_t(const char *itemp, PyObject *obj) { + __pyx_t_5numpy_int64_t value = __Pyx_PyInt_As_npy_int64(obj); + if ((value == ((npy_int64)-1)) && PyErr_Occurred()) + return 0; + *(__pyx_t_5numpy_int64_t *) itemp = value; + return 1; +} + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = 1.0 / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = 1.0 / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0, -1); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = 1.0 / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = 1.0 / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0, -1); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); + } +} + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (from_mvs->suboffsets[i] >= 0) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *x) { + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(npy_int64) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (npy_int64) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_int64) 0; + case 1: __PYX_VERIFY_RETURN_INT(npy_int64, digit, digits[0]) + case 2: + if (8 * sizeof(npy_int64) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) >= 2 * PyLong_SHIFT) { + return (npy_int64) (((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(npy_int64) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) >= 3 * PyLong_SHIFT) { + return (npy_int64) (((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(npy_int64) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) >= 4 * PyLong_SHIFT) { + return (npy_int64) (((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_int64) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(npy_int64) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_int64) 0; + case -1: __PYX_VERIFY_RETURN_INT(npy_int64, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(npy_int64, digit, +digits[0]) + case -2: + if (8 * sizeof(npy_int64) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT) { + return (npy_int64) (((npy_int64)-1)*(((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(npy_int64) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT) { + return (npy_int64) ((((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT) { + return (npy_int64) (((npy_int64)-1)*(((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(npy_int64) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT) { + return (npy_int64) ((((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT) { + return (npy_int64) (((npy_int64)-1)*(((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(npy_int64) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT) { + return (npy_int64) ((((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + } +#endif + if (sizeof(npy_int64) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + npy_int64 val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (npy_int64) -1; + } + } else { + npy_int64 val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (npy_int64) -1; + val = __Pyx_PyInt_As_npy_int64(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to npy_int64"); + return (npy_int64) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to npy_int64"); + return (npy_int64) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { + const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(size_t) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (size_t) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { + return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { + return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { + return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (size_t) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(size_t) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) + case -2: + if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + } +#endif + if (sizeof(size_t) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + size_t val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (size_t) -1; + } + } else { + size_t val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (size_t) -1; + val = __Pyx_PyInt_As_size_t(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to size_t"); + return (size_t) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to size_t"); + return (size_t) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { + const char neg_one = (char) -1, const_zero = (char) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(char) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case 1: __PYX_VERIFY_RETURN_INT(char, digit, digits[0]) + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 2 * PyLong_SHIFT) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 3 * PyLong_SHIFT) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 4 * PyLong_SHIFT) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(char) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case -1: __PYX_VERIFY_RETURN_INT(char, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(char, digit, +digits[0]) + case -2: + if (8 * sizeof(char) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } +#endif + if (sizeof(char) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* CheckBinaryVersion */ + static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* ModuleImport */ + #ifndef __PYX_HAVE_RT_ImportModule +#define __PYX_HAVE_RT_ImportModule +static PyObject *__Pyx_ImportModule(const char *name) { + PyObject *py_name = 0; + PyObject *py_module = 0; + py_name = __Pyx_PyIdentifier_FromString(name); + if (!py_name) + goto bad; + py_module = PyImport_Import(py_name); + Py_DECREF(py_name); + return py_module; +bad: + Py_XDECREF(py_name); + return 0; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, + size_t size, int strict) +{ + PyObject *py_module = 0; + PyObject *result = 0; + PyObject *py_name = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + py_module = __Pyx_ImportModule(module_name); + if (!py_module) + goto bad; + py_name = __Pyx_PyIdentifier_FromString(class_name); + if (!py_name) + goto bad; + result = PyObject_GetAttr(py_module, py_name); + Py_DECREF(py_name); + py_name = 0; + Py_DECREF(py_module); + py_module = 0; + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (!strict && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + else if ((size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +/* FunctionImport */ + #ifndef __PYX_HAVE_RT_ImportFunction +#define __PYX_HAVE_RT_ImportFunction +static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig) { + PyObject *d = 0; + PyObject *cobj = 0; + union { + void (*fp)(void); + void *p; + } tmp; + d = PyObject_GetAttrString(module, (char *)"__pyx_capi__"); + if (!d) + goto bad; + cobj = PyDict_GetItemString(d, funcname); + if (!cobj) { + PyErr_Format(PyExc_ImportError, + "%.200s does not export expected C function %.200s", + PyModule_GetName(module), funcname); + goto bad; + } +#if PY_VERSION_HEX >= 0x02070000 + if (!PyCapsule_IsValid(cobj, sig)) { + PyErr_Format(PyExc_TypeError, + "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", + PyModule_GetName(module), funcname, sig, PyCapsule_GetName(cobj)); + goto bad; + } + tmp.p = PyCapsule_GetPointer(cobj, sig); +#else + {const char *desc, *s1, *s2; + desc = (const char *)PyCObject_GetDesc(cobj); + if (!desc) + goto bad; + s1 = desc; s2 = sig; + while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; } + if (*s1 != *s2) { + PyErr_Format(PyExc_TypeError, + "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", + PyModule_GetName(module), funcname, sig, desc); + goto bad; + } + tmp.p = PyCObject_AsVoidPtr(cobj);} +#endif + *f = tmp.fp; + if (!(*f)) + goto bad; + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(d); + return -1; +} +#endif + +/* InitStrings */ + static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/package/MDAnalysis/lib/_cutil.cpp b/package/MDAnalysis/lib/_cutil.cpp new file mode 100644 index 00000000000..4f5c03ec31e --- /dev/null +++ b/package/MDAnalysis/lib/_cutil.cpp @@ -0,0 +1,28436 @@ +/* Generated by Cython 0.28.5 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h", + "MDAnalysis/lib/include/calc_distances.h" + ], + "extra_compile_args": [ + "-ffast-math", + "-O3", + "-funroll-loops", + "-std=c++11", + "-stdlib=libc++" + ], + "include_dirs": [ + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include", + "MDAnalysis/lib/include" + ], + "language": "c++", + "libraries": [ + "m" + ], + "name": "MDAnalysis.lib._cutil", + "sources": [ + "MDAnalysis/lib/_cutil.pyx" + ] + }, + "module_name": "MDAnalysis.lib._cutil" +} +END: Cython Metadata */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.6+ or Python 3.3+. +#else +#define CYTHON_ABI "0_28_5" +#define CYTHON_FUTURE_DIVISION 0 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (0 && PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef __cplusplus + #error "Cython files generated with the C++ option must be compiled with a C++ compiler." +#endif +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #else + #define CYTHON_INLINE inline + #endif +#endif +template +void __Pyx_call_destructor(T& x) { + x.~T(); +} +template +class __Pyx_FakeReference { + public: + __Pyx_FakeReference() : ptr(NULL) { } + __Pyx_FakeReference(const T& ref) : ptr(const_cast(&ref)) { } + T *operator->() { return ptr; } + T *operator&() { return ptr; } + operator T&() { return *ptr; } + template bool operator ==(U other) { return *ptr == other; } + template bool operator !=(U other) { return *ptr != other; } + private: + T *ptr; +}; + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; // PyThread_create_key reports success always +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif // TSS (Thread Specific Storage) API +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + + +#define __PYX_ERR(f_index, lineno, Ln_error) \ +{ \ + __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +} + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__MDAnalysis__lib___cutil +#define __PYX_HAVE_API__MDAnalysis__lib___cutil +/* Early includes */ +#include +#include +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include +#include "ios" +#include "new" +#include "stdexcept" +#include "typeinfo" +#include +#include +#include +#include +#include "calc_distances.h" +#include "pythread.h" +#include +#include "pystate.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif defined(_Complex_I) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + + +static const char *__pyx_f[] = { + "MDAnalysis/lib/_cutil.pyx", + "__init__.pxd", + "stringsource", + "type.pxd", +}; +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __pyx_atomic_int_type int +#if CYTHON_ATOMICS && __GNUC__ >= 4 && (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL >= 2)) &&\ + !defined(__i386__) + #define __pyx_atomic_incr_aligned(value, lock) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value, lock) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) && 0 + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type LONG + #define __pyx_atomic_incr_aligned(value, lock) InterlockedIncrement(value) + #define __pyx_atomic_decr_aligned(value, lock) InterlockedDecrement(value) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#elif CYTHON_ATOMICS && (defined(__ICC) || defined(__INTEL_COMPILER)) && 0 + #define __pyx_atomic_incr_aligned(value, lock) _InterlockedIncrement(value) + #define __pyx_atomic_decr_aligned(value, lock) _InterlockedDecrement(value) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using Intel atomics" + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +typedef volatile __pyx_atomic_int_type __pyx_atomic_int; +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +#define IS_UNSIGNED(type) (((type) -1) > 0) +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_longlong __pyx_t_5numpy_long_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulonglong __pyx_t_5numpy_ulong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + + +/*--- Type declarations ---*/ +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; + +/* "MDAnalysis/lib/_cutil.pyx":44 + * void minimum_image_triclinic(double *dx, coordinate *box) + * + * ctypedef cset[int] intset # <<<<<<<<<<<<<< + * ctypedef cmap[int, intset] intmap + * + */ +typedef std::set __pyx_t_10MDAnalysis_3lib_6_cutil_intset; + +/* "MDAnalysis/lib/_cutil.pyx":45 + * + * ctypedef cset[int] intset + * ctypedef cmap[int, intset] intmap # <<<<<<<<<<<<<< + * + * + */ +typedef std::map __pyx_t_10MDAnalysis_3lib_6_cutil_intmap; + +/* "View.MemoryView":104 + * + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":278 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":329 + * + * @cname('__pyx_memoryview') + * cdef class memoryview(object): # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int acquisition_count[2]; + __pyx_atomic_int *acquisition_count_aligned_p; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":960 + * + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "View.MemoryView":104 + * + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":329 + * + * @cname('__pyx_memoryview') + * cdef class memoryview(object): # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":960 + * + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* GetModuleGlobalName.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (memview->acquisition_count_aligned_p) +#define __pyx_get_slice_count(memview) (*__pyx_get_slice_count_pointer(memview)) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XDEC_MEMVIEW(slice, have_gil) __Pyx_XDEC_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* WriteUnraisableException.proto */ +static void __Pyx_WriteUnraisable(const char *name, int clineno, + int lineno, const char *filename, + int full_traceback, int nogil); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* IncludeStringH.proto */ +#include + +/* PyObjectCallNoArg.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); +#else +#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectSetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o, n, NULL) +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value); +#else +#define __Pyx_PyObject_DelAttrStr(o,n) PyObject_DelAttr(o,n) +#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v) +#endif + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* None.proto */ +static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); + +/* UnaryNegOverflows.proto */ +#define UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* decode_c_string_utf16.proto */ +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 0; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = -1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} + +/* decode_c_string.proto */ +static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* None.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* None.proto */ +static CYTHON_INLINE long __Pyx_div_long(long, long); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyObject *dict, void *vtable); + +/* SetupReduce.proto */ +static int __Pyx_setup_reduce(PyObject* type_obj); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* Capsule.proto */ +static CYTHON_INLINE PyObject *__pyx_capsule_create(void *p, const char *sig); + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(PyObject *, int writable_flag); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); + +/* MemviewDtypeToObject.proto */ +static CYTHON_INLINE PyObject *__pyx_memview_get_nn___pyx_t_5numpy_int64_t(const char *itemp); +static CYTHON_INLINE int __pyx_memview_set_nn___pyx_t_5numpy_int64_t(const char *itemp, PyObject *obj); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CppExceptionConversion.proto */ +#ifndef __Pyx_CppExn2PyErr +#include +#include +#include +#include +static void __Pyx_CppExn2PyErr() { + try { + if (PyErr_Occurred()) + ; // let the latest Python exn pass through and ignore the current one + else + throw; + } catch (const std::bad_alloc& exn) { + PyErr_SetString(PyExc_MemoryError, exn.what()); + } catch (const std::bad_cast& exn) { + PyErr_SetString(PyExc_TypeError, exn.what()); + } catch (const std::bad_typeid& exn) { + PyErr_SetString(PyExc_TypeError, exn.what()); + } catch (const std::domain_error& exn) { + PyErr_SetString(PyExc_ValueError, exn.what()); + } catch (const std::invalid_argument& exn) { + PyErr_SetString(PyExc_ValueError, exn.what()); + } catch (const std::ios_base::failure& exn) { + PyErr_SetString(PyExc_IOError, exn.what()); + } catch (const std::out_of_range& exn) { + PyErr_SetString(PyExc_IndexError, exn.what()); + } catch (const std::overflow_error& exn) { + PyErr_SetString(PyExc_OverflowError, exn.what()); + } catch (const std::range_error& exn) { + PyErr_SetString(PyExc_ArithmeticError, exn.what()); + } catch (const std::underflow_error& exn) { + PyErr_SetString(PyExc_ArithmeticError, exn.what()); + } catch (const std::exception& exn) { + PyErr_SetString(PyExc_RuntimeError, exn.what()); + } + catch (...) + { + PyErr_SetString(PyExc_RuntimeError, "Unknown exception"); + } +} +#endif + +/* MemviewDtypeToObject.proto */ +static CYTHON_INLINE PyObject *__pyx_memview_get_float(const char *itemp); +static CYTHON_INLINE int __pyx_memview_set_float(const char *itemp, PyObject *obj); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* CIntFromPy.proto */ +static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_Py_ssize_t(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_float(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_int(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_float(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *, int writable_flag); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* FunctionExport.proto */ +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); + +/* PyIdentifierFromString.proto */ +#if !defined(__Pyx_PyIdentifier_FromString) +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) +#else + #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) +#endif +#endif + +/* ModuleImport.proto */ +static PyObject *__Pyx_ImportModule(const char *name); + +/* TypeImport.proto */ +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ + +/* Module declarations from 'cython.view' */ + +/* Module declarations from 'cython' */ + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'cpython.mem' */ + +/* Module declarations from 'numpy' */ + +/* Module declarations from 'numpy' */ +static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; +static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; +static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; +static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ + +/* Module declarations from 'libc.math' */ + +/* Module declarations from 'libcpp.utility' */ + +/* Module declarations from 'libcpp.set' */ + +/* Module declarations from 'libcpp.map' */ + +/* Module declarations from 'libcpp.vector' */ + +/* Module declarations from 'MDAnalysis.lib._cutil' */ +static PyTypeObject *__pyx_array_type = 0; +static PyTypeObject *__pyx_MemviewEnum_type = 0; +static PyTypeObject *__pyx_memoryview_type = 0; +static PyTypeObject *__pyx_memoryviewslice_type = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_f_10MDAnalysis_3lib_6_cutil_difference(__pyx_t_10MDAnalysis_3lib_6_cutil_intset, __pyx_t_10MDAnalysis_3lib_6_cutil_intset); /*proto*/ +static int __Pyx_carray_from_py_float(PyObject *, float *, Py_ssize_t); /*proto*/ +static int __Pyx_carray_from_py_float___5b_3_5d_(PyObject *, float (*)[3], Py_ssize_t); /*proto*/ +static PyObject *__pyx_convert_vector_to_py_int(const std::vector &); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static void *__pyx_align_pointer(void *, size_t); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static PyObject *assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, char *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, char *); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t = { "int64_t", NULL, sizeof(__pyx_t_5numpy_int64_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_int64_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_int64_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_Py_ssize_t = { "Py_ssize_t", NULL, sizeof(Py_ssize_t), { 0 }, 0, IS_UNSIGNED(Py_ssize_t) ? 'U' : 'I', IS_UNSIGNED(Py_ssize_t), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_float = { "float", NULL, sizeof(float), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_int = { "int", NULL, sizeof(int), { 0 }, 0, IS_UNSIGNED(int) ? 'U' : 'I', IS_UNSIGNED(int), 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_int32_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_int32_t), 0 }; +#define __Pyx_MODULE_NAME "MDAnalysis.lib._cutil" +extern int __pyx_module_is_main_MDAnalysis__lib___cutil; +int __pyx_module_is_main_MDAnalysis__lib___cutil = 0; + +/* Implementation of 'MDAnalysis.lib._cutil' */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_AttributeError; +static PyObject *__pyx_builtin_RuntimeError; +static PyObject *__pyx_builtin_ImportError; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_OverflowError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_a[] = "a"; +static const char __pyx_k_b[] = "b"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k_j[] = "j"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_ix[] = "ix"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k_all[] = "__all__"; +static const char __pyx_k_box[] = "box"; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_ref[] = "ref"; +static const char __pyx_k_vec[] = "vec"; +static const char __pyx_k_atom[] = "atom"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_done[] = "done"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_sort[] = "sort"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_todo[] = "todo"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_array[] = "array"; +static const char __pyx_k_atoms[] = "atoms"; +static const char __pyx_k_bonds[] = "bonds"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_empty[] = "empty"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_frags[] = "frags"; +static const char __pyx_k_int32[] = "int32"; +static const char __pyx_k_int64[] = "int64"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_ortho[] = "ortho"; +static const char __pyx_k_other[] = "other"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_zeros[] = "zeros"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_natoms[] = "natoms"; +static const char __pyx_k_newpos[] = "newpos"; +static const char __pyx_k_nloops[] = "nloops"; +static const char __pyx_k_oldpos[] = "oldpos"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_result[] = "result"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_values[] = "values"; +static const char __pyx_k_asarray[] = "asarray"; +static const char __pyx_k_bonding[] = "bonding"; +static const char __pyx_k_bondmap[] = "bondmap"; +static const char __pyx_k_float32[] = "float32"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_ix_view[] = "ix_view"; +static const char __pyx_k_mdamath[] = "mdamath"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_tri_box[] = "tri_box"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_bondlist[] = "bondlist"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_n_values[] = "n_values"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_atomgroup[] = "atomgroup"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_frag_done[] = "frag_done"; +static const char __pyx_k_frag_todo[] = "frag_todo"; +static const char __pyx_k_ix_to_rel[] = "ix_to_rel"; +static const char __pyx_k_positions[] = "positions"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_refpoints[] = "refpoints"; +static const char __pyx_k_this_frag[] = "this_frag"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_MDAnalysis[] = "MDAnalysis"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_atoms_view[] = "atoms_view"; +static const char __pyx_k_bonds_view[] = "bonds_view"; +static const char __pyx_k_dimensions[] = "dimensions"; +static const char __pyx_k_make_whole[] = "make_whole"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_to_indices[] = "to_indices"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_NoDataError[] = "NoDataError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_inverse_box[] = "inverse_box"; +static const char __pyx_k_RuntimeError[] = "RuntimeError"; +static const char __pyx_k_is_monotonic[] = "is_monotonic"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = "stringsource"; +static const char __pyx_k_OverflowError[] = "OverflowError"; +static const char __pyx_k_pyx_getbuffer[] = "__pyx_getbuffer"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_unique_int_1d[] = "unique_int_1d"; +static const char __pyx_k_AttributeError[] = "AttributeError"; +static const char __pyx_k_find_fragments[] = "find_fragments"; +static const char __pyx_k_reference_atom[] = "reference_atom"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_triclinic_vectors[] = "triclinic_vectors"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_MDAnalysis_lib__cutil[] = "MDAnalysis.lib._cutil"; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_Cannot_index_with_type_s[] = "Cannot index with type '%s'"; +static const char __pyx_k_Invalid_shape_in_axis_d_d[] = "Invalid shape in axis %d: %d."; +static const char __pyx_k_MDAnalysis_lib__cutil_pyx[] = "MDAnalysis/lib/_cutil.pyx"; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_One_or_more_dimensions_was_zero[] = "One or more dimensions was zero. You can set dimensions using 'atomgroup.dimensions='"; +static const char __pyx_k_Reference_atom_not_in_atomgroup[] = "Reference atom not in atomgroup"; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static const char __pyx_k_AtomGroup_was_not_contiguous_fro[] = "AtomGroup was not contiguous from bonds, process failed"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static const char __pyx_k_Incompatible_checksums_s_vs_0xb0[] = "Incompatible checksums (%s vs 0xb068931 = (name))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got %s"; +static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis %d)"; +static const char __pyx_k_The_atomgroup_is_required_to_hav[] = "The atomgroup is required to have bonds"; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension %d (got %d and %d)"; +static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_ASCII; +static PyObject *__pyx_kp_s_AtomGroup_was_not_contiguous_fro; +static PyObject *__pyx_n_s_AttributeError; +static PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; +static PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; +static PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; +static PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; +static PyObject *__pyx_kp_s_Cannot_index_with_type_s; +static PyObject *__pyx_n_s_Ellipsis; +static PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; +static PyObject *__pyx_n_s_ImportError; +static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xb0; +static PyObject *__pyx_n_s_IndexError; +static PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; +static PyObject *__pyx_kp_s_Invalid_mode_expected_c_or_fortr; +static PyObject *__pyx_kp_s_Invalid_shape_in_axis_d_d; +static PyObject *__pyx_n_s_MDAnalysis; +static PyObject *__pyx_n_s_MDAnalysis_lib__cutil; +static PyObject *__pyx_kp_s_MDAnalysis_lib__cutil_pyx; +static PyObject *__pyx_n_s_MemoryError; +static PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; +static PyObject *__pyx_kp_s_MemoryView_of_r_object; +static PyObject *__pyx_n_s_NoDataError; +static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; +static PyObject *__pyx_n_b_O; +static PyObject *__pyx_kp_s_One_or_more_dimensions_was_zero; +static PyObject *__pyx_kp_s_Out_of_bounds_on_buffer_access_a; +static PyObject *__pyx_n_s_OverflowError; +static PyObject *__pyx_n_s_PickleError; +static PyObject *__pyx_kp_s_Reference_atom_not_in_atomgroup; +static PyObject *__pyx_n_s_RuntimeError; +static PyObject *__pyx_kp_s_The_atomgroup_is_required_to_hav; +static PyObject *__pyx_n_s_TypeError; +static PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_n_s_View_MemoryView; +static PyObject *__pyx_n_s_a; +static PyObject *__pyx_n_s_all; +static PyObject *__pyx_n_s_allocate_buffer; +static PyObject *__pyx_n_s_array; +static PyObject *__pyx_n_s_asarray; +static PyObject *__pyx_n_s_atom; +static PyObject *__pyx_n_s_atomgroup; +static PyObject *__pyx_n_s_atoms; +static PyObject *__pyx_n_s_atoms_view; +static PyObject *__pyx_n_s_b; +static PyObject *__pyx_n_s_base; +static PyObject *__pyx_n_s_bonding; +static PyObject *__pyx_n_s_bondlist; +static PyObject *__pyx_n_s_bondmap; +static PyObject *__pyx_n_s_bonds; +static PyObject *__pyx_n_s_bonds_view; +static PyObject *__pyx_n_s_box; +static PyObject *__pyx_n_s_c; +static PyObject *__pyx_n_u_c; +static PyObject *__pyx_n_s_class; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_kp_s_contiguous_and_direct; +static PyObject *__pyx_kp_s_contiguous_and_indirect; +static PyObject *__pyx_n_s_dict; +static PyObject *__pyx_n_s_dimensions; +static PyObject *__pyx_n_s_done; +static PyObject *__pyx_n_s_dtype; +static PyObject *__pyx_n_s_dtype_is_object; +static PyObject *__pyx_n_s_empty; +static PyObject *__pyx_n_s_encode; +static PyObject *__pyx_n_s_enumerate; +static PyObject *__pyx_n_s_error; +static PyObject *__pyx_n_s_find_fragments; +static PyObject *__pyx_n_s_flags; +static PyObject *__pyx_n_s_float32; +static PyObject *__pyx_n_s_format; +static PyObject *__pyx_n_s_fortran; +static PyObject *__pyx_n_u_fortran; +static PyObject *__pyx_n_s_frag_done; +static PyObject *__pyx_n_s_frag_todo; +static PyObject *__pyx_n_s_frags; +static PyObject *__pyx_n_s_getstate; +static PyObject *__pyx_kp_s_got_differing_extents_in_dimensi; +static PyObject *__pyx_n_s_i; +static PyObject *__pyx_n_s_id; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_int32; +static PyObject *__pyx_n_s_int64; +static PyObject *__pyx_n_s_inverse_box; +static PyObject *__pyx_n_s_is_monotonic; +static PyObject *__pyx_n_s_itemsize; +static PyObject *__pyx_kp_s_itemsize_0_for_cython_array; +static PyObject *__pyx_n_s_ix; +static PyObject *__pyx_n_s_ix_to_rel; +static PyObject *__pyx_n_s_ix_view; +static PyObject *__pyx_n_s_j; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_make_whole; +static PyObject *__pyx_n_s_mdamath; +static PyObject *__pyx_n_s_memview; +static PyObject *__pyx_n_s_mode; +static PyObject *__pyx_n_s_n_values; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_name_2; +static PyObject *__pyx_n_s_natoms; +static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; +static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; +static PyObject *__pyx_n_s_ndim; +static PyObject *__pyx_n_s_new; +static PyObject *__pyx_n_s_newpos; +static PyObject *__pyx_n_s_nloops; +static PyObject *__pyx_kp_s_no_default___reduce___due_to_non; +static PyObject *__pyx_n_s_np; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; +static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; +static PyObject *__pyx_n_s_obj; +static PyObject *__pyx_n_s_oldpos; +static PyObject *__pyx_n_s_ortho; +static PyObject *__pyx_n_s_other; +static PyObject *__pyx_n_s_pack; +static PyObject *__pyx_n_s_pickle; +static PyObject *__pyx_n_s_positions; +static PyObject *__pyx_n_s_pyx_PickleError; +static PyObject *__pyx_n_s_pyx_checksum; +static PyObject *__pyx_n_s_pyx_getbuffer; +static PyObject *__pyx_n_s_pyx_result; +static PyObject *__pyx_n_s_pyx_state; +static PyObject *__pyx_n_s_pyx_type; +static PyObject *__pyx_n_s_pyx_unpickle_Enum; +static PyObject *__pyx_n_s_pyx_vtable; +static PyObject *__pyx_n_s_range; +static PyObject *__pyx_n_s_reduce; +static PyObject *__pyx_n_s_reduce_cython; +static PyObject *__pyx_n_s_reduce_ex; +static PyObject *__pyx_n_s_ref; +static PyObject *__pyx_n_s_reference_atom; +static PyObject *__pyx_n_s_refpoints; +static PyObject *__pyx_n_s_result; +static PyObject *__pyx_n_s_setstate; +static PyObject *__pyx_n_s_setstate_cython; +static PyObject *__pyx_n_s_shape; +static PyObject *__pyx_n_s_size; +static PyObject *__pyx_n_s_sort; +static PyObject *__pyx_n_s_start; +static PyObject *__pyx_n_s_step; +static PyObject *__pyx_n_s_stop; +static PyObject *__pyx_kp_s_strided_and_direct; +static PyObject *__pyx_kp_s_strided_and_direct_or_indirect; +static PyObject *__pyx_kp_s_strided_and_indirect; +static PyObject *__pyx_kp_s_stringsource; +static PyObject *__pyx_n_s_struct; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_this_frag; +static PyObject *__pyx_n_s_to_indices; +static PyObject *__pyx_n_s_todo; +static PyObject *__pyx_n_s_tri_box; +static PyObject *__pyx_n_s_triclinic_vectors; +static PyObject *__pyx_kp_s_unable_to_allocate_array_data; +static PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; +static PyObject *__pyx_n_s_unique_int_1d; +static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; +static PyObject *__pyx_n_s_unpack; +static PyObject *__pyx_n_s_update; +static PyObject *__pyx_n_s_values; +static PyObject *__pyx_n_s_vec; +static PyObject *__pyx_n_s_zeros; +static PyObject *__pyx_pf_10MDAnalysis_3lib_6_cutil_unique_int_1d(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_values); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6_cutil_2make_whole(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_atomgroup, PyObject *__pyx_v_reference_atom); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6_cutil_4find_fragments(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_atoms, PyObject *__pyx_v_bondlist); /* proto */ +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_3; +static PyObject *__pyx_int_184977713; +static PyObject *__pyx_int_neg_1; +static PyObject *__pyx_slice_; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__6; +static PyObject *__pyx_tuple__7; +static PyObject *__pyx_tuple__8; +static PyObject *__pyx_tuple__9; +static PyObject *__pyx_slice__30; +static PyObject *__pyx_slice__31; +static PyObject *__pyx_slice__32; +static PyObject *__pyx_tuple__10; +static PyObject *__pyx_tuple__11; +static PyObject *__pyx_tuple__12; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_tuple__14; +static PyObject *__pyx_tuple__15; +static PyObject *__pyx_tuple__16; +static PyObject *__pyx_tuple__17; +static PyObject *__pyx_tuple__18; +static PyObject *__pyx_tuple__19; +static PyObject *__pyx_tuple__20; +static PyObject *__pyx_tuple__21; +static PyObject *__pyx_tuple__22; +static PyObject *__pyx_tuple__23; +static PyObject *__pyx_tuple__24; +static PyObject *__pyx_tuple__25; +static PyObject *__pyx_tuple__26; +static PyObject *__pyx_tuple__27; +static PyObject *__pyx_tuple__28; +static PyObject *__pyx_tuple__29; +static PyObject *__pyx_tuple__33; +static PyObject *__pyx_tuple__34; +static PyObject *__pyx_tuple__35; +static PyObject *__pyx_tuple__36; +static PyObject *__pyx_tuple__38; +static PyObject *__pyx_tuple__40; +static PyObject *__pyx_tuple__42; +static PyObject *__pyx_tuple__43; +static PyObject *__pyx_tuple__44; +static PyObject *__pyx_tuple__45; +static PyObject *__pyx_tuple__46; +static PyObject *__pyx_tuple__47; +static PyObject *__pyx_codeobj__37; +static PyObject *__pyx_codeobj__39; +static PyObject *__pyx_codeobj__41; +static PyObject *__pyx_codeobj__48; +/* Late includes */ + +/* "MDAnalysis/lib/_cutil.pyx":50 + * @cython.boundscheck(False) # turn off bounds-checking for entire function + * @cython.wraparound(False) # turn off negative index wrapping for entire function + * def unique_int_1d(np.int64_t[:] values): # <<<<<<<<<<<<<< + * """Find the unique elements of a 1D array of integers. + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6_cutil_1unique_int_1d(PyObject *__pyx_self, PyObject *__pyx_arg_values); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6_cutil_unique_int_1d[] = "Find the unique elements of a 1D array of integers.\n\n This function is optimal on sorted arrays.\n\n Parameters\n ----------\n values: numpy.ndarray\n 1D array of dtype ``numpy.int64`` in which to find the unique values.\n\n Returns\n -------\n numpy.ndarray\n A deduplicated copy of `values`.\n\n\n .. versionadded:: 0.19.0\n "; +static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_6_cutil_1unique_int_1d = {"unique_int_1d", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6_cutil_1unique_int_1d, METH_O, __pyx_doc_10MDAnalysis_3lib_6_cutil_unique_int_1d}; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6_cutil_1unique_int_1d(PyObject *__pyx_self, PyObject *__pyx_arg_values) { + __Pyx_memviewslice __pyx_v_values = { 0, 0, { 0 }, { 0 }, { 0 } }; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("unique_int_1d (wrapper)", 0); + assert(__pyx_arg_values); { + __pyx_v_values = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(__pyx_arg_values, PyBUF_WRITABLE); if (unlikely(!__pyx_v_values.memview)) __PYX_ERR(0, 50, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib._cutil.unique_int_1d", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6_cutil_unique_int_1d(__pyx_self, __pyx_v_values); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6_cutil_unique_int_1d(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_values) { + int __pyx_v_is_monotonic; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_n_values; + __Pyx_memviewslice __pyx_v_result = { 0, 0, { 0 }, { 0 }, { 0 } }; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_memviewslice __pyx_t_6 = { 0, 0, { 0 }, { 0 }, { 0 } }; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + PyObject *__pyx_t_19 = NULL; + PyObject *__pyx_t_20 = NULL; + __Pyx_RefNannySetupContext("unique_int_1d", 0); + + /* "MDAnalysis/lib/_cutil.pyx":68 + * .. versionadded:: 0.19.0 + * """ + * cdef bint is_monotonic = True # <<<<<<<<<<<<<< + * cdef int i = 0 + * cdef int j = 0 + */ + __pyx_v_is_monotonic = 1; + + /* "MDAnalysis/lib/_cutil.pyx":69 + * """ + * cdef bint is_monotonic = True + * cdef int i = 0 # <<<<<<<<<<<<<< + * cdef int j = 0 + * cdef int n_values = values.shape[0] + */ + __pyx_v_i = 0; + + /* "MDAnalysis/lib/_cutil.pyx":70 + * cdef bint is_monotonic = True + * cdef int i = 0 + * cdef int j = 0 # <<<<<<<<<<<<<< + * cdef int n_values = values.shape[0] + * cdef np.int64_t[:] result = np.empty(n_values, dtype=np.int64) + */ + __pyx_v_j = 0; + + /* "MDAnalysis/lib/_cutil.pyx":71 + * cdef int i = 0 + * cdef int j = 0 + * cdef int n_values = values.shape[0] # <<<<<<<<<<<<<< + * cdef np.int64_t[:] result = np.empty(n_values, dtype=np.int64) + * + */ + __pyx_v_n_values = (__pyx_v_values.shape[0]); + + /* "MDAnalysis/lib/_cutil.pyx":72 + * cdef int j = 0 + * cdef int n_values = values.shape[0] + * cdef np.int64_t[:] result = np.empty(n_values, dtype=np.int64) # <<<<<<<<<<<<<< + * + * if n_values == 0: + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_values); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int64); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = __pyx_t_6; + __pyx_t_6.memview = NULL; + __pyx_t_6.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":74 + * cdef np.int64_t[:] result = np.empty(n_values, dtype=np.int64) + * + * if n_values == 0: # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_7 = ((__pyx_v_n_values == 0) != 0); + if (__pyx_t_7) { + + /* "MDAnalysis/lib/_cutil.pyx":75 + * + * if n_values == 0: + * return result # <<<<<<<<<<<<<< + * + * result[0] = values[0] + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __pyx_memoryview_fromslice(__pyx_v_result, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_int64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_int64_t, 0);; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/_cutil.pyx":74 + * cdef np.int64_t[:] result = np.empty(n_values, dtype=np.int64) + * + * if n_values == 0: # <<<<<<<<<<<<<< + * return result + * + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":77 + * return result + * + * result[0] = values[0] # <<<<<<<<<<<<<< + * for i in range(1, n_values): + * if values[i] != result[j]: + */ + __pyx_t_8 = 0; + __pyx_t_9 = 0; + *((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_result.data + __pyx_t_9 * __pyx_v_result.strides[0]) )) = (*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_values.data + __pyx_t_8 * __pyx_v_values.strides[0]) ))); + + /* "MDAnalysis/lib/_cutil.pyx":78 + * + * result[0] = values[0] + * for i in range(1, n_values): # <<<<<<<<<<<<<< + * if values[i] != result[j]: + * j += 1 + */ + __pyx_t_10 = __pyx_v_n_values; + __pyx_t_11 = __pyx_t_10; + for (__pyx_t_12 = 1; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { + __pyx_v_i = __pyx_t_12; + + /* "MDAnalysis/lib/_cutil.pyx":79 + * result[0] = values[0] + * for i in range(1, n_values): + * if values[i] != result[j]: # <<<<<<<<<<<<<< + * j += 1 + * result[j] = values[i] + */ + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = __pyx_v_j; + __pyx_t_7 = (((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_values.data + __pyx_t_13 * __pyx_v_values.strides[0]) ))) != (*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_result.data + __pyx_t_14 * __pyx_v_result.strides[0]) )))) != 0); + if (__pyx_t_7) { + + /* "MDAnalysis/lib/_cutil.pyx":80 + * for i in range(1, n_values): + * if values[i] != result[j]: + * j += 1 # <<<<<<<<<<<<<< + * result[j] = values[i] + * if values[i] < values[i - 1]: + */ + __pyx_v_j = (__pyx_v_j + 1); + + /* "MDAnalysis/lib/_cutil.pyx":81 + * if values[i] != result[j]: + * j += 1 + * result[j] = values[i] # <<<<<<<<<<<<<< + * if values[i] < values[i - 1]: + * is_monotonic = False + */ + __pyx_t_15 = __pyx_v_i; + __pyx_t_16 = __pyx_v_j; + *((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_result.data + __pyx_t_16 * __pyx_v_result.strides[0]) )) = (*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_values.data + __pyx_t_15 * __pyx_v_values.strides[0]) ))); + + /* "MDAnalysis/lib/_cutil.pyx":79 + * result[0] = values[0] + * for i in range(1, n_values): + * if values[i] != result[j]: # <<<<<<<<<<<<<< + * j += 1 + * result[j] = values[i] + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":82 + * j += 1 + * result[j] = values[i] + * if values[i] < values[i - 1]: # <<<<<<<<<<<<<< + * is_monotonic = False + * result = result[:j + 1] + */ + __pyx_t_17 = __pyx_v_i; + __pyx_t_18 = (__pyx_v_i - 1); + __pyx_t_7 = (((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_values.data + __pyx_t_17 * __pyx_v_values.strides[0]) ))) < (*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_values.data + __pyx_t_18 * __pyx_v_values.strides[0]) )))) != 0); + if (__pyx_t_7) { + + /* "MDAnalysis/lib/_cutil.pyx":83 + * result[j] = values[i] + * if values[i] < values[i - 1]: + * is_monotonic = False # <<<<<<<<<<<<<< + * result = result[:j + 1] + * if not is_monotonic: + */ + __pyx_v_is_monotonic = 0; + + /* "MDAnalysis/lib/_cutil.pyx":82 + * j += 1 + * result[j] = values[i] + * if values[i] < values[i - 1]: # <<<<<<<<<<<<<< + * is_monotonic = False + * result = result[:j + 1] + */ + } + } + + /* "MDAnalysis/lib/_cutil.pyx":84 + * if values[i] < values[i - 1]: + * is_monotonic = False + * result = result[:j + 1] # <<<<<<<<<<<<<< + * if not is_monotonic: + * result = unique_int_1d(np.sort(result)) + */ + __pyx_t_6.data = __pyx_v_result.data; + __pyx_t_6.memview = __pyx_v_result.memview; + __PYX_INC_MEMVIEW(&__pyx_t_6, 0); + __pyx_t_10 = -1; + if (unlikely(__pyx_memoryview_slice_memviewslice( + &__pyx_t_6, + __pyx_v_result.shape[0], __pyx_v_result.strides[0], __pyx_v_result.suboffsets[0], + 0, + 0, + &__pyx_t_10, + 0, + (__pyx_v_j + 1), + 0, + 0, + 1, + 0, + 1) < 0)) +{ + __PYX_ERR(0, 84, __pyx_L1_error) +} + +__PYX_XDEC_MEMVIEW(&__pyx_v_result, 1); + __pyx_v_result = __pyx_t_6; + __pyx_t_6.memview = NULL; + __pyx_t_6.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":85 + * is_monotonic = False + * result = result[:j + 1] + * if not is_monotonic: # <<<<<<<<<<<<<< + * result = unique_int_1d(np.sort(result)) + * + */ + __pyx_t_7 = ((!(__pyx_v_is_monotonic != 0)) != 0); + if (__pyx_t_7) { + + /* "MDAnalysis/lib/_cutil.pyx":86 + * result = result[:j + 1] + * if not is_monotonic: + * result = unique_int_1d(np.sort(result)) # <<<<<<<<<<<<<< + * + * return np.array(result) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_unique_int_1d); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_sort); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_result, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_int64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_int64_t, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_19 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_19 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_19)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_19); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + if (!__pyx_t_19) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_19, __pyx_t_2}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_19, __pyx_t_2}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + { + __pyx_t_20 = PyTuple_New(1+1); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_20); + __Pyx_GIVEREF(__pyx_t_19); PyTuple_SET_ITEM(__pyx_t_20, 0, __pyx_t_19); __pyx_t_19 = NULL; + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_20, 0+1, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0; + } + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_4) { + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_5); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_20 = PyTuple_New(1+1); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_20); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_20, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_20, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_20, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0; + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_XDEC_MEMVIEW(&__pyx_v_result, 1); + __pyx_v_result = __pyx_t_6; + __pyx_t_6.memview = NULL; + __pyx_t_6.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":85 + * is_monotonic = False + * result = result[:j + 1] + * if not is_monotonic: # <<<<<<<<<<<<<< + * result = unique_int_1d(np.sort(result)) + * + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":88 + * result = unique_int_1d(np.sort(result)) + * + * return np.array(result) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_array); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_20); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_result, 1, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_int64_t, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_5numpy_int64_t, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_20))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_20); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_20); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_20, function); + } + } + if (!__pyx_t_3) { + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_20, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_GOTREF(__pyx_t_5); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_20)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_t_1}; + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_20, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_20)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_t_1}; + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_20, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_20, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/_cutil.pyx":50 + * @cython.boundscheck(False) # turn off bounds-checking for entire function + * @cython.wraparound(False) # turn off negative index wrapping for entire function + * def unique_int_1d(np.int64_t[:] values): # <<<<<<<<<<<<<< + * """Find the unique elements of a 1D array of integers. + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); + __Pyx_XDECREF(__pyx_t_19); + __Pyx_XDECREF(__pyx_t_20); + __Pyx_AddTraceback("MDAnalysis.lib._cutil.unique_int_1d", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_values, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_result, 1); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/_cutil.pyx":91 + * + * + * cdef intset difference(intset a, intset b): # <<<<<<<<<<<<<< + * """a.difference(b) + * + */ + +static __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_f_10MDAnalysis_3lib_6_cutil_difference(__pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_a, __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_b) { + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_output; + int __pyx_v_val; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_r; + __Pyx_RefNannyDeclarations + std::set ::iterator __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + __Pyx_RefNannySetupContext("difference", 0); + + /* "MDAnalysis/lib/_cutil.pyx":97 + * """ + * cdef intset output + * for val in a: # <<<<<<<<<<<<<< + * if b.count(val) != 1: + * output.insert(val) + */ + __pyx_t_1 = __pyx_v_a.begin(); + for (;;) { + if (!(__pyx_t_1 != __pyx_v_a.end())) break; + __pyx_t_2 = *__pyx_t_1; + ++__pyx_t_1; + __pyx_v_val = __pyx_t_2; + + /* "MDAnalysis/lib/_cutil.pyx":98 + * cdef intset output + * for val in a: + * if b.count(val) != 1: # <<<<<<<<<<<<<< + * output.insert(val) + * return output + */ + __pyx_t_3 = ((__pyx_v_b.count(__pyx_v_val) != 1) != 0); + if (__pyx_t_3) { + + /* "MDAnalysis/lib/_cutil.pyx":99 + * for val in a: + * if b.count(val) != 1: + * output.insert(val) # <<<<<<<<<<<<<< + * return output + * + */ + try { + __pyx_v_output.insert(__pyx_v_val); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 99, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":98 + * cdef intset output + * for val in a: + * if b.count(val) != 1: # <<<<<<<<<<<<<< + * output.insert(val) + * return output + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":97 + * """ + * cdef intset output + * for val in a: # <<<<<<<<<<<<<< + * if b.count(val) != 1: + * output.insert(val) + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":100 + * if b.count(val) != 1: + * output.insert(val) + * return output # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_output; + goto __pyx_L0; + + /* "MDAnalysis/lib/_cutil.pyx":91 + * + * + * cdef intset difference(intset a, intset b): # <<<<<<<<<<<<<< + * """a.difference(b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_WriteUnraisable("MDAnalysis.lib._cutil.difference", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __Pyx_pretend_to_initialize(&__pyx_r); + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/_cutil.pyx":105 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def make_whole(atomgroup, reference_atom=None): # <<<<<<<<<<<<<< + * """Move all atoms in a single molecule so that bonds don't split over images + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6_cutil_3make_whole(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6_cutil_2make_whole[] = "Move all atoms in a single molecule so that bonds don't split over images\n\n Atom positions are modified in place.\n\n This function is most useful when atoms have been packed into the primary\n unit cell, causing breaks mid molecule, with the molecule then appearing\n on either side of the unit cell. This is problematic for operations\n such as calculating the center of mass of the molecule. ::\n\n +-----------+ +-----------+\n | | | |\n | 6 3 | | 3 | 6\n | ! ! | | ! | !\n |-5-8 1-2-| -> | 1-2-|-5-8\n | ! ! | | ! | !\n | 7 4 | | 4 | 7\n | | | |\n +-----------+ +-----------+\n\n\n Parameters\n ----------\n atomgroup : AtomGroup\n The :class:`MDAnalysis.core.groups.AtomGroup` to work with.\n The positions of this are modified in place. All these atoms\n must belong in the same molecule or fragment.\n reference_atom : :class:`~MDAnalysis.core.groups.Atom`\n The atom around which all other atoms will be moved.\n Defaults to atom 0 in the atomgroup.\n\n Raises\n ------\n NoDataError\n There are no bonds present.\n (See :func:`~MDAnalysis.topology.core.guess_bonds`)\n\n ValueError\n The algorithm fails to work. This is usually\n caused by the atomgroup not being a single fragment.\n (ie the molecule can't be traversed by following bonds)\n\n\n Example\n -------\n Make fragments whole::\n\n from MDAnalysis.lib.mdamath import make_whole\n\n # This algorithm requires bonds, these can be guessed!\n u = mda.Universe(......, guess_bonds=True)\n\n # MDAnalysis can split molecules into their fragments\n # based on bonding information.\n # Note that this function will only handle a single fragment\n # at a time, necessitating"" a loop.\n for frag in u.fragments:\n make_whole(frag)\n\n Alternatively, to keep a single atom in place as the anchor::\n\n # This will mean that atomgroup[10] will NOT get moved,\n # and all other atoms will move (if necessary).\n make_whole(atomgroup, reference_atom=atomgroup[10])\n\n\n .. versionadded:: 0.11.0\n "; +static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_6_cutil_3make_whole = {"make_whole", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6_cutil_3make_whole, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10MDAnalysis_3lib_6_cutil_2make_whole}; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6_cutil_3make_whole(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_atomgroup = 0; + PyObject *__pyx_v_reference_atom = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("make_whole (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_atomgroup,&__pyx_n_s_reference_atom,0}; + PyObject* values[2] = {0,0}; + values[1] = ((PyObject *)Py_None); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_atomgroup)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_reference_atom); + if (value) { values[1] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "make_whole") < 0)) __PYX_ERR(0, 105, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_atomgroup = values[0]; + __pyx_v_reference_atom = values[1]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("make_whole", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 105, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib._cutil.make_whole", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6_cutil_2make_whole(__pyx_self, __pyx_v_atomgroup, __pyx_v_reference_atom); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6_cutil_2make_whole(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_atomgroup, PyObject *__pyx_v_reference_atom) { + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_refpoints; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_todo; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_done; + int __pyx_v_i; + int __pyx_v_nloops; + int __pyx_v_ref; + int __pyx_v_atom; + int __pyx_v_other; + int __pyx_v_natoms; + std::map __pyx_v_ix_to_rel; + __pyx_t_10MDAnalysis_3lib_6_cutil_intmap __pyx_v_bonding; + __Pyx_memviewslice __pyx_v_bonds = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_oldpos = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_newpos = { 0, 0, { 0 }, { 0 }, { 0 } }; + int __pyx_v_ortho; + __Pyx_memviewslice __pyx_v_box = { 0, 0, { 0 }, { 0 }, { 0 } }; + float __pyx_v_tri_box[3][3]; + float __pyx_v_inverse_box[3]; + double __pyx_v_vec[3]; + __Pyx_memviewslice __pyx_v_ix_view = { 0, 0, { 0 }, { 0 }, { 0 } }; + PyObject *__pyx_v_triclinic_vectors = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_memviewslice __pyx_t_3 = { 0, 0, { 0 }, { 0 }, { 0 } }; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + __Pyx_memviewslice __pyx_t_10 = { 0, 0, { 0 }, { 0 }, { 0 } }; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + float __pyx_t_14; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + float __pyx_t_18[3][3]; + PyObject *__pyx_t_19 = NULL; + PyObject *__pyx_t_20 = NULL; + PyObject *__pyx_t_21 = NULL; + __Pyx_memviewslice __pyx_t_22 = { 0, 0, { 0 }, { 0 }, { 0 } }; + Py_ssize_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + Py_ssize_t __pyx_t_27; + Py_ssize_t __pyx_t_28; + __Pyx_memviewslice __pyx_t_29 = { 0, 0, { 0 }, { 0 }, { 0 } }; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_t_30; + Py_ssize_t __pyx_t_31; + Py_ssize_t __pyx_t_32; + Py_ssize_t __pyx_t_33; + Py_ssize_t __pyx_t_34; + std::set ::iterator __pyx_t_35; + std::set ::iterator __pyx_t_36; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset *__pyx_t_37; + Py_ssize_t __pyx_t_38; + Py_ssize_t __pyx_t_39; + Py_ssize_t __pyx_t_40; + Py_ssize_t __pyx_t_41; + Py_ssize_t __pyx_t_42; + Py_ssize_t __pyx_t_43; + Py_ssize_t __pyx_t_44; + Py_ssize_t __pyx_t_45; + Py_ssize_t __pyx_t_46; + __Pyx_RefNannySetupContext("make_whole", 0); + + /* "MDAnalysis/lib/_cutil.pyx":187 + * + * # map of global indices to local indices + * ix_view = atomgroup.ix[:] # <<<<<<<<<<<<<< + * natoms = atomgroup.ix.shape[0] + * for i in range(natoms): + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_atomgroup, __pyx_n_s_ix); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetSlice(__pyx_t_1, 0, 0, NULL, NULL, &__pyx_slice_, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyObject_to_MemoryviewSlice_ds_Py_ssize_t(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_3.memview)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_ix_view = __pyx_t_3; + __pyx_t_3.memview = NULL; + __pyx_t_3.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":188 + * # map of global indices to local indices + * ix_view = atomgroup.ix[:] + * natoms = atomgroup.ix.shape[0] # <<<<<<<<<<<<<< + * for i in range(natoms): + * ix_to_rel[ix_view[i]] = i + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_atomgroup, __pyx_n_s_ix); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 188, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_natoms = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":189 + * ix_view = atomgroup.ix[:] + * natoms = atomgroup.ix.shape[0] + * for i in range(natoms): # <<<<<<<<<<<<<< + * ix_to_rel[ix_view[i]] = i + * + */ + __pyx_t_4 = __pyx_v_natoms; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "MDAnalysis/lib/_cutil.pyx":190 + * natoms = atomgroup.ix.shape[0] + * for i in range(natoms): + * ix_to_rel[ix_view[i]] = i # <<<<<<<<<<<<<< + * + * if reference_atom is None: + */ + __pyx_t_7 = __pyx_v_i; + (__pyx_v_ix_to_rel[(*((Py_ssize_t *) ( /* dim=0 */ (__pyx_v_ix_view.data + __pyx_t_7 * __pyx_v_ix_view.strides[0]) )))]) = __pyx_v_i; + } + + /* "MDAnalysis/lib/_cutil.pyx":192 + * ix_to_rel[ix_view[i]] = i + * + * if reference_atom is None: # <<<<<<<<<<<<<< + * ref = 0 + * else: + */ + __pyx_t_8 = (__pyx_v_reference_atom == Py_None); + __pyx_t_9 = (__pyx_t_8 != 0); + if (__pyx_t_9) { + + /* "MDAnalysis/lib/_cutil.pyx":193 + * + * if reference_atom is None: + * ref = 0 # <<<<<<<<<<<<<< + * else: + * # Sanity check + */ + __pyx_v_ref = 0; + + /* "MDAnalysis/lib/_cutil.pyx":192 + * ix_to_rel[ix_view[i]] = i + * + * if reference_atom is None: # <<<<<<<<<<<<<< + * ref = 0 + * else: + */ + goto __pyx_L5; + } + + /* "MDAnalysis/lib/_cutil.pyx":196 + * else: + * # Sanity check + * if not reference_atom in atomgroup: # <<<<<<<<<<<<<< + * raise ValueError("Reference atom not in atomgroup") + * ref = ix_to_rel[reference_atom.ix] + */ + /*else*/ { + __pyx_t_9 = (__Pyx_PySequence_ContainsTF(__pyx_v_reference_atom, __pyx_v_atomgroup, Py_NE)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 196, __pyx_L1_error) + __pyx_t_8 = (__pyx_t_9 != 0); + if (unlikely(__pyx_t_8)) { + + /* "MDAnalysis/lib/_cutil.pyx":197 + * # Sanity check + * if not reference_atom in atomgroup: + * raise ValueError("Reference atom not in atomgroup") # <<<<<<<<<<<<<< + * ref = ix_to_rel[reference_atom.ix] + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 197, __pyx_L1_error) + + /* "MDAnalysis/lib/_cutil.pyx":196 + * else: + * # Sanity check + * if not reference_atom in atomgroup: # <<<<<<<<<<<<<< + * raise ValueError("Reference atom not in atomgroup") + * ref = ix_to_rel[reference_atom.ix] + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":198 + * if not reference_atom in atomgroup: + * raise ValueError("Reference atom not in atomgroup") + * ref = ix_to_rel[reference_atom.ix] # <<<<<<<<<<<<<< + * + * box = atomgroup.dimensions + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_reference_atom, __pyx_n_s_ix); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 198, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 198, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_ref = (__pyx_v_ix_to_rel[__pyx_t_4]); + } + __pyx_L5:; + + /* "MDAnalysis/lib/_cutil.pyx":200 + * ref = ix_to_rel[reference_atom.ix] + * + * box = atomgroup.dimensions # <<<<<<<<<<<<<< + * + * for i in range(3): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_atomgroup, __pyx_n_s_dimensions); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 200, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_ds_float(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 200, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_box = __pyx_t_10; + __pyx_t_10.memview = NULL; + __pyx_t_10.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":202 + * box = atomgroup.dimensions + * + * for i in range(3): # <<<<<<<<<<<<<< + * if box[i] == 0.0: + * raise ValueError("One or more dimensions was zero. " + */ + for (__pyx_t_4 = 0; __pyx_t_4 < 3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":203 + * + * for i in range(3): + * if box[i] == 0.0: # <<<<<<<<<<<<<< + * raise ValueError("One or more dimensions was zero. " + * "You can set dimensions using 'atomgroup.dimensions='") + */ + __pyx_t_11 = __pyx_v_i; + __pyx_t_8 = (((*((float *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_11 * __pyx_v_box.strides[0]) ))) == 0.0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "MDAnalysis/lib/_cutil.pyx":204 + * for i in range(3): + * if box[i] == 0.0: + * raise ValueError("One or more dimensions was zero. " # <<<<<<<<<<<<<< + * "You can set dimensions using 'atomgroup.dimensions='") + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 204, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 204, __pyx_L1_error) + + /* "MDAnalysis/lib/_cutil.pyx":203 + * + * for i in range(3): + * if box[i] == 0.0: # <<<<<<<<<<<<<< + * raise ValueError("One or more dimensions was zero. " + * "You can set dimensions using 'atomgroup.dimensions='") + */ + } + } + + /* "MDAnalysis/lib/_cutil.pyx":207 + * "You can set dimensions using 'atomgroup.dimensions='") + * + * ortho = True # <<<<<<<<<<<<<< + * for i in range(3, 6): + * if box[i] != 90.0: + */ + __pyx_v_ortho = 1; + + /* "MDAnalysis/lib/_cutil.pyx":208 + * + * ortho = True + * for i in range(3, 6): # <<<<<<<<<<<<<< + * if box[i] != 90.0: + * ortho = False + */ + for (__pyx_t_4 = 3; __pyx_t_4 < 6; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":209 + * ortho = True + * for i in range(3, 6): + * if box[i] != 90.0: # <<<<<<<<<<<<<< + * ortho = False + * + */ + __pyx_t_12 = __pyx_v_i; + __pyx_t_8 = (((*((float *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_12 * __pyx_v_box.strides[0]) ))) != 90.0) != 0); + if (__pyx_t_8) { + + /* "MDAnalysis/lib/_cutil.pyx":210 + * for i in range(3, 6): + * if box[i] != 90.0: + * ortho = False # <<<<<<<<<<<<<< + * + * if ortho: + */ + __pyx_v_ortho = 0; + + /* "MDAnalysis/lib/_cutil.pyx":209 + * ortho = True + * for i in range(3, 6): + * if box[i] != 90.0: # <<<<<<<<<<<<<< + * ortho = False + * + */ + } + } + + /* "MDAnalysis/lib/_cutil.pyx":212 + * ortho = False + * + * if ortho: # <<<<<<<<<<<<<< + * for i in range(3): + * inverse_box[i] = 1.0 / box[i] + */ + __pyx_t_8 = (__pyx_v_ortho != 0); + if (__pyx_t_8) { + + /* "MDAnalysis/lib/_cutil.pyx":213 + * + * if ortho: + * for i in range(3): # <<<<<<<<<<<<<< + * inverse_box[i] = 1.0 / box[i] + * else: + */ + for (__pyx_t_4 = 0; __pyx_t_4 < 3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":214 + * if ortho: + * for i in range(3): + * inverse_box[i] = 1.0 / box[i] # <<<<<<<<<<<<<< + * else: + * from .mdamath import triclinic_vectors + */ + __pyx_t_13 = __pyx_v_i; + __pyx_t_14 = (*((float *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_13 * __pyx_v_box.strides[0]) ))); + if (unlikely(__pyx_t_14 == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + __PYX_ERR(0, 214, __pyx_L1_error) + } + (__pyx_v_inverse_box[__pyx_v_i]) = (1.0 / __pyx_t_14); + } + + /* "MDAnalysis/lib/_cutil.pyx":212 + * ortho = False + * + * if ortho: # <<<<<<<<<<<<<< + * for i in range(3): + * inverse_box[i] = 1.0 / box[i] + */ + goto __pyx_L13; + } + + /* "MDAnalysis/lib/_cutil.pyx":216 + * inverse_box[i] = 1.0 / box[i] + * else: + * from .mdamath import triclinic_vectors # <<<<<<<<<<<<<< + * tri_box = triclinic_vectors(box) + * + */ + /*else*/ { + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 216, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_triclinic_vectors); + __Pyx_GIVEREF(__pyx_n_s_triclinic_vectors); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_triclinic_vectors); + __pyx_t_1 = __Pyx_Import(__pyx_n_s_mdamath, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 216, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_triclinic_vectors); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 216, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v_triclinic_vectors = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":217 + * else: + * from .mdamath import triclinic_vectors + * tri_box = triclinic_vectors(box) # <<<<<<<<<<<<<< + * + * # C++ dict of bonds + */ + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_box, 1, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_triclinic_vectors); + __pyx_t_15 = __pyx_v_triclinic_vectors; __pyx_t_16 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_15))) { + __pyx_t_16 = PyMethod_GET_SELF(__pyx_t_15); + if (likely(__pyx_t_16)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_15); + __Pyx_INCREF(__pyx_t_16); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_15, function); + } + } + if (!__pyx_t_16) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_15, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_15)) { + PyObject *__pyx_temp[2] = {__pyx_t_16, __pyx_t_2}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_15, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_15)) { + PyObject *__pyx_temp[2] = {__pyx_t_16, __pyx_t_2}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_15, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + { + __pyx_t_17 = PyTuple_New(1+1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_GIVEREF(__pyx_t_16); PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_16); __pyx_t_16 = NULL; + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_17, 0+1, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_15, __pyx_t_17, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + } + } + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + if (unlikely(__Pyx_carray_from_py_float___5b_3_5d_(__pyx_t_1, __pyx_t_18, 3) < 0)) __PYX_ERR(0, 217, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + memcpy(&(__pyx_v_tri_box[0]), __pyx_t_18, sizeof(__pyx_v_tri_box[0]) * (3)); + } + __pyx_L13:; + + /* "MDAnalysis/lib/_cutil.pyx":220 + * + * # C++ dict of bonds + * try: # <<<<<<<<<<<<<< + * bonds = atomgroup.bonds.to_indices() + * except (AttributeError, NoDataError): + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_19, &__pyx_t_20, &__pyx_t_21); + __Pyx_XGOTREF(__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_20); + __Pyx_XGOTREF(__pyx_t_21); + /*try:*/ { + + /* "MDAnalysis/lib/_cutil.pyx":221 + * # C++ dict of bonds + * try: + * bonds = atomgroup.bonds.to_indices() # <<<<<<<<<<<<<< + * except (AttributeError, NoDataError): + * raise NoDataError("The atomgroup is required to have bonds") + */ + __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_v_atomgroup, __pyx_n_s_bonds); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 221, __pyx_L16_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_15, __pyx_n_s_to_indices); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 221, __pyx_L16_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_15 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_17))) { + __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_17); + if (likely(__pyx_t_15)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_17); + __Pyx_INCREF(__pyx_t_15); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_17, function); + } + } + if (__pyx_t_15) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_17, __pyx_t_15); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 221, __pyx_L16_error) + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + } else { + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_17); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 221, __pyx_L16_error) + } + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + __pyx_t_22 = __Pyx_PyObject_to_MemoryviewSlice_dsds_int(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_22.memview)) __PYX_ERR(0, 221, __pyx_L16_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_bonds = __pyx_t_22; + __pyx_t_22.memview = NULL; + __pyx_t_22.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":220 + * + * # C++ dict of bonds + * try: # <<<<<<<<<<<<<< + * bonds = atomgroup.bonds.to_indices() + * except (AttributeError, NoDataError): + */ + } + __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0; + __Pyx_XDECREF(__pyx_t_21); __pyx_t_21 = 0; + goto __pyx_L21_try_end; + __pyx_L16_error:; + __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_XDEC_MEMVIEW(&__pyx_t_3, 1); + __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1); + __PYX_XDEC_MEMVIEW(&__pyx_t_22, 1); + + /* "MDAnalysis/lib/_cutil.pyx":222 + * try: + * bonds = atomgroup.bonds.to_indices() + * except (AttributeError, NoDataError): # <<<<<<<<<<<<<< + * raise NoDataError("The atomgroup is required to have bonds") + * for i in range(bonds.shape[0]): + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_17, &__pyx_t_15); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_NoDataError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 222, __pyx_L18_except_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_builtin_AttributeError) || __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_17, __pyx_t_15); + __pyx_t_1 = 0; __pyx_t_17 = 0; __pyx_t_15 = 0; + if (__pyx_t_4) { + __Pyx_AddTraceback("MDAnalysis.lib._cutil.make_whole", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_15, &__pyx_t_17, &__pyx_t_1) < 0) __PYX_ERR(0, 222, __pyx_L18_except_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_GOTREF(__pyx_t_17); + __Pyx_GOTREF(__pyx_t_1); + + /* "MDAnalysis/lib/_cutil.pyx":223 + * bonds = atomgroup.bonds.to_indices() + * except (AttributeError, NoDataError): + * raise NoDataError("The atomgroup is required to have bonds") # <<<<<<<<<<<<<< + * for i in range(bonds.shape[0]): + * atom = bonds[i, 0] + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_NoDataError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L18_except_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 223, __pyx_L18_except_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_16, 0, 0, 0); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __PYX_ERR(0, 223, __pyx_L18_except_error) + } + goto __pyx_L18_except_error; + __pyx_L18_except_error:; + + /* "MDAnalysis/lib/_cutil.pyx":220 + * + * # C++ dict of bonds + * try: # <<<<<<<<<<<<<< + * bonds = atomgroup.bonds.to_indices() + * except (AttributeError, NoDataError): + */ + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_XGIVEREF(__pyx_t_20); + __Pyx_XGIVEREF(__pyx_t_21); + __Pyx_ExceptionReset(__pyx_t_19, __pyx_t_20, __pyx_t_21); + goto __pyx_L1_error; + __pyx_L21_try_end:; + } + + /* "MDAnalysis/lib/_cutil.pyx":224 + * except (AttributeError, NoDataError): + * raise NoDataError("The atomgroup is required to have bonds") + * for i in range(bonds.shape[0]): # <<<<<<<<<<<<<< + * atom = bonds[i, 0] + * other = bonds[i, 1] + */ + __pyx_t_23 = (__pyx_v_bonds.shape[0]); + __pyx_t_24 = __pyx_t_23; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_24; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":225 + * raise NoDataError("The atomgroup is required to have bonds") + * for i in range(bonds.shape[0]): + * atom = bonds[i, 0] # <<<<<<<<<<<<<< + * other = bonds[i, 1] + * # only add bonds if both atoms are in atoms set + */ + __pyx_t_25 = __pyx_v_i; + __pyx_t_26 = 0; + __pyx_v_atom = (*((int *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bonds.data + __pyx_t_25 * __pyx_v_bonds.strides[0]) ) + __pyx_t_26 * __pyx_v_bonds.strides[1]) ))); + + /* "MDAnalysis/lib/_cutil.pyx":226 + * for i in range(bonds.shape[0]): + * atom = bonds[i, 0] + * other = bonds[i, 1] # <<<<<<<<<<<<<< + * # only add bonds if both atoms are in atoms set + * if ix_to_rel.count(atom) and ix_to_rel.count(other): + */ + __pyx_t_27 = __pyx_v_i; + __pyx_t_28 = 1; + __pyx_v_other = (*((int *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bonds.data + __pyx_t_27 * __pyx_v_bonds.strides[0]) ) + __pyx_t_28 * __pyx_v_bonds.strides[1]) ))); + + /* "MDAnalysis/lib/_cutil.pyx":228 + * other = bonds[i, 1] + * # only add bonds if both atoms are in atoms set + * if ix_to_rel.count(atom) and ix_to_rel.count(other): # <<<<<<<<<<<<<< + * atom = ix_to_rel[atom] + * other = ix_to_rel[other] + */ + __pyx_t_9 = (__pyx_v_ix_to_rel.count(__pyx_v_atom) != 0); + if (__pyx_t_9) { + } else { + __pyx_t_8 = __pyx_t_9; + goto __pyx_L27_bool_binop_done; + } + __pyx_t_9 = (__pyx_v_ix_to_rel.count(__pyx_v_other) != 0); + __pyx_t_8 = __pyx_t_9; + __pyx_L27_bool_binop_done:; + if (__pyx_t_8) { + + /* "MDAnalysis/lib/_cutil.pyx":229 + * # only add bonds if both atoms are in atoms set + * if ix_to_rel.count(atom) and ix_to_rel.count(other): + * atom = ix_to_rel[atom] # <<<<<<<<<<<<<< + * other = ix_to_rel[other] + * + */ + __pyx_v_atom = (__pyx_v_ix_to_rel[__pyx_v_atom]); + + /* "MDAnalysis/lib/_cutil.pyx":230 + * if ix_to_rel.count(atom) and ix_to_rel.count(other): + * atom = ix_to_rel[atom] + * other = ix_to_rel[other] # <<<<<<<<<<<<<< + * + * bonding[atom].insert(other) + */ + __pyx_v_other = (__pyx_v_ix_to_rel[__pyx_v_other]); + + /* "MDAnalysis/lib/_cutil.pyx":232 + * other = ix_to_rel[other] + * + * bonding[atom].insert(other) # <<<<<<<<<<<<<< + * bonding[other].insert(atom) + * + */ + try { + (__pyx_v_bonding[__pyx_v_atom]).insert(__pyx_v_other); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 232, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":233 + * + * bonding[atom].insert(other) + * bonding[other].insert(atom) # <<<<<<<<<<<<<< + * + * oldpos = atomgroup.positions + */ + try { + (__pyx_v_bonding[__pyx_v_other]).insert(__pyx_v_atom); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 233, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":228 + * other = bonds[i, 1] + * # only add bonds if both atoms are in atoms set + * if ix_to_rel.count(atom) and ix_to_rel.count(other): # <<<<<<<<<<<<<< + * atom = ix_to_rel[atom] + * other = ix_to_rel[other] + */ + } + } + + /* "MDAnalysis/lib/_cutil.pyx":235 + * bonding[other].insert(atom) + * + * oldpos = atomgroup.positions # <<<<<<<<<<<<<< + * newpos = np.zeros((oldpos.shape[0], 3), dtype=np.float32) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_atomgroup, __pyx_n_s_positions); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_29 = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_29.memview)) __PYX_ERR(0, 235, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_oldpos = __pyx_t_29; + __pyx_t_29.memview = NULL; + __pyx_t_29.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":236 + * + * oldpos = atomgroup.positions + * newpos = np.zeros((oldpos.shape[0], 3), dtype=np.float32) # <<<<<<<<<<<<<< + * + * refpoints = intset() # Who is safe to use as reference point? + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyInt_FromSsize_t((__pyx_v_oldpos.shape[0])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_1); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_int_3); + __pyx_t_1 = 0; + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_15); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_15); + __pyx_t_15 = 0; + __pyx_t_15 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __pyx_t_16 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_16, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + if (PyDict_SetItem(__pyx_t_15, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_17, __pyx_t_1, __pyx_t_15); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + __pyx_t_29 = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_29.memview)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_newpos = __pyx_t_29; + __pyx_t_29.memview = NULL; + __pyx_t_29.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":238 + * newpos = np.zeros((oldpos.shape[0], 3), dtype=np.float32) + * + * refpoints = intset() # Who is safe to use as reference point? # <<<<<<<<<<<<<< + * done = intset() # Who have I already searched around? + * # initially we have one starting atom whose position is in correct image + */ + try { + __pyx_t_30 = __pyx_t_10MDAnalysis_3lib_6_cutil_intset(); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 238, __pyx_L1_error) + } + __pyx_v_refpoints = __pyx_t_30; + + /* "MDAnalysis/lib/_cutil.pyx":239 + * + * refpoints = intset() # Who is safe to use as reference point? + * done = intset() # Who have I already searched around? # <<<<<<<<<<<<<< + * # initially we have one starting atom whose position is in correct image + * refpoints.insert(ref) + */ + try { + __pyx_t_30 = __pyx_t_10MDAnalysis_3lib_6_cutil_intset(); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 239, __pyx_L1_error) + } + __pyx_v_done = __pyx_t_30; + + /* "MDAnalysis/lib/_cutil.pyx":241 + * done = intset() # Who have I already searched around? + * # initially we have one starting atom whose position is in correct image + * refpoints.insert(ref) # <<<<<<<<<<<<<< + * for i in range(3): + * newpos[ref, i] = oldpos[ref, i] + */ + try { + __pyx_v_refpoints.insert(__pyx_v_ref); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 241, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":242 + * # initially we have one starting atom whose position is in correct image + * refpoints.insert(ref) + * for i in range(3): # <<<<<<<<<<<<<< + * newpos[ref, i] = oldpos[ref, i] + * + */ + for (__pyx_t_4 = 0; __pyx_t_4 < 3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":243 + * refpoints.insert(ref) + * for i in range(3): + * newpos[ref, i] = oldpos[ref, i] # <<<<<<<<<<<<<< + * + * nloops = 0 + */ + __pyx_t_31 = __pyx_v_ref; + __pyx_t_32 = __pyx_v_i; + __pyx_t_33 = __pyx_v_ref; + __pyx_t_34 = __pyx_v_i; + *((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_newpos.data + __pyx_t_33 * __pyx_v_newpos.strides[0]) ) + __pyx_t_34 * __pyx_v_newpos.strides[1]) )) = (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_oldpos.data + __pyx_t_31 * __pyx_v_oldpos.strides[0]) ) + __pyx_t_32 * __pyx_v_oldpos.strides[1]) ))); + } + + /* "MDAnalysis/lib/_cutil.pyx":245 + * newpos[ref, i] = oldpos[ref, i] + * + * nloops = 0 # <<<<<<<<<<<<<< + * while refpoints.size() < natoms and nloops < natoms: + * # count iterations to prevent infinite loop here + */ + __pyx_v_nloops = 0; + + /* "MDAnalysis/lib/_cutil.pyx":246 + * + * nloops = 0 + * while refpoints.size() < natoms and nloops < natoms: # <<<<<<<<<<<<<< + * # count iterations to prevent infinite loop here + * nloops += 1 + */ + while (1) { + __pyx_t_9 = ((__pyx_v_refpoints.size() < __pyx_v_natoms) != 0); + if (__pyx_t_9) { + } else { + __pyx_t_8 = __pyx_t_9; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_9 = ((__pyx_v_nloops < __pyx_v_natoms) != 0); + __pyx_t_8 = __pyx_t_9; + __pyx_L33_bool_binop_done:; + if (!__pyx_t_8) break; + + /* "MDAnalysis/lib/_cutil.pyx":248 + * while refpoints.size() < natoms and nloops < natoms: + * # count iterations to prevent infinite loop here + * nloops += 1 # <<<<<<<<<<<<<< + * + * # We want to iterate over atoms that are good to use as reference + */ + __pyx_v_nloops = (__pyx_v_nloops + 1); + + /* "MDAnalysis/lib/_cutil.pyx":252 + * # We want to iterate over atoms that are good to use as reference + * # points, but haven't been searched yet. + * todo = difference(refpoints, done) # <<<<<<<<<<<<<< + * for atom in todo: + * for other in bonding[atom]: + */ + __pyx_v_todo = __pyx_f_10MDAnalysis_3lib_6_cutil_difference(__pyx_v_refpoints, __pyx_v_done); + + /* "MDAnalysis/lib/_cutil.pyx":253 + * # points, but haven't been searched yet. + * todo = difference(refpoints, done) + * for atom in todo: # <<<<<<<<<<<<<< + * for other in bonding[atom]: + * # If other is already a refpoint, leave alone + */ + __pyx_t_35 = __pyx_v_todo.begin(); + for (;;) { + if (!(__pyx_t_35 != __pyx_v_todo.end())) break; + __pyx_t_4 = *__pyx_t_35; + ++__pyx_t_35; + __pyx_v_atom = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":254 + * todo = difference(refpoints, done) + * for atom in todo: + * for other in bonding[atom]: # <<<<<<<<<<<<<< + * # If other is already a refpoint, leave alone + * if refpoints.count(other): + */ + __pyx_t_37 = &(__pyx_v_bonding[__pyx_v_atom]); + __pyx_t_36 = __pyx_t_37->begin(); + for (;;) { + if (!(__pyx_t_36 != __pyx_t_37->end())) break; + __pyx_t_4 = *__pyx_t_36; + ++__pyx_t_36; + __pyx_v_other = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":256 + * for other in bonding[atom]: + * # If other is already a refpoint, leave alone + * if refpoints.count(other): # <<<<<<<<<<<<<< + * continue + * # Draw vector from atom to other + */ + __pyx_t_8 = (__pyx_v_refpoints.count(__pyx_v_other) != 0); + if (__pyx_t_8) { + + /* "MDAnalysis/lib/_cutil.pyx":257 + * # If other is already a refpoint, leave alone + * if refpoints.count(other): + * continue # <<<<<<<<<<<<<< + * # Draw vector from atom to other + * for i in range(3): + */ + goto __pyx_L37_continue; + + /* "MDAnalysis/lib/_cutil.pyx":256 + * for other in bonding[atom]: + * # If other is already a refpoint, leave alone + * if refpoints.count(other): # <<<<<<<<<<<<<< + * continue + * # Draw vector from atom to other + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":259 + * continue + * # Draw vector from atom to other + * for i in range(3): # <<<<<<<<<<<<<< + * vec[i] = oldpos[other, i] - newpos[atom, i] + * # Apply periodic boundary conditions to this vector + */ + for (__pyx_t_4 = 0; __pyx_t_4 < 3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":260 + * # Draw vector from atom to other + * for i in range(3): + * vec[i] = oldpos[other, i] - newpos[atom, i] # <<<<<<<<<<<<<< + * # Apply periodic boundary conditions to this vector + * if ortho: + */ + __pyx_t_38 = __pyx_v_other; + __pyx_t_39 = __pyx_v_i; + __pyx_t_40 = __pyx_v_atom; + __pyx_t_41 = __pyx_v_i; + (__pyx_v_vec[__pyx_v_i]) = ((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_oldpos.data + __pyx_t_38 * __pyx_v_oldpos.strides[0]) ) + __pyx_t_39 * __pyx_v_oldpos.strides[1]) ))) - (*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_newpos.data + __pyx_t_40 * __pyx_v_newpos.strides[0]) ) + __pyx_t_41 * __pyx_v_newpos.strides[1]) )))); + } + + /* "MDAnalysis/lib/_cutil.pyx":262 + * vec[i] = oldpos[other, i] - newpos[atom, i] + * # Apply periodic boundary conditions to this vector + * if ortho: # <<<<<<<<<<<<<< + * minimum_image(&vec[0], &box[0], &inverse_box[0]) + * else: + */ + __pyx_t_8 = (__pyx_v_ortho != 0); + if (__pyx_t_8) { + + /* "MDAnalysis/lib/_cutil.pyx":263 + * # Apply periodic boundary conditions to this vector + * if ortho: + * minimum_image(&vec[0], &box[0], &inverse_box[0]) # <<<<<<<<<<<<<< + * else: + * minimum_image_triclinic(&vec[0], &tri_box[0]) + */ + __pyx_t_42 = 0; + minimum_image((&(__pyx_v_vec[0])), (&(*((float *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_42 * __pyx_v_box.strides[0]) )))), (&(__pyx_v_inverse_box[0]))); + + /* "MDAnalysis/lib/_cutil.pyx":262 + * vec[i] = oldpos[other, i] - newpos[atom, i] + * # Apply periodic boundary conditions to this vector + * if ortho: # <<<<<<<<<<<<<< + * minimum_image(&vec[0], &box[0], &inverse_box[0]) + * else: + */ + goto __pyx_L42; + } + + /* "MDAnalysis/lib/_cutil.pyx":265 + * minimum_image(&vec[0], &box[0], &inverse_box[0]) + * else: + * minimum_image_triclinic(&vec[0], &tri_box[0]) # <<<<<<<<<<<<<< + * # Then define position of other based on this vector + * for i in range(3): + */ + /*else*/ { + minimum_image_triclinic((&(__pyx_v_vec[0])), ((coordinate *)(&(__pyx_v_tri_box[0])))); + } + __pyx_L42:; + + /* "MDAnalysis/lib/_cutil.pyx":267 + * minimum_image_triclinic(&vec[0], &tri_box[0]) + * # Then define position of other based on this vector + * for i in range(3): # <<<<<<<<<<<<<< + * newpos[other, i] = newpos[atom, i] + vec[i] + * + */ + for (__pyx_t_4 = 0; __pyx_t_4 < 3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "MDAnalysis/lib/_cutil.pyx":268 + * # Then define position of other based on this vector + * for i in range(3): + * newpos[other, i] = newpos[atom, i] + vec[i] # <<<<<<<<<<<<<< + * + * # This other atom can now be used as a reference point + */ + __pyx_t_43 = __pyx_v_atom; + __pyx_t_44 = __pyx_v_i; + __pyx_t_45 = __pyx_v_other; + __pyx_t_46 = __pyx_v_i; + *((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_newpos.data + __pyx_t_45 * __pyx_v_newpos.strides[0]) ) + __pyx_t_46 * __pyx_v_newpos.strides[1]) )) = ((*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_newpos.data + __pyx_t_43 * __pyx_v_newpos.strides[0]) ) + __pyx_t_44 * __pyx_v_newpos.strides[1]) ))) + (__pyx_v_vec[__pyx_v_i])); + } + + /* "MDAnalysis/lib/_cutil.pyx":271 + * + * # This other atom can now be used as a reference point + * refpoints.insert(other) # <<<<<<<<<<<<<< + * done.insert(atom) + * + */ + try { + __pyx_v_refpoints.insert(__pyx_v_other); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 271, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":254 + * todo = difference(refpoints, done) + * for atom in todo: + * for other in bonding[atom]: # <<<<<<<<<<<<<< + * # If other is already a refpoint, leave alone + * if refpoints.count(other): + */ + __pyx_L37_continue:; + } + + /* "MDAnalysis/lib/_cutil.pyx":272 + * # This other atom can now be used as a reference point + * refpoints.insert(other) + * done.insert(atom) # <<<<<<<<<<<<<< + * + * if refpoints.size() < natoms: + */ + try { + __pyx_v_done.insert(__pyx_v_atom); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 272, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":253 + * # points, but haven't been searched yet. + * todo = difference(refpoints, done) + * for atom in todo: # <<<<<<<<<<<<<< + * for other in bonding[atom]: + * # If other is already a refpoint, leave alone + */ + } + } + + /* "MDAnalysis/lib/_cutil.pyx":274 + * done.insert(atom) + * + * if refpoints.size() < natoms: # <<<<<<<<<<<<<< + * raise ValueError("AtomGroup was not contiguous from bonds, process failed") + * else: + */ + __pyx_t_8 = ((__pyx_v_refpoints.size() < __pyx_v_natoms) != 0); + if (unlikely(__pyx_t_8)) { + + /* "MDAnalysis/lib/_cutil.pyx":275 + * + * if refpoints.size() < natoms: + * raise ValueError("AtomGroup was not contiguous from bonds, process failed") # <<<<<<<<<<<<<< + * else: + * atomgroup.positions = newpos + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 275, __pyx_L1_error) + + /* "MDAnalysis/lib/_cutil.pyx":274 + * done.insert(atom) + * + * if refpoints.size() < natoms: # <<<<<<<<<<<<<< + * raise ValueError("AtomGroup was not contiguous from bonds, process failed") + * else: + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":277 + * raise ValueError("AtomGroup was not contiguous from bonds, process failed") + * else: + * atomgroup.positions = newpos # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_newpos, 2, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 277, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (__Pyx_PyObject_SetAttrStr(__pyx_v_atomgroup, __pyx_n_s_positions, __pyx_t_2) < 0) __PYX_ERR(0, 277, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + + /* "MDAnalysis/lib/_cutil.pyx":105 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def make_whole(atomgroup, reference_atom=None): # <<<<<<<<<<<<<< + * """Move all atoms in a single molecule so that bonds don't split over images + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __PYX_XDEC_MEMVIEW(&__pyx_t_3, 1); + __PYX_XDEC_MEMVIEW(&__pyx_t_10, 1); + __Pyx_XDECREF(__pyx_t_15); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __PYX_XDEC_MEMVIEW(&__pyx_t_22, 1); + __PYX_XDEC_MEMVIEW(&__pyx_t_29, 1); + __Pyx_AddTraceback("MDAnalysis.lib._cutil.make_whole", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_bonds, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_oldpos, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_newpos, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_box, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_ix_view, 1); + __Pyx_XDECREF(__pyx_v_triclinic_vectors); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/_cutil.pyx":282 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cdef float _dot(float * a, float * b): # <<<<<<<<<<<<<< + * """Return dot product of two 3d vectors""" + * cdef ssize_t n + */ + +static float __pyx_f_10MDAnalysis_3lib_6_cutil__dot(float *__pyx_v_a, float *__pyx_v_b) { + Py_ssize_t __pyx_v_n; + float __pyx_v_sum1; + float __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + __Pyx_RefNannySetupContext("_dot", 0); + + /* "MDAnalysis/lib/_cutil.pyx":287 + * cdef float sum1 + * + * sum1 = 0.0 # <<<<<<<<<<<<<< + * for n in range(3): + * sum1 += a[n] * b[n] + */ + __pyx_v_sum1 = 0.0; + + /* "MDAnalysis/lib/_cutil.pyx":288 + * + * sum1 = 0.0 + * for n in range(3): # <<<<<<<<<<<<<< + * sum1 += a[n] * b[n] + * return sum1 + */ + for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { + __pyx_v_n = __pyx_t_1; + + /* "MDAnalysis/lib/_cutil.pyx":289 + * sum1 = 0.0 + * for n in range(3): + * sum1 += a[n] * b[n] # <<<<<<<<<<<<<< + * return sum1 + * + */ + __pyx_v_sum1 = (__pyx_v_sum1 + ((__pyx_v_a[__pyx_v_n]) * (__pyx_v_b[__pyx_v_n]))); + } + + /* "MDAnalysis/lib/_cutil.pyx":290 + * for n in range(3): + * sum1 += a[n] * b[n] + * return sum1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_sum1; + goto __pyx_L0; + + /* "MDAnalysis/lib/_cutil.pyx":282 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cdef float _dot(float * a, float * b): # <<<<<<<<<<<<<< + * """Return dot product of two 3d vectors""" + * cdef ssize_t n + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/_cutil.pyx":295 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cdef void _cross(float * a, float * b, float * result): # <<<<<<<<<<<<<< + * """ + * Calculates the cross product between 3d vectors + */ + +static void __pyx_f_10MDAnalysis_3lib_6_cutil__cross(float *__pyx_v_a, float *__pyx_v_b, float *__pyx_v_result) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_cross", 0); + + /* "MDAnalysis/lib/_cutil.pyx":304 + * """ + * + * result[0] = a[1]*b[2] - a[2]*b[1] # <<<<<<<<<<<<<< + * result[1] = - a[0]*b[2] + a[2]*b[0] + * result[2] = a[0]*b[1] - a[1]*b[0] + */ + (__pyx_v_result[0]) = (((__pyx_v_a[1]) * (__pyx_v_b[2])) - ((__pyx_v_a[2]) * (__pyx_v_b[1]))); + + /* "MDAnalysis/lib/_cutil.pyx":305 + * + * result[0] = a[1]*b[2] - a[2]*b[1] + * result[1] = - a[0]*b[2] + a[2]*b[0] # <<<<<<<<<<<<<< + * result[2] = a[0]*b[1] - a[1]*b[0] + * + */ + (__pyx_v_result[1]) = (((-(__pyx_v_a[0])) * (__pyx_v_b[2])) + ((__pyx_v_a[2]) * (__pyx_v_b[0]))); + + /* "MDAnalysis/lib/_cutil.pyx":306 + * result[0] = a[1]*b[2] - a[2]*b[1] + * result[1] = - a[0]*b[2] + a[2]*b[0] + * result[2] = a[0]*b[1] - a[1]*b[0] # <<<<<<<<<<<<<< + * + * cdef float _norm(float * a): + */ + (__pyx_v_result[2]) = (((__pyx_v_a[0]) * (__pyx_v_b[1])) - ((__pyx_v_a[1]) * (__pyx_v_b[0]))); + + /* "MDAnalysis/lib/_cutil.pyx":295 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * cdef void _cross(float * a, float * b, float * result): # <<<<<<<<<<<<<< + * """ + * Calculates the cross product between 3d vectors + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "MDAnalysis/lib/_cutil.pyx":308 + * result[2] = a[0]*b[1] - a[1]*b[0] + * + * cdef float _norm(float * a): # <<<<<<<<<<<<<< + * """ + * Calculates the magnitude of the vector + */ + +static float __pyx_f_10MDAnalysis_3lib_6_cutil__norm(float *__pyx_v_a) { + float __pyx_v_result; + Py_ssize_t __pyx_v_n; + float __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + __Pyx_RefNannySetupContext("_norm", 0); + + /* "MDAnalysis/lib/_cutil.pyx":314 + * cdef float result + * cdef ssize_t n + * result = 0.0 # <<<<<<<<<<<<<< + * for n in range(3): + * result += a[n]*a[n] + */ + __pyx_v_result = 0.0; + + /* "MDAnalysis/lib/_cutil.pyx":315 + * cdef ssize_t n + * result = 0.0 + * for n in range(3): # <<<<<<<<<<<<<< + * result += a[n]*a[n] + * return sqrt(result) + */ + for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { + __pyx_v_n = __pyx_t_1; + + /* "MDAnalysis/lib/_cutil.pyx":316 + * result = 0.0 + * for n in range(3): + * result += a[n]*a[n] # <<<<<<<<<<<<<< + * return sqrt(result) + * + */ + __pyx_v_result = (__pyx_v_result + ((__pyx_v_a[__pyx_v_n]) * (__pyx_v_a[__pyx_v_n]))); + } + + /* "MDAnalysis/lib/_cutil.pyx":317 + * for n in range(3): + * result += a[n]*a[n] + * return sqrt(result) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = sqrt(__pyx_v_result); + goto __pyx_L0; + + /* "MDAnalysis/lib/_cutil.pyx":308 + * result[2] = a[0]*b[1] - a[1]*b[0] + * + * cdef float _norm(float * a): # <<<<<<<<<<<<<< + * """ + * Calculates the magnitude of the vector + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/_cutil.pyx":322 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def find_fragments(atoms, bondlist): # <<<<<<<<<<<<<< + * """Calculate distinct fragments from nodes (atom indices) and edges (pairs + * of atom indices). + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6_cutil_5find_fragments(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6_cutil_4find_fragments[] = "Calculate distinct fragments from nodes (atom indices) and edges (pairs\n of atom indices).\n\n Parameters\n ----------\n atoms : array_like\n 1-D Array of atom indices (dtype will be converted to ``numpy.int64``\n internally)\n bonds : array_like\n 2-D array of bonds (dtype will be converted to ``numpy.int32``\n internally), where ``bonds[i, 0]`` and ``bonds[i, 1]`` are the\n indices of atoms connected by the ``i``-th bond. Any bonds referring to\n atom indices not in `atoms` will be ignored.\n\n Returns\n -------\n fragments : list\n List of arrays, each containing the atom indices of a fragment.\n\n .. versionaddded:: 0.19.0\n "; +static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_6_cutil_5find_fragments = {"find_fragments", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6_cutil_5find_fragments, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10MDAnalysis_3lib_6_cutil_4find_fragments}; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6_cutil_5find_fragments(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_atoms = 0; + PyObject *__pyx_v_bondlist = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("find_fragments (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_atoms,&__pyx_n_s_bondlist,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_atoms)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_bondlist)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("find_fragments", 1, 2, 2, 1); __PYX_ERR(0, 322, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "find_fragments") < 0)) __PYX_ERR(0, 322, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + } + __pyx_v_atoms = values[0]; + __pyx_v_bondlist = values[1]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("find_fragments", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 322, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib._cutil.find_fragments", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6_cutil_4find_fragments(__pyx_self, __pyx_v_atoms, __pyx_v_bondlist); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6_cutil_4find_fragments(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_atoms, PyObject *__pyx_v_bondlist) { + __pyx_t_10MDAnalysis_3lib_6_cutil_intmap __pyx_v_bondmap; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_todo; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_frag_todo; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset __pyx_v_frag_done; + std::vector __pyx_v_this_frag; + int __pyx_v_i; + int __pyx_v_a; + int __pyx_v_b; + __Pyx_memviewslice __pyx_v_atoms_view = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_bonds_view = { 0, 0, { 0 }, { 0 }, { 0 } }; + PyObject *__pyx_v_frags = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_memviewslice __pyx_t_6 = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_t_7 = { 0, 0, { 0 }, { 0 }, { 0 } }; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + std::set ::iterator __pyx_t_18; + __pyx_t_10MDAnalysis_3lib_6_cutil_intset *__pyx_t_19; + int __pyx_t_20; + __Pyx_RefNannySetupContext("find_fragments", 0); + + /* "MDAnalysis/lib/_cutil.pyx":351 + * cdef np.int32_t[:, :] bonds_view + * + * atoms_view = np.asarray(atoms, dtype=np.int64) # <<<<<<<<<<<<<< + * bonds_view = np.asarray(bondlist, dtype=np.int32) + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_atoms); + __Pyx_GIVEREF(__pyx_v_atoms); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_atoms); + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int64); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_atoms_view = __pyx_t_6; + __pyx_t_6.memview = NULL; + __pyx_t_6.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":352 + * + * atoms_view = np.asarray(atoms, dtype=np.int64) + * bonds_view = np.asarray(bondlist, dtype=np.int32) # <<<<<<<<<<<<<< + * + * # grab record of which atoms I have to process + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_bondlist); + __Pyx_GIVEREF(__pyx_v_bondlist); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_bondlist); + __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_bonds_view = __pyx_t_7; + __pyx_t_7.memview = NULL; + __pyx_t_7.data = NULL; + + /* "MDAnalysis/lib/_cutil.pyx":356 + * # grab record of which atoms I have to process + * # ie set of all nodes + * for i in range(atoms_view.shape[0]): # <<<<<<<<<<<<<< + * todo.insert(atoms_view[i]) + * # Process edges into map + */ + __pyx_t_8 = (__pyx_v_atoms_view.shape[0]); + __pyx_t_9 = __pyx_t_8; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "MDAnalysis/lib/_cutil.pyx":357 + * # ie set of all nodes + * for i in range(atoms_view.shape[0]): + * todo.insert(atoms_view[i]) # <<<<<<<<<<<<<< + * # Process edges into map + * for i in range(bonds_view.shape[0]): + */ + __pyx_t_11 = __pyx_v_i; + try { + __pyx_v_todo.insert((*((__pyx_t_5numpy_int64_t *) ( /* dim=0 */ (__pyx_v_atoms_view.data + __pyx_t_11 * __pyx_v_atoms_view.strides[0]) )))); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 357, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/_cutil.pyx":359 + * todo.insert(atoms_view[i]) + * # Process edges into map + * for i in range(bonds_view.shape[0]): # <<<<<<<<<<<<<< + * a = bonds_view[i, 0] + * b = bonds_view[i, 1] + */ + __pyx_t_8 = (__pyx_v_bonds_view.shape[0]); + __pyx_t_9 = __pyx_t_8; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "MDAnalysis/lib/_cutil.pyx":360 + * # Process edges into map + * for i in range(bonds_view.shape[0]): + * a = bonds_view[i, 0] # <<<<<<<<<<<<<< + * b = bonds_view[i, 1] + * # only include edges if both are known nodes + */ + __pyx_t_12 = __pyx_v_i; + __pyx_t_13 = 0; + __pyx_v_a = (*((__pyx_t_5numpy_int32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bonds_view.data + __pyx_t_12 * __pyx_v_bonds_view.strides[0]) ) + __pyx_t_13 * __pyx_v_bonds_view.strides[1]) ))); + + /* "MDAnalysis/lib/_cutil.pyx":361 + * for i in range(bonds_view.shape[0]): + * a = bonds_view[i, 0] + * b = bonds_view[i, 1] # <<<<<<<<<<<<<< + * # only include edges if both are known nodes + * if todo.count(a) and todo.count(b): + */ + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = 1; + __pyx_v_b = (*((__pyx_t_5numpy_int32_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bonds_view.data + __pyx_t_14 * __pyx_v_bonds_view.strides[0]) ) + __pyx_t_15 * __pyx_v_bonds_view.strides[1]) ))); + + /* "MDAnalysis/lib/_cutil.pyx":363 + * b = bonds_view[i, 1] + * # only include edges if both are known nodes + * if todo.count(a) and todo.count(b): # <<<<<<<<<<<<<< + * bondmap[a].insert(b) + * bondmap[b].insert(a) + */ + __pyx_t_17 = (__pyx_v_todo.count(__pyx_v_a) != 0); + if (__pyx_t_17) { + } else { + __pyx_t_16 = __pyx_t_17; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_17 = (__pyx_v_todo.count(__pyx_v_b) != 0); + __pyx_t_16 = __pyx_t_17; + __pyx_L8_bool_binop_done:; + if (__pyx_t_16) { + + /* "MDAnalysis/lib/_cutil.pyx":364 + * # only include edges if both are known nodes + * if todo.count(a) and todo.count(b): + * bondmap[a].insert(b) # <<<<<<<<<<<<<< + * bondmap[b].insert(a) + * + */ + try { + (__pyx_v_bondmap[__pyx_v_a]).insert(__pyx_v_b); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 364, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":365 + * if todo.count(a) and todo.count(b): + * bondmap[a].insert(b) + * bondmap[b].insert(a) # <<<<<<<<<<<<<< + * + * frags = [] + */ + try { + (__pyx_v_bondmap[__pyx_v_b]).insert(__pyx_v_a); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 365, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":363 + * b = bonds_view[i, 1] + * # only include edges if both are known nodes + * if todo.count(a) and todo.count(b): # <<<<<<<<<<<<<< + * bondmap[a].insert(b) + * bondmap[b].insert(a) + */ + } + } + + /* "MDAnalysis/lib/_cutil.pyx":367 + * bondmap[b].insert(a) + * + * frags = [] # <<<<<<<<<<<<<< + * + * while not todo.empty(): # While not all nodes have been done + */ + __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 367, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_frags = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":369 + * frags = [] + * + * while not todo.empty(): # While not all nodes have been done # <<<<<<<<<<<<<< + * # Start a new fragment + * frag_todo.clear() + */ + while (1) { + __pyx_t_16 = ((!(__pyx_v_todo.empty() != 0)) != 0); + if (!__pyx_t_16) break; + + /* "MDAnalysis/lib/_cutil.pyx":371 + * while not todo.empty(): # While not all nodes have been done + * # Start a new fragment + * frag_todo.clear() # <<<<<<<<<<<<<< + * frag_done.clear() + * this_frag.clear() + */ + __pyx_v_frag_todo.clear(); + + /* "MDAnalysis/lib/_cutil.pyx":372 + * # Start a new fragment + * frag_todo.clear() + * frag_done.clear() # <<<<<<<<<<<<<< + * this_frag.clear() + * # Grab a start point for next fragment + */ + __pyx_v_frag_done.clear(); + + /* "MDAnalysis/lib/_cutil.pyx":373 + * frag_todo.clear() + * frag_done.clear() + * this_frag.clear() # <<<<<<<<<<<<<< + * # Grab a start point for next fragment + * frag_todo.insert(deref(todo.begin())) + */ + __pyx_v_this_frag.clear(); + + /* "MDAnalysis/lib/_cutil.pyx":375 + * this_frag.clear() + * # Grab a start point for next fragment + * frag_todo.insert(deref(todo.begin())) # <<<<<<<<<<<<<< + * + * # Loop until fragment fully explored + */ + try { + __pyx_v_frag_todo.insert((*__pyx_v_todo.begin())); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 375, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":378 + * + * # Loop until fragment fully explored + * while not frag_todo.empty(): # <<<<<<<<<<<<<< + * # Pop next in this frag todo + * a = deref(frag_todo.begin()) + */ + while (1) { + __pyx_t_16 = ((!(__pyx_v_frag_todo.empty() != 0)) != 0); + if (!__pyx_t_16) break; + + /* "MDAnalysis/lib/_cutil.pyx":380 + * while not frag_todo.empty(): + * # Pop next in this frag todo + * a = deref(frag_todo.begin()) # <<<<<<<<<<<<<< + * frag_todo.erase(a) + * if not frag_done.count(a): + */ + __pyx_v_a = (*__pyx_v_frag_todo.begin()); + + /* "MDAnalysis/lib/_cutil.pyx":381 + * # Pop next in this frag todo + * a = deref(frag_todo.begin()) + * frag_todo.erase(a) # <<<<<<<<<<<<<< + * if not frag_done.count(a): + * this_frag.push_back(a) + */ + (void)(__pyx_v_frag_todo.erase(__pyx_v_a)); + + /* "MDAnalysis/lib/_cutil.pyx":382 + * a = deref(frag_todo.begin()) + * frag_todo.erase(a) + * if not frag_done.count(a): # <<<<<<<<<<<<<< + * this_frag.push_back(a) + * frag_done.insert(a) + */ + __pyx_t_16 = ((!(__pyx_v_frag_done.count(__pyx_v_a) != 0)) != 0); + if (__pyx_t_16) { + + /* "MDAnalysis/lib/_cutil.pyx":383 + * frag_todo.erase(a) + * if not frag_done.count(a): + * this_frag.push_back(a) # <<<<<<<<<<<<<< + * frag_done.insert(a) + * todo.erase(a) + */ + try { + __pyx_v_this_frag.push_back(__pyx_v_a); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 383, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":384 + * if not frag_done.count(a): + * this_frag.push_back(a) + * frag_done.insert(a) # <<<<<<<<<<<<<< + * todo.erase(a) + * for b in bondmap[a]: + */ + try { + __pyx_v_frag_done.insert(__pyx_v_a); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 384, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":385 + * this_frag.push_back(a) + * frag_done.insert(a) + * todo.erase(a) # <<<<<<<<<<<<<< + * for b in bondmap[a]: + * if not frag_done.count(b): + */ + (void)(__pyx_v_todo.erase(__pyx_v_a)); + + /* "MDAnalysis/lib/_cutil.pyx":386 + * frag_done.insert(a) + * todo.erase(a) + * for b in bondmap[a]: # <<<<<<<<<<<<<< + * if not frag_done.count(b): + * frag_todo.insert(b) + */ + __pyx_t_19 = &(__pyx_v_bondmap[__pyx_v_a]); + __pyx_t_18 = __pyx_t_19->begin(); + for (;;) { + if (!(__pyx_t_18 != __pyx_t_19->end())) break; + __pyx_t_10 = *__pyx_t_18; + ++__pyx_t_18; + __pyx_v_b = __pyx_t_10; + + /* "MDAnalysis/lib/_cutil.pyx":387 + * todo.erase(a) + * for b in bondmap[a]: + * if not frag_done.count(b): # <<<<<<<<<<<<<< + * frag_todo.insert(b) + * + */ + __pyx_t_16 = ((!(__pyx_v_frag_done.count(__pyx_v_b) != 0)) != 0); + if (__pyx_t_16) { + + /* "MDAnalysis/lib/_cutil.pyx":388 + * for b in bondmap[a]: + * if not frag_done.count(b): + * frag_todo.insert(b) # <<<<<<<<<<<<<< + * + * # Add fragment to output + */ + try { + __pyx_v_frag_todo.insert(__pyx_v_b); + } catch(...) { + __Pyx_CppExn2PyErr(); + __PYX_ERR(0, 388, __pyx_L1_error) + } + + /* "MDAnalysis/lib/_cutil.pyx":387 + * todo.erase(a) + * for b in bondmap[a]: + * if not frag_done.count(b): # <<<<<<<<<<<<<< + * frag_todo.insert(b) + * + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":386 + * frag_done.insert(a) + * todo.erase(a) + * for b in bondmap[a]: # <<<<<<<<<<<<<< + * if not frag_done.count(b): + * frag_todo.insert(b) + */ + } + + /* "MDAnalysis/lib/_cutil.pyx":382 + * a = deref(frag_todo.begin()) + * frag_todo.erase(a) + * if not frag_done.count(a): # <<<<<<<<<<<<<< + * this_frag.push_back(a) + * frag_done.insert(a) + */ + } + } + + /* "MDAnalysis/lib/_cutil.pyx":391 + * + * # Add fragment to output + * frags.append(np.asarray(this_frag)) # <<<<<<<<<<<<<< + * + * return frags + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __pyx_convert_vector_to_py_int(__pyx_v_this_frag); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + } + } + if (!__pyx_t_3) { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_GOTREF(__pyx_t_4); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_t_1}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_t_1}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + { + __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_20 = __Pyx_PyList_Append(__pyx_v_frags, __pyx_t_4); if (unlikely(__pyx_t_20 == ((int)-1))) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + + /* "MDAnalysis/lib/_cutil.pyx":393 + * frags.append(np.asarray(this_frag)) + * + * return frags # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_frags); + __pyx_r = __pyx_v_frags; + goto __pyx_L0; + + /* "MDAnalysis/lib/_cutil.pyx":322 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def find_fragments(atoms, bondlist): # <<<<<<<<<<<<<< + * """Calculate distinct fragments from nodes (atom indices) and edges (pairs + * of atom indices). + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); + __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); + __Pyx_AddTraceback("MDAnalysis.lib._cutil.find_fragments", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_atoms_view, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_bonds_view, 1); + __Pyx_XDECREF(__pyx_v_frags); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fulfill the PEP. + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_i; + int __pyx_v_ndim; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + int __pyx_v_t; + char *__pyx_v_f; + PyArray_Descr *__pyx_v_descr = 0; + int __pyx_v_offset; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + char *__pyx_t_8; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + * + * cdef int i, ndim + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + */ + __pyx_v_endian_detector = 1; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + * cdef int i, ndim + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * + * ndim = PyArray_NDIM(self) + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + */ + __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not C contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 229, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 229, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L7_bool_binop_done; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not Fortran contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L7_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 233, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + * raise ValueError(u"ndarray is not Fortran contiguous") + * + * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + * + * info.buf = PyArray_DATA(self) + * info.ndim = ndim # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * # Allocate new buffer for strides and shape info. + */ + __pyx_v_info->ndim = __pyx_v_ndim; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< + * info.shape = info.strides + ndim + * for i in range(ndim): + */ + __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + * # This is allocated as one block, strides first. + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) + * info.shape = info.strides + ndim # <<<<<<<<<<<<<< + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + */ + __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) + * info.shape = info.strides + ndim + * for i in range(ndim): # <<<<<<<<<<<<<< + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] + */ + __pyx_t_4 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + * info.shape = info.strides + ndim + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + */ + (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< + * else: + * info.strides = PyArray_STRIDES(self) + */ + (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + goto __pyx_L9; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + */ + /*else*/ { + __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + * else: + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + */ + __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); + } + __pyx_L9:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) + */ + __pyx_v_info->suboffsets = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< + * info.readonly = not PyArray_ISWRITEABLE(self) + * + */ + __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< + * + * cdef int t + */ + __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + * + * cdef int t + * cdef char* f = NULL # <<<<<<<<<<<<<< + * cdef dtype descr = self.descr + * cdef int offset + */ + __pyx_v_f = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + * cdef int t + * cdef char* f = NULL + * cdef dtype descr = self.descr # <<<<<<<<<<<<<< + * cdef int offset + * + */ + __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + * cdef int offset + * + * info.obj = self # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(descr): + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * info.obj = self + * + * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + * + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num # <<<<<<<<<<<<<< + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + */ + __pyx_t_4 = __pyx_v_descr->type_num; + __pyx_v_t = __pyx_t_4; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); + if (!__pyx_t_2) { + goto __pyx_L15_next_or; + } else { + } + __pyx_t_2 = (__pyx_v_little_endian != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L14_bool_binop_done; + } + __pyx_L15_next_or:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L14_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 263, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + */ + switch (__pyx_v_t) { + case NPY_BYTE: + __pyx_v_f = ((char *)"b"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + */ + case NPY_UBYTE: + __pyx_v_f = ((char *)"B"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + */ + case NPY_SHORT: + __pyx_v_f = ((char *)"h"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + */ + case NPY_USHORT: + __pyx_v_f = ((char *)"H"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + */ + case NPY_INT: + __pyx_v_f = ((char *)"i"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + */ + case NPY_UINT: + __pyx_v_f = ((char *)"I"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + */ + case NPY_LONG: + __pyx_v_f = ((char *)"l"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + */ + case NPY_ULONG: + __pyx_v_f = ((char *)"L"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + */ + case NPY_LONGLONG: + __pyx_v_f = ((char *)"q"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + */ + case NPY_ULONGLONG: + __pyx_v_f = ((char *)"Q"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + */ + case NPY_FLOAT: + __pyx_v_f = ((char *)"f"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + */ + case NPY_DOUBLE: + __pyx_v_f = ((char *)"d"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + */ + case NPY_LONGDOUBLE: + __pyx_v_f = ((char *)"g"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + */ + case NPY_CFLOAT: + __pyx_v_f = ((char *)"Zf"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" + */ + case NPY_CDOUBLE: + __pyx_v_f = ((char *)"Zd"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f = "O" + * else: + */ + case NPY_CLONGDOUBLE: + __pyx_v_f = ((char *)"Zg"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + case NPY_OBJECT: + __pyx_v_f = ((char *)"O"); + break; + default: + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + * elif t == NPY_OBJECT: f = "O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * info.format = f + * return + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 282, __pyx_L1_error) + break; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f # <<<<<<<<<<<<<< + * return + * else: + */ + __pyx_v_info->format = __pyx_v_f; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f + * return # <<<<<<<<<<<<<< + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * info.obj = self + * + * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + * return + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + */ + /*else*/ { + __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, + */ + (__pyx_v_info->format[0]) = '^'; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + * info.format = PyObject_Malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 # <<<<<<<<<<<<<< + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + */ + __pyx_v_offset = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< + * info.format + _buffer_format_string_len, + * &offset) + */ + __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) + __pyx_v_f = __pyx_t_8; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + * info.format + _buffer_format_string_len, + * &offset) + * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + */ + (__pyx_v_f[0]) = '\x00'; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fulfill the PEP. + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + */ + +/* Python wrapper */ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); + __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__releasebuffer__", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * PyObject_Free(info.strides) + */ + PyObject_Free(__pyx_v_info->format); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * PyObject_Free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * PyObject_Free(info.strides) # <<<<<<<<<<<<<< + * # info.shape was stored after info.strides in the same block + * + */ + PyObject_Free(__pyx_v_info->strides); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * PyObject_Free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 785, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 788, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + * return () + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { + PyArray_Descr *__pyx_v_child = 0; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + PyObject *__pyx_v_fields = 0; + PyObject *__pyx_v_childname = NULL; + PyObject *__pyx_v_new_offset = NULL; + PyObject *__pyx_v_t = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + long __pyx_t_8; + char *__pyx_t_9; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + * + * cdef dtype child + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef tuple fields + */ + __pyx_v_endian_detector = 1; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + * cdef dtype child + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * cdef tuple fields + * + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + if (unlikely(__pyx_v_descr->names == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 805, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 805, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 805, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + * + * for childname in descr.names: + * fields = descr.fields[childname] # <<<<<<<<<<<<<< + * child, new_offset = fields + * + */ + if (unlikely(__pyx_v_descr->fields == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 806, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 806, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 806, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + * for childname in descr.names: + * fields = descr.fields[childname] + * child, new_offset = fields # <<<<<<<<<<<<<< + * + * if (end - f) - (new_offset - offset[0]) < 15: + */ + if (likely(__pyx_v_fields != Py_None)) { + PyObject* sequence = __pyx_v_fields; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 807, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 807, __pyx_L1_error) + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); + __pyx_t_3 = 0; + __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 809, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 809, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 809, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 810, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); + if (!__pyx_t_7) { + goto __pyx_L8_next_or; + } else { + } + __pyx_t_7 = (__pyx_v_little_endian != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_L8_next_or:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + * + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * # One could encode it in the format string and have Cython + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_6 = __pyx_t_7; + __pyx_L7_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 814, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + * + * # Output padding bytes + * while offset[0] < new_offset: # <<<<<<<<<<<<<< + * f[0] = 120 # "x"; pad byte + * f += 1 + */ + while (1) { + __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 824, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 824, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 824, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + * # Output padding bytes + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< + * f += 1 + * offset[0] += 1 + */ + (__pyx_v_f[0]) = 0x78; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte + * f += 1 # <<<<<<<<<<<<<< + * offset[0] += 1 + * + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + * f[0] = 120 # "x"; pad byte + * f += 1 + * offset[0] += 1 # <<<<<<<<<<<<<< + * + * offset[0] += child.itemsize + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + * offset[0] += 1 + * + * offset[0] += child.itemsize # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(child): + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); + if (__pyx_t_6) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + * + * if not PyDataType_HASFIELDS(child): + * t = child.type_num # <<<<<<<<<<<<<< + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 834, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + * + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 843, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 843, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 843, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 845, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 845, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 845, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 846, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 846, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 846, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 847, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 847, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 847, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 848, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 848, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 848, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 849, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 849, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 849, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 850, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 850, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 850, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x66; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 851, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 851, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 851, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x64; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 852, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 852, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 852, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x67; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 853, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 853, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 853, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (likely(__pyx_t_6)) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * f += 1 + * else: + */ + /*else*/ { + __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 855, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 855, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 855, __pyx_L1_error) + } + __pyx_L15:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * f += 1 # <<<<<<<<<<<<<< + * else: + * # Cython ignores struct boundary information ("T{...}"), + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + goto __pyx_L13; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + * # Cython ignores struct boundary information ("T{...}"), + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< + * return f + * + */ + /*else*/ { + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(1, 860, __pyx_L1_error) + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) + * return f # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + * return () + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_child); + __Pyx_XDECREF(__pyx_v_fields); + __Pyx_XDECREF(__pyx_v_childname); + __Pyx_XDECREF(__pyx_v_new_offset); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + PyObject *__pyx_v_baseptr; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("set_array_base", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + __pyx_t_1 = (__pyx_v_base == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + * cdef PyObject* baseptr + * if base is None: + * baseptr = NULL # <<<<<<<<<<<<<< + * else: + * Py_INCREF(base) # important to do this before decref below! + */ + __pyx_v_baseptr = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + goto __pyx_L3; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + * baseptr = NULL + * else: + * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< + * baseptr = base + * Py_XDECREF(arr.base) + */ + /*else*/ { + Py_INCREF(__pyx_v_base); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + * else: + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base # <<<<<<<<<<<<<< + * Py_XDECREF(arr.base) + * arr.base = baseptr + */ + __pyx_v_baseptr = ((PyObject *)__pyx_v_base); + } + __pyx_L3:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base + * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< + * arr.base = baseptr + * + */ + Py_XDECREF(__pyx_v_arr->base); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + * baseptr = base + * Py_XDECREF(arr.base) + * arr.base = baseptr # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_v_arr->base = __pyx_v_baseptr; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: + * return None # <<<<<<<<<<<<<< + * else: + * return arr.base + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + * return None + * else: + * return arr.base # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); + __pyx_r = ((PyObject *)__pyx_v_arr->base); + goto __pyx_L0; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_array", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + * cdef inline int import_array() except -1: + * try: + * _import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + * try: + * _import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 999, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1000, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1000, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_umath", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1005, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1006, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1006, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_ufunc", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1011, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1012, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1012, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "carray.from_py":77 + * + * @cname("__Pyx_carray_from_py_float") + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< + * cdef Py_ssize_t i = length + * try: + */ + +static int __Pyx_carray_from_py_float(PyObject *__pyx_v_o, float *__pyx_v_v, Py_ssize_t __pyx_v_length) { + Py_ssize_t __pyx_v_i; + PyObject *__pyx_v_item = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + PyObject *(*__pyx_t_9)(PyObject *); + PyObject *__pyx_t_10 = NULL; + float __pyx_t_11; + char const *__pyx_t_12; + __Pyx_RefNannySetupContext("__Pyx_carray_from_py_float", 0); + + /* "carray.from_py":78 + * @cname("__Pyx_carray_from_py_float") + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length # <<<<<<<<<<<<<< + * try: + * i = len(o) + */ + __pyx_v_i = __pyx_v_length; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "carray.from_py":80 + * cdef Py_ssize_t i = length + * try: + * i = len(o) # <<<<<<<<<<<<<< + * except (TypeError, OverflowError): + * pass + */ + __pyx_t_4 = PyObject_Length(__pyx_v_o); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(2, 80, __pyx_L3_error) + __pyx_v_i = __pyx_t_4; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "carray.from_py":81 + * try: + * i = len(o) + * except (TypeError, OverflowError): # <<<<<<<<<<<<<< + * pass + * if i == length: + */ + __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_OverflowError); + if (__pyx_t_5) { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L4_exception_handled; + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L4_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L8_try_end:; + } + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_t_4 = 0; + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_7 = __pyx_v_o; __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0; + __pyx_t_9 = NULL; + } else { + __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 84, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_9)) { + if (likely(PyList_CheckExact(__pyx_t_7))) { + if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } else { + if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } + } else { + __pyx_t_10 = __pyx_t_9(__pyx_t_7); + if (unlikely(!__pyx_t_10)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 84, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_10); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_10); + __pyx_t_10 = 0; + __pyx_v_i = __pyx_t_4; + __pyx_t_4 = (__pyx_t_4 + 1); + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + __pyx_t_6 = ((__pyx_v_i >= __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":86 + * for i, item in enumerate(o): + * if i >= length: + * break # <<<<<<<<<<<<<< + * v[i] = item + * else: + */ + goto __pyx_L11_break; + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + } + + /* "carray.from_py":87 + * if i >= length: + * break + * v[i] = item # <<<<<<<<<<<<<< + * else: + * i += 1 # convert index to length + */ + __pyx_t_11 = __pyx_PyFloat_AsFloat(__pyx_v_item); if (unlikely((__pyx_t_11 == (float)-1) && PyErr_Occurred())) __PYX_ERR(2, 87, __pyx_L1_error) + (__pyx_v_v[__pyx_v_i]) = __pyx_t_11; + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + } + /*else*/ { + + /* "carray.from_py":89 + * v[i] = item + * else: + * i += 1 # convert index to length # <<<<<<<<<<<<<< + * if i == length: + * return 0 + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":91 + * i += 1 # convert index to length + * if i == length: + * return 0 # <<<<<<<<<<<<<< + * + * PyErr_Format( + */ + __pyx_r = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L0; + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + } + } + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_L11_break:; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + } + + /* "carray.from_py":96 + * IndexError, + * ("too many values found during array assignment, expected %zd" + * if i >= length else # <<<<<<<<<<<<<< + * "not enough values found during array assignment, expected %zd, got %zd"), + * length, i) + */ + if (((__pyx_v_i >= __pyx_v_length) != 0)) { + __pyx_t_12 = ((char const *)"too many values found during array assignment, expected %zd"); + } else { + __pyx_t_12 = ((char const *)"not enough values found during array assignment, expected %zd, got %zd"); + } + + /* "carray.from_py":93 + * return 0 + * + * PyErr_Format( # <<<<<<<<<<<<<< + * IndexError, + * ("too many values found during array assignment, expected %zd" + */ + __pyx_t_7 = PyErr_Format(__pyx_builtin_IndexError, __pyx_t_12, __pyx_v_length, __pyx_v_i); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":77 + * + * @cname("__Pyx_carray_from_py_float") + * cdef int __Pyx_carray_from_py_float(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< + * cdef Py_ssize_t i = length + * try: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("carray.from_py.__Pyx_carray_from_py_float", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __Pyx_carray_from_py_float___5b_3_5d_(PyObject *__pyx_v_o, float (*__pyx_v_v)[3], Py_ssize_t __pyx_v_length) { + Py_ssize_t __pyx_v_i; + PyObject *__pyx_v_item = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + PyObject *(*__pyx_t_9)(PyObject *); + PyObject *__pyx_t_10 = NULL; + float __pyx_t_11[3]; + char const *__pyx_t_12; + __Pyx_RefNannySetupContext("__Pyx_carray_from_py_float___5b_3_5d_", 0); + + /* "carray.from_py":78 + * @cname("__Pyx_carray_from_py_float___5b_3_5d_") + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length # <<<<<<<<<<<<<< + * try: + * i = len(o) + */ + __pyx_v_i = __pyx_v_length; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "carray.from_py":80 + * cdef Py_ssize_t i = length + * try: + * i = len(o) # <<<<<<<<<<<<<< + * except (TypeError, OverflowError): + * pass + */ + __pyx_t_4 = PyObject_Length(__pyx_v_o); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(2, 80, __pyx_L3_error) + __pyx_v_i = __pyx_t_4; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "carray.from_py":81 + * try: + * i = len(o) + * except (TypeError, OverflowError): # <<<<<<<<<<<<<< + * pass + * if i == length: + */ + __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_OverflowError); + if (__pyx_t_5) { + __Pyx_ErrRestore(0,0,0); + goto __pyx_L4_exception_handled; + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "carray.from_py":79 + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: + * cdef Py_ssize_t i = length + * try: # <<<<<<<<<<<<<< + * i = len(o) + * except (TypeError, OverflowError): + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L4_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + __pyx_L8_try_end:; + } + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_t_4 = 0; + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_7 = __pyx_v_o; __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0; + __pyx_t_9 = NULL; + } else { + __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 84, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_9)) { + if (likely(PyList_CheckExact(__pyx_t_7))) { + if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } else { + if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(2, 84, __pyx_L1_error) + #else + __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + #endif + } + } else { + __pyx_t_10 = __pyx_t_9(__pyx_t_7); + if (unlikely(!__pyx_t_10)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 84, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_10); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_10); + __pyx_t_10 = 0; + __pyx_v_i = __pyx_t_4; + __pyx_t_4 = (__pyx_t_4 + 1); + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + __pyx_t_6 = ((__pyx_v_i >= __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":86 + * for i, item in enumerate(o): + * if i >= length: + * break # <<<<<<<<<<<<<< + * v[i] = item + * else: + */ + goto __pyx_L11_break; + + /* "carray.from_py":85 + * if i == length: + * for i, item in enumerate(o): + * if i >= length: # <<<<<<<<<<<<<< + * break + * v[i] = item + */ + } + + /* "carray.from_py":87 + * if i >= length: + * break + * v[i] = item # <<<<<<<<<<<<<< + * else: + * i += 1 # convert index to length + */ + if (unlikely(__Pyx_carray_from_py_float(__pyx_v_item, __pyx_t_11, 3) < 0)) __PYX_ERR(2, 87, __pyx_L1_error) + memcpy(&((__pyx_v_v[__pyx_v_i])[0]), __pyx_t_11, sizeof((__pyx_v_v[__pyx_v_i])[0]) * (3)); + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + } + /*else*/ { + + /* "carray.from_py":89 + * v[i] = item + * else: + * i += 1 # convert index to length # <<<<<<<<<<<<<< + * if i == length: + * return 0 + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0); + if (__pyx_t_6) { + + /* "carray.from_py":91 + * i += 1 # convert index to length + * if i == length: + * return 0 # <<<<<<<<<<<<<< + * + * PyErr_Format( + */ + __pyx_r = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L0; + + /* "carray.from_py":90 + * else: + * i += 1 # convert index to length + * if i == length: # <<<<<<<<<<<<<< + * return 0 + * + */ + } + } + + /* "carray.from_py":84 + * pass + * if i == length: + * for i, item in enumerate(o): # <<<<<<<<<<<<<< + * if i >= length: + * break + */ + __pyx_L11_break:; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":83 + * except (TypeError, OverflowError): + * pass + * if i == length: # <<<<<<<<<<<<<< + * for i, item in enumerate(o): + * if i >= length: + */ + } + + /* "carray.from_py":96 + * IndexError, + * ("too many values found during array assignment, expected %zd" + * if i >= length else # <<<<<<<<<<<<<< + * "not enough values found during array assignment, expected %zd, got %zd"), + * length, i) + */ + if (((__pyx_v_i >= __pyx_v_length) != 0)) { + __pyx_t_12 = ((char const *)"too many values found during array assignment, expected %zd"); + } else { + __pyx_t_12 = ((char const *)"not enough values found during array assignment, expected %zd, got %zd"); + } + + /* "carray.from_py":93 + * return 0 + * + * PyErr_Format( # <<<<<<<<<<<<<< + * IndexError, + * ("too many values found during array assignment, expected %zd" + */ + __pyx_t_7 = PyErr_Format(__pyx_builtin_IndexError, __pyx_t_12, __pyx_v_length, __pyx_v_i); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "carray.from_py":77 + * + * @cname("__Pyx_carray_from_py_float___5b_3_5d_") + * cdef int __Pyx_carray_from_py_float___5b_3_5d_(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<< + * cdef Py_ssize_t i = length + * try: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("carray.from_py.__Pyx_carray_from_py_float___5b_3_5d_", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py_int") + * cdef object __pyx_convert_vector_to_py_int(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + +static PyObject *__pyx_convert_vector_to_py_int(const std::vector &__pyx_v_v) { + size_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + size_t __pyx_t_2; + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_int", 0); + + /* "vector.to_py":61 + * @cname("__pyx_convert_vector_to_py_int") + * cdef object __pyx_convert_vector_to_py_int(vector[X]& v): + * return [v[i] for i in range(v.size())] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_v_v.size(); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + __pyx_t_5 = __Pyx_PyInt_From_int((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py_int") + * cdef object __pyx_convert_vector_to_py_int(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("vector.to_py.__pyx_convert_vector_to_py_int", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + PyObject* values[5] = {0,0,0,0,0}; + values[3] = ((PyObject *)__pyx_n_s_c); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_shape)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_itemsize)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(2, 121, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_format)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(2, 121, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mode); + if (value) { values[3] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_allocate_buffer); + if (value) { values[4] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 121, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 121, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 122, __pyx_L3_error) + } else { + + /* "View.MemoryView":122 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 121, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(2, 121, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(2, 121, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_dim; + PyObject **__pyx_v_p; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + char *__pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + Py_ssize_t __pyx_t_11; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":128 + * cdef PyObject **p + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 128, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(2, 128, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":129 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":131 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") + * + */ + __pyx_t_2 = ((!(__pyx_v_self->ndim != 0)) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":132 + * + * if not self.ndim: + * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 132, __pyx_L1_error) + + /* "View.MemoryView":131 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") + * + */ + } + + /* "View.MemoryView":134 + * raise ValueError("Empty shape tuple for cython.array") + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") + * + */ + __pyx_t_2 = ((__pyx_v_itemsize <= 0) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":135 + * + * if itemsize <= 0: + * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 135, __pyx_L1_error) + + /* "View.MemoryView":134 + * raise ValueError("Empty shape tuple for cython.array") + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") + * + */ + } + + /* "View.MemoryView":137 + * raise ValueError("itemsize <= 0 for cython.array") + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":138 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":137 + * raise ValueError("itemsize <= 0 for cython.array") + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":139 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(2, 139, __pyx_L1_error) + __pyx_t_5 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":140 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(2, 140, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) __PYX_ERR(2, 140, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_6; + + /* "View.MemoryView":143 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":144 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":146 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") + * + */ + __pyx_t_4 = ((!(__pyx_v_self->_shape != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":147 + * + * if not self._shape: + * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(2, 147, __pyx_L1_error) + + /* "View.MemoryView":146 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") + * + */ + } + + /* "View.MemoryView":150 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + */ + __pyx_t_7 = 0; + __pyx_t_5 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_5); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(2, 150, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_5, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 150, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_dim = __pyx_t_8; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":151 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim + */ + __pyx_t_4 = ((__pyx_v_dim <= 0) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":152 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_9); + __pyx_t_3 = 0; + __pyx_t_9 = 0; + __pyx_t_9 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(2, 152, __pyx_L1_error) + + /* "View.MemoryView":151 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":153 + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":150 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + */ + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":156 + * + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 156, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":157 + * cdef char order + * if mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * elif mode == 'c': + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":158 + * if mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * elif mode == 'c': + * order = b'C' + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":156 + * + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L10; + } + + /* "View.MemoryView":159 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 159, __pyx_L1_error) + if (likely(__pyx_t_4)) { + + /* "View.MemoryView":160 + * self.mode = u'fortran' + * elif mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * else: + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":161 + * elif mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":159 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L10; + } + + /* "View.MemoryView":163 + * self.mode = u'c' + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 163, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 163, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(2, 163, __pyx_L1_error) + } + __pyx_L10:; + + /* "View.MemoryView":165 + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + * + * self.len = fill_contig_strides_array(self._shape, self._strides, # <<<<<<<<<<<<<< + * itemsize, self.ndim, order) + * + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":168 + * itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * if allocate_buffer: + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":169 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * if allocate_buffer: + * + */ + __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 169, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 169, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_4; + + /* "View.MemoryView":170 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = (__pyx_v_allocate_buffer != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":173 + * + * + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError("unable to allocate array data.") + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":174 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ + __pyx_t_4 = ((!(__pyx_v_self->data != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":175 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(2, 175, __pyx_L1_error) + + /* "View.MemoryView":174 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ + } + + /* "View.MemoryView":177 + * raise MemoryError("unable to allocate array data.") + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): + */ + __pyx_t_4 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":178 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len / itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":179 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len / itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(2, 179, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(2, 179, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_itemsize); + __pyx_t_8 = __pyx_t_1; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_8; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "View.MemoryView":180 + * p = self.data + * for i in range(self.len / itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":181 + * for i in range(self.len / itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":177 + * raise MemoryError("unable to allocate array data.") + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): + */ + } + + /* "View.MemoryView":170 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":184 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + char *__pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + Py_ssize_t *__pyx_t_7; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":185 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":186 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 186, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":187 + * cdef int bufmode = -1 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L3; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 188, __pyx_L1_error) + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L3:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + __pyx_t_1 = ((!((__pyx_v_flags & __pyx_v_bufmode) != 0)) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * info.ndim = self.ndim + */ + __pyx_t_4 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_4; + + /* "View.MemoryView":193 + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_5 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_5; + + /* "View.MemoryView":194 + * info.buf = self.data + * info.len = self.len + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_6 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":195 + * info.len = self.len + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * info.suboffsets = NULL + */ + __pyx_t_7 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_7; + + /* "View.MemoryView":196 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = self.itemsize + */ + __pyx_t_7 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_7; + + /* "View.MemoryView":197 + * info.shape = self._shape + * info.strides = self._strides + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":198 + * info.strides = self._strides + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * + */ + __pyx_t_5 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_5; + + /* "View.MemoryView":199 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":201 + * info.readonly = 0 + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":202 + * + * if flags & PyBUF_FORMAT: + * info.format = self.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":201 + * info.readonly = 0 + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":204 + * info.format = self.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.obj = self + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L5:; + + /* "View.MemoryView":206 + * info.format = NULL + * + * info.obj = self # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":184 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: + */ + __pyx_t_1 = ((__pyx_v_self->callback_free_data != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, + */ + __pyx_t_1 = (__pyx_v_self->free_data != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + */ + __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":215 + * elif self.free_data: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, # <<<<<<<<<<<<<< + * self._strides, self.ndim, False) + * free(self.data) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + */ + } + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, + */ + } + __pyx_L3:; + + /* "View.MemoryView":218 + * self._strides, self.ndim, False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":221 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":222 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 222, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":221 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":225 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_memview", 0); + + /* "View.MemoryView":226 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":227 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":225 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":229 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__", 0); + + /* "View.MemoryView":230 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":229 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":232 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getattr__", 0); + + /* "View.MemoryView":233 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":232 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":235 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getitem__", 0); + + /* "View.MemoryView":236 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":235 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":238 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + + /* "View.MemoryView":239 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(2, 239, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":238 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":243 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("array_cwrapper", 0); + + /* "View.MemoryView":247 + * cdef array result + * + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + */ + __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":248 + * + * if buf == NULL: + * result = array(shape, itemsize, format, mode.decode('ASCII')) # <<<<<<<<<<<<<< + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":247 + * cdef array result + * + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":250 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf + */ + /*else*/ { + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_3); + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_3 = 0; + + /* "View.MemoryView":251 + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(2, 251, __pyx_L1_error) + + /* "View.MemoryView":250 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf + */ + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":252 + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":254 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":243 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":280 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(2, 280, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 280, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 0); + + /* "View.MemoryView":281 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":280 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":282 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "View.MemoryView":283 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":282 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.name,) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + int __pyx_v_use_setstate; + PyObject *__pyx_v_state = NULL; + PyObject *__pyx_v__dict = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":4 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":5 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":6 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); + __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); + __pyx_t_4 = 0; + + /* "(tree fragment)":7 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":5 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":9 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + __pyx_t_3 = (__pyx_v_use_setstate != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":11 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + } + + /* "(tree fragment)":13 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __pyx_t_5 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.name,) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":14 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 15, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":14 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":297 + * + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory + */ + +static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) { + Py_intptr_t __pyx_v_aligned_p; + size_t __pyx_v_offset; + void *__pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":299 + * cdef void *align_pointer(void *memory, size_t alignment) nogil: + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory # <<<<<<<<<<<<<< + * cdef size_t offset + * + */ + __pyx_v_aligned_p = ((Py_intptr_t)__pyx_v_memory); + + /* "View.MemoryView":303 + * + * with cython.cdivision(True): + * offset = aligned_p % alignment # <<<<<<<<<<<<<< + * + * if offset > 0: + */ + __pyx_v_offset = (__pyx_v_aligned_p % __pyx_v_alignment); + + /* "View.MemoryView":305 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset + * + */ + __pyx_t_1 = ((__pyx_v_offset > 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":306 + * + * if offset > 0: + * aligned_p += alignment - offset # <<<<<<<<<<<<<< + * + * return aligned_p + */ + __pyx_v_aligned_p = (__pyx_v_aligned_p + (__pyx_v_alignment - __pyx_v_offset)); + + /* "View.MemoryView":305 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset + * + */ + } + + /* "View.MemoryView":308 + * aligned_p += alignment - offset + * + * return aligned_p # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((void *)__pyx_v_aligned_p); + goto __pyx_L0; + + /* "View.MemoryView":297 + * + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":344 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_obj)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flags)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(2, 344, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dtype_is_object); + if (value) { values[2] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 344, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 344, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 344, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 344, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "View.MemoryView":345 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":346 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":347 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + __pyx_t_3 = (__pyx_t_2 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_obj != Py_None); + __pyx_t_2 = (__pyx_t_3 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":348 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 348, __pyx_L1_error) + + /* "View.MemoryView":349 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = ((((PyObject *)__pyx_v_self->view.obj) == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":350 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":351 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * global __pyx_memoryview_thread_locks_used + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":349 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":347 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":354 + * + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":356 + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":354 + * + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":357 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":358 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":359 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":360 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(2, 360, __pyx_L1_error) + + /* "View.MemoryView":359 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":357 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":362 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":363 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = (((__pyx_v_self->view.format[0]) == 'O') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_2 = (((__pyx_v_self->view.format[1]) == '\x00') != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":362 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L10; + } + + /* "View.MemoryView":365 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L10:; + + /* "View.MemoryView":367 + * self.dtype_is_object = dtype_is_object + * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( # <<<<<<<<<<<<<< + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL + */ + __pyx_v_self->acquisition_count_aligned_p = ((__pyx_atomic_int *)__pyx_align_pointer(((void *)(&(__pyx_v_self->acquisition_count[0]))), (sizeof(__pyx_atomic_int)))); + + /* "View.MemoryView":369 + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":344 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":371 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyThread_type_lock __pyx_t_6; + PyThread_type_lock __pyx_t_7; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":372 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":373 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * + * cdef int i + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":372 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * + */ + } + + /* "View.MemoryView":377 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_2 = ((__pyx_v_self->lock != NULL) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":378 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_3 = __pyx_memoryview_thread_locks_used; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":379 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_2 = (((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":380 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":381 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_2 = ((__pyx_v_i != __pyx_memoryview_thread_locks_used) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":383 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_7 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":382 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_6; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_7; + + /* "View.MemoryView":381 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":384 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":379 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":386 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":377 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":371 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":388 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + __Pyx_RefNannySetupContext("get_item_pointer", 0); + + /* "View.MemoryView":390 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":392 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 392, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 392, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 392, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 392, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":393 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 393, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(2, 393, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":392 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":395 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":388 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":398 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + char *__pyx_t_6; + __Pyx_RefNannySetupContext("__getitem__", 0); + + /* "View.MemoryView":399 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":400 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":399 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":402 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (likely(__pyx_t_3 != Py_None)) { + PyObject* sequence = __pyx_t_3; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(2, 402, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 402, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_v_indices = __pyx_t_5; + __pyx_t_5 = 0; + + /* "View.MemoryView":405 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 405, __pyx_L1_error) + if (__pyx_t_2) { + + /* "View.MemoryView":406 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":405 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":408 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(2, 408, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_6; + + /* "View.MemoryView":409 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 409, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":398 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":411 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":412 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") + * + */ + __pyx_t_1 = (__pyx_v_self->view.readonly != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":413 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(2, 413, __pyx_L1_error) + + /* "View.MemoryView":412 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") + * + */ + } + + /* "View.MemoryView":415 + * raise TypeError("Cannot assign to read-only memoryview") + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(2, 415, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 415, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":417 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 417, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":418 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_obj = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":419 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 419, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":420 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":419 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":422 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(2, 422, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":417 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":424 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":411 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":426 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":427 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":429 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int((__pyx_v_self->flags | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":430 + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 430, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":429 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":431 + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(2, 431, __pyx_L6_except_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":432 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + __pyx_L6_except_error:; + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":427 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":434 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":426 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":436 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 0); + + /* "View.MemoryView":440 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(2, 440, __pyx_L1_error) + + /* "View.MemoryView":441 + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], # <<<<<<<<<<<<<< + * src.ndim, dst.ndim, self.dtype_is_object) + * + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(2, 441, __pyx_L1_error) + + /* "View.MemoryView":442 + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 442, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":440 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + __pyx_t_4 = __pyx_memoryview_copy_contents((__pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice))[0]), (__pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice))[0]), __pyx_t_2, __pyx_t_3, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 440, __pyx_L1_error) + + /* "View.MemoryView":436 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":444 + * src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + char const *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 0); + + /* "View.MemoryView":446 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_v_dst_slice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); + + /* "View.MemoryView":453 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_1 = ((((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":454 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":455 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_1 = ((__pyx_v_tmp == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":456 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(2, 456, __pyx_L1_error) + + /* "View.MemoryView":455 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":457 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":453 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":459 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":461 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":462 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":463 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":462 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":465 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 465, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":469 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_1 = ((__pyx_v_self->view.suboffsets != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":470 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_2 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 470, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":469 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":471 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":474 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8) < 0)) __Pyx_ErrFetch(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __pyx_t_3 = __pyx_lineno; __pyx_t_4 = __pyx_clineno; __pyx_t_5 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11); + } + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ErrRestore(__pyx_t_6, __pyx_t_7, __pyx_t_8); + __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; + __pyx_lineno = __pyx_t_3; __pyx_clineno = __pyx_t_4; __pyx_filename = __pyx_t_5; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":444 + * src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":476 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("setitem_indexed", 0); + + /* "View.MemoryView":477 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(2, 477, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":478 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 478, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":476 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":480 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + size_t __pyx_t_10; + int __pyx_t_11; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); + + /* "View.MemoryView":483 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 483, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":486 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 486, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":488 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError("Unable to convert item to object") + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_7) { + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; + } + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_6); + __Pyx_INCREF(__pyx_v_bytesitem); + __Pyx_GIVEREF(__pyx_v_bytesitem); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_bytesitem); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":492 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_10 = strlen(__pyx_v_self->view.format); + __pyx_t_11 = ((__pyx_t_10 == 1) != 0); + if (__pyx_t_11) { + + /* "View.MemoryView":493 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":492 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":494 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":489 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError("Unable to convert item to object") + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 489, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_9); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(2, 489, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_1); + + /* "View.MemoryView":490 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 490, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(2, 490, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":480 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":496 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + char *__pyx_t_11; + char *__pyx_t_12; + char *__pyx_t_13; + char *__pyx_t_14; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); + + /* "View.MemoryView":499 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 499, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":504 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "View.MemoryView":505 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 505, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":504 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":507 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_7 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + { + __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + if (__pyx_t_5) { + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; + } + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_value); + __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 507, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":509 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_9 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(2, 509, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_10 = __pyx_v_bytesvalue; + __pyx_t_12 = PyBytes_AS_STRING(__pyx_t_10); + __pyx_t_13 = (__pyx_t_12 + PyBytes_GET_SIZE(__pyx_t_10)); + for (__pyx_t_14 = __pyx_t_12; __pyx_t_14 < __pyx_t_13; __pyx_t_14++) { + __pyx_t_11 = __pyx_t_14; + __pyx_v_c = (__pyx_t_11[0]); + + /* "View.MemoryView":510 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_9; + + /* "View.MemoryView":509 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_9 = (__pyx_t_9 + 1); + + /* "View.MemoryView":510 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + + /* "View.MemoryView":496 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":513 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t *__pyx_t_4; + char *__pyx_t_5; + void *__pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":514 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->view.readonly != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":515 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 515, __pyx_L1_error) + + /* "View.MemoryView":514 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + */ + } + + /* "View.MemoryView":517 + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":518 + * + * if flags & PyBUF_STRIDES: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_4 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_4; + + /* "View.MemoryView":517 + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":520 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":522 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":523 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_4 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_4; + + /* "View.MemoryView":522 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":525 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":527 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":528 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_4 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_4; + + /* "View.MemoryView":527 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":530 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":532 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":533 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_5 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_5; + + /* "View.MemoryView":532 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":535 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":537 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_6 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_6; + + /* "View.MemoryView":538 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_7 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_7; + + /* "View.MemoryView":539 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_8 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_8; + + /* "View.MemoryView":540 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_8 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_8; + + /* "View.MemoryView":541 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":542 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":513 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":548 + * + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":549 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 549, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(2, 549, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":550 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 550, __pyx_L1_error) + + /* "View.MemoryView":551 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":548 + * + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":555 + * @property + * def base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":558 + * + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":559 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":558 + * + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":562 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":563 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError("Buffer view does not expose strides") + */ + __pyx_t_1 = ((__pyx_v_self->view.strides == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":565 + * if self.view.strides == NULL: + * + * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 565, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(2, 565, __pyx_L1_error) + + /* "View.MemoryView":563 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError("Buffer view does not expose strides") + */ + } + + /* "View.MemoryView":567 + * raise ValueError("Buffer view does not expose strides") + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":562 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":570 + * + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + Py_ssize_t *__pyx_t_6; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":571 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = ((__pyx_v_self->view.suboffsets == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":572 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__27, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":574 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_6 = __pyx_v_self->view.suboffsets; __pyx_t_6 < __pyx_t_5; __pyx_t_6++) { + __pyx_t_4 = __pyx_t_6; + __pyx_v_suboffset = (__pyx_t_4[0]); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":570 + * + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":577 + * + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":578 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 578, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":577 + * + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":581 + * + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":582 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":585 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":586 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":585 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":589 + * + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":590 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":591 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":593 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_4 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.shape; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 593, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_6); + __pyx_t_6 = 0; + + /* "View.MemoryView":594 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_6); + __pyx_t_6 = 0; + } + + /* "View.MemoryView":596 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":590 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":598 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":589 + * + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":600 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__len__", 0); + + /* "View.MemoryView":601 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = ((__pyx_v_self->view.ndim >= 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":602 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":601 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":604 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":600 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":606 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "View.MemoryView":607 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":608 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 608, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":607 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":606 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__str__", 0); + + /* "View.MemoryView":611 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":614 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("is_c_contig", 0); + + /* "View.MemoryView":617 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_v_mslice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); + + /* "View.MemoryView":618 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":614 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("is_f_contig", 0); + + /* "View.MemoryView":623 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_v_mslice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); + + /* "View.MemoryView":624 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 624, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":626 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy", 0); + + /* "View.MemoryView":628 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":630 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":631 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 631, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":636 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 636, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":626 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":638 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy_fortran", 0); + + /* "View.MemoryView":640 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":642 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":643 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 643, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":648 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 648, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":638 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":652 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 0); + + /* "View.MemoryView":653 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":654 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":655 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":652 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":658 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("memoryview_check", 0); + + /* "View.MemoryView":659 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":658 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":661 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + CYTHON_UNUSED PyObject *__pyx_v_idx = NULL; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + PyObject *(*__pyx_t_6)(PyObject *); + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("_unellipsify", 0); + + /* "View.MemoryView":666 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: + */ + __pyx_t_1 = PyTuple_Check(__pyx_v_index); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":667 + * """ + * if not isinstance(index, tuple): + * tup = (index,) # <<<<<<<<<<<<<< + * else: + * tup = index + */ + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 667, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index); + __pyx_v_tup = __pyx_t_3; + __pyx_t_3 = 0; + + /* "View.MemoryView":666 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":669 + * tup = (index,) + * else: + * tup = index # <<<<<<<<<<<<<< + * + * result = [] + */ + /*else*/ { + __Pyx_INCREF(__pyx_v_index); + __pyx_v_tup = __pyx_v_index; + } + __pyx_L3:; + + /* "View.MemoryView":671 + * tup = index + * + * result = [] # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 671, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_result = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":672 + * + * result = [] + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * for idx, item in enumerate(tup): + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":673 + * result = [] + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * for idx, item in enumerate(tup): + * if item is Ellipsis: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":674 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + __Pyx_INCREF(__pyx_int_0); + __pyx_t_3 = __pyx_int_0; + if (likely(PyList_CheckExact(__pyx_v_tup)) || PyTuple_CheckExact(__pyx_v_tup)) { + __pyx_t_4 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 674, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_6)) { + if (likely(PyList_CheckExact(__pyx_t_4))) { + if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 674, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } else { + if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 674, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } + } else { + __pyx_t_7 = __pyx_t_6(__pyx_t_4); + if (unlikely(!__pyx_t_7)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 674, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_7); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_3); + __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); + __pyx_t_3 = __pyx_t_7; + __pyx_t_7 = 0; + + /* "View.MemoryView":675 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":676 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True + */ + __pyx_t_1 = ((!(__pyx_v_seen_ellipsis != 0)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":677 + * if item is Ellipsis: + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * else: + */ + __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(2, 677, __pyx_L1_error) + __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__30); + __Pyx_GIVEREF(__pyx_slice__30); + PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__30); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 677, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":678 + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * else: + * result.append(slice(None)) + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":676 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True + */ + goto __pyx_L7; + } + + /* "View.MemoryView":680 + * seen_ellipsis = True + * else: + * result.append(slice(None)) # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__31); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 680, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":681 + * else: + * result.append(slice(None)) + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":675 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + goto __pyx_L6; + } + + /* "View.MemoryView":683 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + __pyx_t_10 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = ((!(PyIndex_Check(__pyx_v_item) != 0)) != 0); + __pyx_t_1 = __pyx_t_10; + __pyx_L9_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":684 + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + * raise TypeError("Cannot index with type '%s'" % type(item)) # <<<<<<<<<<<<<< + * + * have_slices = have_slices or isinstance(item, slice) + */ + __pyx_t_7 = __Pyx_PyString_Format(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_11, 0, 0, 0); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __PYX_ERR(2, 684, __pyx_L1_error) + + /* "View.MemoryView":683 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + */ + } + + /* "View.MemoryView":686 + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + * have_slices = have_slices or isinstance(item, slice) # <<<<<<<<<<<<<< + * result.append(item) + * + */ + __pyx_t_10 = (__pyx_v_have_slices != 0); + if (!__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = PySlice_Check(__pyx_v_item); + __pyx_t_2 = (__pyx_t_10 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_have_slices = __pyx_t_1; + + /* "View.MemoryView":687 + * + * have_slices = have_slices or isinstance(item, slice) + * result.append(item) # <<<<<<<<<<<<<< + * + * nslices = ndim - len(result) + */ + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 687, __pyx_L1_error) + } + __pyx_L6:; + + /* "View.MemoryView":674 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":689 + * result.append(item) + * + * nslices = ndim - len(result) # <<<<<<<<<<<<<< + * if nslices: + * result.extend([slice(None)] * nslices) + */ + __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(2, 689, __pyx_L1_error) + __pyx_v_nslices = (__pyx_v_ndim - __pyx_t_5); + + /* "View.MemoryView":690 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + __pyx_t_1 = (__pyx_v_nslices != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":691 + * nslices = ndim - len(result) + * if nslices: + * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< + * + * return have_slices or nslices, tuple(result) + */ + __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 691, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__32); + __Pyx_GIVEREF(__pyx_slice__32); + PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__32); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 691, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":690 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + } + + /* "View.MemoryView":693 + * result.extend([slice(None)] * nslices) + * + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_L14_bool_binop_done:; + __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_4); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_r = ((PyObject*)__pyx_t_11); + __pyx_t_11 = 0; + goto __pyx_L0; + + /* "View.MemoryView":661 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":695 + * return have_slices or nslices, tuple(result) + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("assert_direct_dimensions", 0); + + /* "View.MemoryView":696 + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":697 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") + * + */ + __pyx_t_4 = ((__pyx_v_suboffset >= 0) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":698 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__33, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(2, 698, __pyx_L1_error) + + /* "View.MemoryView":697 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") + * + */ + } + } + + /* "View.MemoryView":695 + * return have_slices or nslices, tuple(result) + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":705 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + struct __pyx_memoryview_obj *__pyx_t_4; + char *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *(*__pyx_t_8)(PyObject *); + PyObject *__pyx_t_9 = NULL; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + Py_ssize_t __pyx_t_12; + __Pyx_RefNannySetupContext("memview_slice", 0); + + /* "View.MemoryView":706 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":713 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":717 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(!Py_OptimizeFlag)) { + if (unlikely(!((__pyx_v_memview->view.ndim > 0) != 0))) { + PyErr_SetNone(PyExc_AssertionError); + __PYX_ERR(2, 717, __pyx_L1_error) + } + } + #endif + + /* "View.MemoryView":719 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":720 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 720, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":721 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":719 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":723 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":724 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":730 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_4 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_4; + + /* "View.MemoryView":731 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_5; + + /* "View.MemoryView":736 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":737 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":741 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( + */ + __pyx_t_6 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_3 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; + __pyx_t_8 = NULL; + } else { + __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 741, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_8)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 741, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } else { + if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 741, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } + } else { + __pyx_t_9 = __pyx_t_8(__pyx_t_3); + if (unlikely(!__pyx_t_9)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(2, 741, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_9); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_v_dim = __pyx_t_6; + __pyx_t_6 = (__pyx_t_6 + 1); + + /* "View.MemoryView":742 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_2 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":746 + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + * index, 0, 0, # start, stop, step # <<<<<<<<<<<<<< + * 0, 0, 0, # have_{start,stop,step} + * False) + */ + __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 746, __pyx_L1_error) + + /* "View.MemoryView":743 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 743, __pyx_L1_error) + + /* "View.MemoryView":742 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + goto __pyx_L6; + } + + /* "View.MemoryView":749 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_2 = (__pyx_v_index == Py_None); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":750 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":751 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":752 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":753 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":749 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":755 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 755, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 755, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 755, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_10; + + /* "View.MemoryView":756 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 756, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 756, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 756, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_10; + + /* "View.MemoryView":757 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 757, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 757, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 757, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_10; + + /* "View.MemoryView":759 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 759, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":760 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 760, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":761 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 761, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":763 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 763, __pyx_L1_error) + + /* "View.MemoryView":769 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":741 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( + */ + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":771 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":772 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); + + /* "View.MemoryView":773 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 773, __pyx_L1_error) } + + /* "View.MemoryView":774 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 774, __pyx_L1_error) } + + /* "View.MemoryView":772 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 772, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":771 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":777 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF(((PyObject *)__pyx_r)); + + /* "View.MemoryView":778 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "View.MemoryView":777 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 777, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":705 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":802 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":822 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":824 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":825 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":824 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":826 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":827 + * start += shape + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 827, __pyx_L1_error) + + /* "View.MemoryView":826 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":822 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":830 + * else: + * + * negative_step = have_step != 0 and step < 0 # <<<<<<<<<<<<<< + * + * if have_step and step == 0: + */ + /*else*/ { + __pyx_t_1 = ((__pyx_v_have_step != 0) != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step < 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L6_bool_binop_done:; + __pyx_v_negative_step = __pyx_t_2; + + /* "View.MemoryView":832 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) + * + */ + __pyx_t_1 = (__pyx_v_have_step != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step == 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L9_bool_binop_done:; + if (__pyx_t_2) { + + /* "View.MemoryView":833 + * + * if have_step and step == 0: + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 833, __pyx_L1_error) + + /* "View.MemoryView":832 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) + * + */ + } + + /* "View.MemoryView":836 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":837 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":838 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":839 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":840 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":839 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":837 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":841 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = ((__pyx_v_start >= __pyx_v_shape) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":842 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":843 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":842 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":845 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L14:; + + /* "View.MemoryView":841 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L12:; + + /* "View.MemoryView":836 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L11; + } + + /* "View.MemoryView":847 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":847 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L15; + } + + /* "View.MemoryView":850 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L15:; + } + __pyx_L11:; + + /* "View.MemoryView":852 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":853 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":854 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":855 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":856 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":855 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":853 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L17; + } + + /* "View.MemoryView":857 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = ((__pyx_v_stop > __pyx_v_shape) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":858 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":857 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L17:; + + /* "View.MemoryView":852 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L16; + } + + /* "View.MemoryView":860 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":861 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":860 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":863 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * if not have_step: + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L19:; + } + __pyx_L16:; + + /* "View.MemoryView":865 + * stop = shape + * + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 + * + */ + __pyx_t_2 = ((!(__pyx_v_have_step != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":866 + * + * if not have_step: + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + + /* "View.MemoryView":865 + * stop = shape + * + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 + * + */ + } + + /* "View.MemoryView":870 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":872 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":873 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":872 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":875 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = ((__pyx_v_new_shape < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":875 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":879 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":880 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":881 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":884 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = (((__pyx_v_suboffset_dim[0]) < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":885 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":884 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L23; + } + + /* "View.MemoryView":887 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L23:; + + /* "View.MemoryView":889 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":890 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":891 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = ((__pyx_v_new_ndim == 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":892 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":891 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L26; + } + + /* "View.MemoryView":894 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":895 + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 894, __pyx_L1_error) + } + __pyx_L26:; + + /* "View.MemoryView":890 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L25; + } + + /* "View.MemoryView":897 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L25:; + + /* "View.MemoryView":889 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":899 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":802 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":905 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("pybuffer_index", 0); + + /* "View.MemoryView":907 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":908 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":911 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize + */ + __pyx_t_2 = ((__pyx_v_view->ndim == 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if view.ndim == 0: + * shape = view.len / itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(2, 912, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(2, 912, __pyx_L1_error) + } + __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); + + /* "View.MemoryView":913 + * if view.ndim == 0: + * shape = view.len / itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":911 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":915 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":916 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":917 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = ((__pyx_v_view->suboffsets != NULL) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":918 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":917 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":920 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = ((__pyx_v_index < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":922 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + __pyx_t_2 = ((__pyx_v_index < 0) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":923 + * index += view.shape[dim] + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 923, __pyx_L1_error) + + /* "View.MemoryView":922 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + } + + /* "View.MemoryView":920 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":925 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + __pyx_t_2 = ((__pyx_v_index >= __pyx_v_shape) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":926 + * + * if index >= shape: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 926, __pyx_L1_error) + + /* "View.MemoryView":925 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + } + + /* "View.MemoryView":928 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":929 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":930 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":929 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":932 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":905 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":938 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + + /* "View.MemoryView":939 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":941 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":942 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":946 + * + * cdef int i, j + * for i in range(ndim / 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = __Pyx_div_long(__pyx_v_ndim, 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":947 + * cdef int i, j + * for i in range(ndim / 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":948 + * for i in range(ndim / 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":949 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":951 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0) != 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0) != 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":952 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 1 + */ + __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 952, __pyx_L1_error) + + /* "View.MemoryView":951 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":954 + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "View.MemoryView":938 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = 0; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":971 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":972 + * + * def __dealloc__(self): + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XDEC_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":971 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":974 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); + + /* "View.MemoryView":975 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = ((__pyx_v_self->to_object_func != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":976 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":975 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":978 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 978, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":974 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":980 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); + + /* "View.MemoryView":981 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = ((__pyx_v_self->to_dtype_func != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":982 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 982, __pyx_L1_error) + + /* "View.MemoryView":981 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":984 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * @property + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":980 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":987 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":988 + * @property + * def base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":987 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":994 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + __Pyx_RefNannySetupContext("memoryview_fromslice", 0); + + /* "View.MemoryView":1002 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = ((((PyObject *)__pyx_v_memviewslice.memview) == Py_None) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1003 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1002 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1008 + * + * + * result = _memoryviewslice(None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1010 + * result = _memoryviewslice(None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1011 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview).base + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1013 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview).base # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1014 + * + * result.from_object = ( memviewslice.memview).base + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1016 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1017 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1018 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1019 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1020 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1022 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1023 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1022 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1025 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1027 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1028 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1031 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1032 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1033 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1034 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1035 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1033 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1037 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1038 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1038, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1039 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1039, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1039, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 1039, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1041 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1042 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1044 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":994 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1047 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_slice_from_memview", 0); + + /* "View.MemoryView":1050 + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1051 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 1051, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":1052 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1050 + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1054 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1055 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1047 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_WriteUnraisable("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1058 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + __Pyx_RefNannyDeclarations + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + __Pyx_RefNannySetupContext("slice_copy", 0); + + /* "View.MemoryView":1062 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1063 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1064 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1066 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1067 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1069 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1070 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1071 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1072 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + if ((__pyx_v_suboffsets != 0)) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1058 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":1075 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy", 0); + + /* "View.MemoryView":1078 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1079 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1079, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1075 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1082 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *(*__pyx_t_3)(char *); + int (*__pyx_t_4)(char *, PyObject *); + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 0); + + /* "View.MemoryView":1089 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1090 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_3; + + /* "View.MemoryView":1091 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_4 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_4; + + /* "View.MemoryView":1089 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1093 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1094 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1096 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1098 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1096, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1082 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1104 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":1105 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: + */ + __pyx_t_1 = ((__pyx_v_arg < 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1106 + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: + * return -arg # <<<<<<<<<<<<<< + * else: + * return arg + */ + __pyx_r = (-__pyx_v_arg); + goto __pyx_L0; + + /* "View.MemoryView":1105 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: + */ + } + + /* "View.MemoryView":1108 + * return -arg + * else: + * return arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + /*else*/ { + __pyx_r = __pyx_v_arg; + goto __pyx_L0; + } + + /* "View.MemoryView":1104 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1111 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1116 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1117 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1119 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1120 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1121 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1122 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1120 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1124 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1125 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1126 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1127 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1125 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1129 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = ((abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1130 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1129 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1132 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1111 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1135 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + + /* "View.MemoryView":1142 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1143 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1144 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = ((__pyx_v_src_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_dst_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1149 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_3 = (__pyx_t_2 != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1152 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1153 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1154 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1155 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1157 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1158 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1162 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1163 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1135 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1165 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1168 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1165 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1172 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1175 + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + * cdef Py_ssize_t size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1177 + * cdef Py_ssize_t size = src.memview.view.itemsize + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * size *= src.shape[i] + * + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1178 + * + * for i in range(ndim): + * size *= src.shape[i] # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * (__pyx_v_src->shape[__pyx_v_i])); + } + + /* "View.MemoryView":1180 + * size *= src.shape[i] + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1172 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1183 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1192 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = ((__pyx_v_order == 'F') != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1193 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride = stride * shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1194 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride = stride * shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1195 + * for idx in range(ndim): + * strides[idx] = stride + * stride = stride * shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1192 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1197 + * stride = stride * shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride = stride * shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1198 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride = stride * shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1199 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride = stride * shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1201 + * stride = stride * shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1183 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1204 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1215 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1216 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1218 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err(MemoryError, NULL) + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1219 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) + * + */ + __pyx_t_2 = ((!(__pyx_v_result != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1220 + * result = malloc(size) + * if not result: + * _err(MemoryError, NULL) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 1220, __pyx_L1_error) + + /* "View.MemoryView":1219 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) + * + */ + } + + /* "View.MemoryView":1223 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1224 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1225 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1226 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1227 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1229 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, # <<<<<<<<<<<<<< + * ndim, order) + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = (((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1204 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = NULL; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1250 + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + * (i, extent1, extent2)) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % # <<<<<<<<<<<<<< + * (i, extent1, extent2)) + * + */ + __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(2, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1253 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_error); + + /* "View.MemoryView":1254 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: + * raise error(msg.decode('ascii') % dim) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_v_error); + __pyx_t_3 = __pyx_v_error; __pyx_t_2 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + if (!__pyx_t_2) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(2, 1254, __pyx_L1_error) + + /* "View.MemoryView":1253 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1257 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_error); + + /* "View.MemoryView":1258 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) + * else: + */ + __pyx_t_1 = ((__pyx_v_msg != NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":1259 + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: + * raise error(msg.decode('ascii')) # <<<<<<<<<<<<<< + * else: + * raise error + */ + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_error); + __pyx_t_4 = __pyx_v_error; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + if (!__pyx_t_5) { + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(2, 1259, __pyx_L1_error) + + /* "View.MemoryView":1258 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) + * else: + */ + } + + /* "View.MemoryView":1261 + * raise error(msg.decode('ascii')) + * else: + * raise error # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_contents') + */ + /*else*/ { + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + __PYX_ERR(2, 1261, __pyx_L1_error) + } + + /* "View.MemoryView":1257 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1264 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_t_8; + + /* "View.MemoryView":1272 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1273 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1275 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1276 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1277 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1280 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = ((__pyx_v_src_ndim < __pyx_v_dst_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1281 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1280 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1282 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = ((__pyx_v_dst_ndim < __pyx_v_src_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1283 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1282 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1285 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + if (((__pyx_t_3 > __pyx_t_4) != 0)) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1287 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1288 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1289 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1291 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1289 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1293 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1293, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1288 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1295 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = (((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1296 + * + * if src.suboffsets[i] >= 0: + * _err_dim(ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1296, __pyx_L1_error) + + /* "View.MemoryView":1295 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1298 + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = (__pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1300 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = ((!(__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim) != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1300 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1303 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(2, 1303, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1304 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1298 + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1306 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = ((!(__pyx_v_broadcasting != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1309 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1309 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1311 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1312 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1311 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1314 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + __pyx_t_2 = (__pyx_v_direct_copy != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1316 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1317 + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1318 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1319 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1320 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1314 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + } + + /* "View.MemoryView":1306 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1322 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + __pyx_t_8 = (__pyx_t_2 != 0); + if (__pyx_t_8) { + + /* "View.MemoryView":1325 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1325, __pyx_L1_error) + + /* "View.MemoryView":1326 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1326, __pyx_L1_error) + + /* "View.MemoryView":1322 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1328 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1329 + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1330 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1332 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1333 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1264 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1336 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1340 + * int ndim_other) nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1342 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1343 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1344 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1345 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1347 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1348 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1349 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1350 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1336 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1358 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: + * + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + int __pyx_t_1; + + /* "View.MemoryView":1362 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) + */ + __pyx_t_1 = (__pyx_v_dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1363 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, # <<<<<<<<<<<<<< + * dst.strides, ndim, inc) + * + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1362 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) + */ + } + + /* "View.MemoryView":1358 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":1367 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + __Pyx_RefNannyDeclarations + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("refcount_objects_in_slice_with_gil", 0); + + /* "View.MemoryView":1370 + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1367 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1373 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("refcount_objects_in_slice", 0); + + /* "View.MemoryView":1377 + * cdef Py_ssize_t i + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1378 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":1379 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + __pyx_t_4 = (__pyx_v_inc != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":1380 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1379 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1382 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1378 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1384 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, inc) + * + */ + /*else*/ { + + /* "View.MemoryView":1385 + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, + * ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += strides[0] + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1387 + * ndim - 1, inc) + * + * data += strides[0] # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + (__pyx_v_strides[0])); + } + + /* "View.MemoryView":1373 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":1393 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1396 + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1397 + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, # <<<<<<<<<<<<<< + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1399 + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1393 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1403 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1407 + * size_t itemsize, void *item) nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1408 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1410 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1411 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1412 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1413 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1410 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1415 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1416 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, itemsize, item) + * data += stride + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1418 + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1403 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(2, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(2, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(2, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = NULL; + PyObject *__pyx_v___pyx_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 0); + + /* "(tree fragment)":2 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xb068931) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":3 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":4 + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_5) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 4, __pyx_L1_error) + + /* "(tree fragment)":2 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":5 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_6) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_INCREF(__pyx_v___pyx_type); + __Pyx_GIVEREF(__pyx_v___pyx_type); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v___pyx_type); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_7 = (__pyx_t_1 != 0); + if (__pyx_t_7) { + + /* "(tree fragment)":7 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 7, __pyx_L1_error) + __pyx_t_3 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":8 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 0); + + /* "(tree fragment)":10 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 10, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(2, 11, __pyx_L1_error) + } + __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(2, 11, __pyx_L1_error) + __pyx_t_4 = ((__pyx_t_3 > 1) != 0); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 11, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 != 0); + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":12 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 12, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (!__pyx_t_8) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8); __pyx_t_8 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_array___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + (*Py_TYPE(o)->tp_free)(o); +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_array_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_array_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._cutil.array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._cutil.Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_memoryview___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"is_c_contig", (PyCFunction)__pyx_memoryview_is_c_contig, METH_NOARGS, 0}, + {"is_f_contig", (PyCFunction)__pyx_memoryview_is_f_contig, METH_NOARGS, 0}, + {"copy", (PyCFunction)__pyx_memoryview_copy, METH_NOARGS, 0}, + {"copy_fortran", (PyCFunction)__pyx_memoryview_copy_fortran, METH_NOARGS, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._cutil.memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_memoryviewslice___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XDEC_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyObject *__pyx_getprop___pyx_memoryviewslice_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(o); +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets__memoryviewslice[] = { + {(char *)"base", __pyx_getprop___pyx_memoryviewslice_base, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib._cutil._memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + "Internal class for passing memoryview slices to Python", /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets__memoryviewslice, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec__cutil(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec__cutil}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "_cutil", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_AtomGroup_was_not_contiguous_fro, __pyx_k_AtomGroup_was_not_contiguous_fro, sizeof(__pyx_k_AtomGroup_was_not_contiguous_fro), 0, 0, 1, 0}, + {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_index_with_type_s, __pyx_k_Cannot_index_with_type_s, sizeof(__pyx_k_Cannot_index_with_type_s), 0, 0, 1, 0}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_k_Incompatible_checksums_s_vs_0xb0, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xb0), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 0, 1, 0}, + {&__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_k_Invalid_shape_in_axis_d_d, sizeof(__pyx_k_Invalid_shape_in_axis_d_d), 0, 0, 1, 0}, + {&__pyx_n_s_MDAnalysis, __pyx_k_MDAnalysis, sizeof(__pyx_k_MDAnalysis), 0, 0, 1, 1}, + {&__pyx_n_s_MDAnalysis_lib__cutil, __pyx_k_MDAnalysis_lib__cutil, sizeof(__pyx_k_MDAnalysis_lib__cutil), 0, 0, 1, 1}, + {&__pyx_kp_s_MDAnalysis_lib__cutil_pyx, __pyx_k_MDAnalysis_lib__cutil_pyx, sizeof(__pyx_k_MDAnalysis_lib__cutil_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_n_s_NoDataError, __pyx_k_NoDataError, sizeof(__pyx_k_NoDataError), 0, 0, 1, 1}, + {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_kp_s_One_or_more_dimensions_was_zero, __pyx_k_One_or_more_dimensions_was_zero, sizeof(__pyx_k_One_or_more_dimensions_was_zero), 0, 0, 1, 0}, + {&__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 0, 1, 0}, + {&__pyx_n_s_OverflowError, __pyx_k_OverflowError, sizeof(__pyx_k_OverflowError), 0, 0, 1, 1}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_kp_s_Reference_atom_not_in_atomgroup, __pyx_k_Reference_atom_not_in_atomgroup, sizeof(__pyx_k_Reference_atom_not_in_atomgroup), 0, 0, 1, 0}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_kp_s_The_atomgroup_is_required_to_hav, __pyx_k_The_atomgroup_is_required_to_hav, sizeof(__pyx_k_The_atomgroup_is_required_to_hav), 0, 0, 1, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_a, __pyx_k_a, sizeof(__pyx_k_a), 0, 0, 1, 1}, + {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1}, + {&__pyx_n_s_asarray, __pyx_k_asarray, sizeof(__pyx_k_asarray), 0, 0, 1, 1}, + {&__pyx_n_s_atom, __pyx_k_atom, sizeof(__pyx_k_atom), 0, 0, 1, 1}, + {&__pyx_n_s_atomgroup, __pyx_k_atomgroup, sizeof(__pyx_k_atomgroup), 0, 0, 1, 1}, + {&__pyx_n_s_atoms, __pyx_k_atoms, sizeof(__pyx_k_atoms), 0, 0, 1, 1}, + {&__pyx_n_s_atoms_view, __pyx_k_atoms_view, sizeof(__pyx_k_atoms_view), 0, 0, 1, 1}, + {&__pyx_n_s_b, __pyx_k_b, sizeof(__pyx_k_b), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_bonding, __pyx_k_bonding, sizeof(__pyx_k_bonding), 0, 0, 1, 1}, + {&__pyx_n_s_bondlist, __pyx_k_bondlist, sizeof(__pyx_k_bondlist), 0, 0, 1, 1}, + {&__pyx_n_s_bondmap, __pyx_k_bondmap, sizeof(__pyx_k_bondmap), 0, 0, 1, 1}, + {&__pyx_n_s_bonds, __pyx_k_bonds, sizeof(__pyx_k_bonds), 0, 0, 1, 1}, + {&__pyx_n_s_bonds_view, __pyx_k_bonds_view, sizeof(__pyx_k_bonds_view), 0, 0, 1, 1}, + {&__pyx_n_s_box, __pyx_k_box, sizeof(__pyx_k_box), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_n_s_dimensions, __pyx_k_dimensions, sizeof(__pyx_k_dimensions), 0, 0, 1, 1}, + {&__pyx_n_s_done, __pyx_k_done, sizeof(__pyx_k_done), 0, 0, 1, 1}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_find_fragments, __pyx_k_find_fragments, sizeof(__pyx_k_find_fragments), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32, __pyx_k_float32, sizeof(__pyx_k_float32), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_frag_done, __pyx_k_frag_done, sizeof(__pyx_k_frag_done), 0, 0, 1, 1}, + {&__pyx_n_s_frag_todo, __pyx_k_frag_todo, sizeof(__pyx_k_frag_todo), 0, 0, 1, 1}, + {&__pyx_n_s_frags, __pyx_k_frags, sizeof(__pyx_k_frags), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_int32, __pyx_k_int32, sizeof(__pyx_k_int32), 0, 0, 1, 1}, + {&__pyx_n_s_int64, __pyx_k_int64, sizeof(__pyx_k_int64), 0, 0, 1, 1}, + {&__pyx_n_s_inverse_box, __pyx_k_inverse_box, sizeof(__pyx_k_inverse_box), 0, 0, 1, 1}, + {&__pyx_n_s_is_monotonic, __pyx_k_is_monotonic, sizeof(__pyx_k_is_monotonic), 0, 0, 1, 1}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_ix, __pyx_k_ix, sizeof(__pyx_k_ix), 0, 0, 1, 1}, + {&__pyx_n_s_ix_to_rel, __pyx_k_ix_to_rel, sizeof(__pyx_k_ix_to_rel), 0, 0, 1, 1}, + {&__pyx_n_s_ix_view, __pyx_k_ix_view, sizeof(__pyx_k_ix_view), 0, 0, 1, 1}, + {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_make_whole, __pyx_k_make_whole, sizeof(__pyx_k_make_whole), 0, 0, 1, 1}, + {&__pyx_n_s_mdamath, __pyx_k_mdamath, sizeof(__pyx_k_mdamath), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_n_values, __pyx_k_n_values, sizeof(__pyx_k_n_values), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_natoms, __pyx_k_natoms, sizeof(__pyx_k_natoms), 0, 0, 1, 1}, + {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, + {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_n_s_newpos, __pyx_k_newpos, sizeof(__pyx_k_newpos), 0, 0, 1, 1}, + {&__pyx_n_s_nloops, __pyx_k_nloops, sizeof(__pyx_k_nloops), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, + {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_oldpos, __pyx_k_oldpos, sizeof(__pyx_k_oldpos), 0, 0, 1, 1}, + {&__pyx_n_s_ortho, __pyx_k_ortho, sizeof(__pyx_k_ortho), 0, 0, 1, 1}, + {&__pyx_n_s_other, __pyx_k_other, sizeof(__pyx_k_other), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_positions, __pyx_k_positions, sizeof(__pyx_k_positions), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_getbuffer, __pyx_k_pyx_getbuffer, sizeof(__pyx_k_pyx_getbuffer), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_ref, __pyx_k_ref, sizeof(__pyx_k_ref), 0, 0, 1, 1}, + {&__pyx_n_s_reference_atom, __pyx_k_reference_atom, sizeof(__pyx_k_reference_atom), 0, 0, 1, 1}, + {&__pyx_n_s_refpoints, __pyx_k_refpoints, sizeof(__pyx_k_refpoints), 0, 0, 1, 1}, + {&__pyx_n_s_result, __pyx_k_result, sizeof(__pyx_k_result), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_sort, __pyx_k_sort, sizeof(__pyx_k_sort), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_this_frag, __pyx_k_this_frag, sizeof(__pyx_k_this_frag), 0, 0, 1, 1}, + {&__pyx_n_s_to_indices, __pyx_k_to_indices, sizeof(__pyx_k_to_indices), 0, 0, 1, 1}, + {&__pyx_n_s_todo, __pyx_k_todo, sizeof(__pyx_k_todo), 0, 0, 1, 1}, + {&__pyx_n_s_tri_box, __pyx_k_tri_box, sizeof(__pyx_k_tri_box), 0, 0, 1, 1}, + {&__pyx_n_s_triclinic_vectors, __pyx_k_triclinic_vectors, sizeof(__pyx_k_triclinic_vectors), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_n_s_unique_int_1d, __pyx_k_unique_int_1d, sizeof(__pyx_k_unique_int_1d), 0, 0, 1, 1}, + {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_values, __pyx_k_values, sizeof(__pyx_k_values), 0, 0, 1, 1}, + {&__pyx_n_s_vec, __pyx_k_vec, sizeof(__pyx_k_vec), 0, 0, 1, 1}, + {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 78, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 197, __pyx_L1_error) + __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 222, __pyx_L1_error) + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 810, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 1000, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(2, 81, __pyx_L1_error) + __pyx_builtin_OverflowError = __Pyx_GetBuiltinName(__pyx_n_s_OverflowError); if (!__pyx_builtin_OverflowError) __PYX_ERR(2, 81, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(2, 84, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(2, 94, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(2, 147, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(2, 399, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(2, 608, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "MDAnalysis/lib/_cutil.pyx":187 + * + * # map of global indices to local indices + * ix_view = atomgroup.ix[:] # <<<<<<<<<<<<<< + * natoms = atomgroup.ix.shape[0] + * for i in range(natoms): + */ + __pyx_slice_ = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice_)) __PYX_ERR(0, 187, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice_); + __Pyx_GIVEREF(__pyx_slice_); + + /* "MDAnalysis/lib/_cutil.pyx":197 + * # Sanity check + * if not reference_atom in atomgroup: + * raise ValueError("Reference atom not in atomgroup") # <<<<<<<<<<<<<< + * ref = ix_to_rel[reference_atom.ix] + * + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_Reference_atom_not_in_atomgroup); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 197, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "MDAnalysis/lib/_cutil.pyx":204 + * for i in range(3): + * if box[i] == 0.0: + * raise ValueError("One or more dimensions was zero. " # <<<<<<<<<<<<<< + * "You can set dimensions using 'atomgroup.dimensions='") + * + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_One_or_more_dimensions_was_zero); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 204, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "MDAnalysis/lib/_cutil.pyx":223 + * bonds = atomgroup.bonds.to_indices() + * except (AttributeError, NoDataError): + * raise NoDataError("The atomgroup is required to have bonds") # <<<<<<<<<<<<<< + * for i in range(bonds.shape[0]): + * atom = bonds[i, 0] + */ + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_The_atomgroup_is_required_to_hav); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "MDAnalysis/lib/_cutil.pyx":275 + * + * if refpoints.size() < natoms: + * raise ValueError("AtomGroup was not contiguous from bonds, process failed") # <<<<<<<<<<<<<< + * else: + * atomgroup.positions = newpos + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_AtomGroup_was_not_contiguous_fro); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 275, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 229, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 1000, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(1, 1006, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 1012, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "View.MemoryView":132 + * + * if not self.ndim: + * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(2, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + + /* "View.MemoryView":135 + * + * if itemsize <= 0: + * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "View.MemoryView":138 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_n_s_ASCII); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(2, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "View.MemoryView":147 + * + * if not self._shape: + * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "View.MemoryView":175 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(2, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(2, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "View.MemoryView":413 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(2, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "View.MemoryView":490 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(2, 490, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + + /* "View.MemoryView":515 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(2, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); + + /* "View.MemoryView":565 + * if self.view.strides == NULL: + * + * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(2, 565, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + + /* "View.MemoryView":572 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__27 = PyTuple_New(1); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + PyTuple_SET_ITEM(__pyx_tuple__27, 0, __pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_tuple__27); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__29 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + + /* "View.MemoryView":677 + * if item is Ellipsis: + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * else: + */ + __pyx_slice__30 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__30)) __PYX_ERR(2, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__30); + __Pyx_GIVEREF(__pyx_slice__30); + + /* "View.MemoryView":680 + * seen_ellipsis = True + * else: + * result.append(slice(None)) # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_slice__31 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__31)) __PYX_ERR(2, 680, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__31); + __Pyx_GIVEREF(__pyx_slice__31); + + /* "View.MemoryView":691 + * nslices = ndim - len(result) + * if nslices: + * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< + * + * return have_slices or nslices, tuple(result) + */ + __pyx_slice__32 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__32)) __PYX_ERR(2, 691, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__32); + __Pyx_GIVEREF(__pyx_slice__32); + + /* "View.MemoryView":698 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__33 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(2, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__33); + __Pyx_GIVEREF(__pyx_tuple__33); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__34); + __Pyx_GIVEREF(__pyx_tuple__34); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__35 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__35); + __Pyx_GIVEREF(__pyx_tuple__35); + + /* "MDAnalysis/lib/_cutil.pyx":50 + * @cython.boundscheck(False) # turn off bounds-checking for entire function + * @cython.wraparound(False) # turn off negative index wrapping for entire function + * def unique_int_1d(np.int64_t[:] values): # <<<<<<<<<<<<<< + * """Find the unique elements of a 1D array of integers. + * + */ + __pyx_tuple__36 = PyTuple_Pack(7, __pyx_n_s_values, __pyx_n_s_values, __pyx_n_s_is_monotonic, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_n_values, __pyx_n_s_result); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__36); + __Pyx_GIVEREF(__pyx_tuple__36); + __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(1, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib__cutil_pyx, __pyx_n_s_unique_int_1d, 50, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 50, __pyx_L1_error) + + /* "MDAnalysis/lib/_cutil.pyx":105 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def make_whole(atomgroup, reference_atom=None): # <<<<<<<<<<<<<< + * """Move all atoms in a single molecule so that bonds don't split over images + * + */ + __pyx_tuple__38 = PyTuple_Pack(23, __pyx_n_s_atomgroup, __pyx_n_s_reference_atom, __pyx_n_s_refpoints, __pyx_n_s_todo, __pyx_n_s_done, __pyx_n_s_i, __pyx_n_s_nloops, __pyx_n_s_ref, __pyx_n_s_atom, __pyx_n_s_other, __pyx_n_s_natoms, __pyx_n_s_ix_to_rel, __pyx_n_s_bonding, __pyx_n_s_bonds, __pyx_n_s_oldpos, __pyx_n_s_newpos, __pyx_n_s_ortho, __pyx_n_s_box, __pyx_n_s_tri_box, __pyx_n_s_inverse_box, __pyx_n_s_vec, __pyx_n_s_ix_view, __pyx_n_s_triclinic_vectors); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 105, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); + __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(2, 0, 23, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib__cutil_pyx, __pyx_n_s_make_whole, 105, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 105, __pyx_L1_error) + + /* "MDAnalysis/lib/_cutil.pyx":322 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def find_fragments(atoms, bondlist): # <<<<<<<<<<<<<< + * """Calculate distinct fragments from nodes (atom indices) and edges (pairs + * of atom indices). + */ + __pyx_tuple__40 = PyTuple_Pack(13, __pyx_n_s_atoms, __pyx_n_s_bondlist, __pyx_n_s_bondmap, __pyx_n_s_todo, __pyx_n_s_frag_todo, __pyx_n_s_frag_done, __pyx_n_s_this_frag, __pyx_n_s_i, __pyx_n_s_a, __pyx_n_s_b, __pyx_n_s_atoms_view, __pyx_n_s_bonds_view, __pyx_n_s_frags); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 322, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__40); + __Pyx_GIVEREF(__pyx_tuple__40); + __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(2, 0, 13, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib__cutil_pyx, __pyx_n_s_find_fragments, 322, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 322, __pyx_L1_error) + + /* "View.MemoryView":285 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__42 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(2, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__42); + __Pyx_GIVEREF(__pyx_tuple__42); + + /* "View.MemoryView":286 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__43 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(2, 286, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__43); + __Pyx_GIVEREF(__pyx_tuple__43); + + /* "View.MemoryView":287 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__44 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(2, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__44); + __Pyx_GIVEREF(__pyx_tuple__44); + + /* "View.MemoryView":290 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__45 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(2, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__45); + __Pyx_GIVEREF(__pyx_tuple__45); + + /* "View.MemoryView":291 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__46 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(2, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__46); + __Pyx_GIVEREF(__pyx_tuple__46); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_tuple__47 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__47); + __Pyx_GIVEREF(__pyx_tuple__47); + __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__47, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_modinit_global_init_code(void); /*proto*/ +static int __Pyx_modinit_variable_export_code(void); /*proto*/ +static int __Pyx_modinit_function_export_code(void); /*proto*/ +static int __Pyx_modinit_type_init_code(void); /*proto*/ +static int __Pyx_modinit_type_import_code(void); /*proto*/ +static int __Pyx_modinit_variable_import_code(void); /*proto*/ +static int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + if (__Pyx_ExportFunction("_dot", (void (*)(void))__pyx_f_10MDAnalysis_3lib_6_cutil__dot, "float (float *, float *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ExportFunction("_cross", (void (*)(void))__pyx_f_10MDAnalysis_3lib_6_cutil__cross, "void (float *, float *, float *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ExportFunction("_norm", (void (*)(void))__pyx_f_10MDAnalysis_3lib_6_cutil__norm, "float (float *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 104, __pyx_L1_error) + __pyx_type___pyx_array.tp_print = 0; + if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(2, 104, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 104, __pyx_L1_error) + __pyx_array_type = &__pyx_type___pyx_array; + if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 278, __pyx_L1_error) + __pyx_type___pyx_MemviewEnum.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_MemviewEnum.tp_dictoffset && __pyx_type___pyx_MemviewEnum.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_MemviewEnum.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 278, __pyx_L1_error) + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 329, __pyx_L1_error) + __pyx_type___pyx_memoryview.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryview.tp_dictoffset && __pyx_type___pyx_memoryview.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_memoryview.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(2, 329, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 329, __pyx_L1_error) + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_type___pyx_memoryviewslice.tp_base = __pyx_memoryview_type; + if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 960, __pyx_L1_error) + __pyx_type___pyx_memoryviewslice.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryviewslice.tp_dictoffset && __pyx_type___pyx_memoryviewslice.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_memoryviewslice.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(2, 960, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 960, __pyx_L1_error) + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(3, 9, __pyx_L1_error) + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) __PYX_ERR(1, 164, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) __PYX_ERR(1, 186, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) __PYX_ERR(1, 190, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) __PYX_ERR(1, 199, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) __PYX_ERR(1, 872, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION < 3 +#ifdef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC void +#else +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#endif +#else +#ifdef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#endif +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC init_cutil(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC init_cutil(void) +#else +__Pyx_PyMODINIT_FUNC PyInit__cutil(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit__cutil(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + result = PyDict_SetItemString(moddict, to_name, value); + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__") < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static int __pyx_pymod_exec__cutil(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + static PyThread_type_lock __pyx_t_3[8]; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m && __pyx_m == __pyx_pyinit_module) return 0; + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__cutil(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("_cutil", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_MDAnalysis__lib___cutil) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "MDAnalysis.lib._cutil")) { + if (unlikely(PyDict_SetItemString(modules, "MDAnalysis.lib._cutil", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + if (unlikely(__Pyx_modinit_function_export_code() != 0)) goto __pyx_L1_error; + if (unlikely(__Pyx_modinit_type_init_code() != 0)) goto __pyx_L1_error; + if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "MDAnalysis/lib/_cutil.pyx":25 + * + * import cython + * import numpy as np # <<<<<<<<<<<<<< + * cimport numpy as np + * from libc.math cimport sqrt + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":29 + * from libc.math cimport sqrt + * + * from MDAnalysis import NoDataError # <<<<<<<<<<<<<< + * + * from libcpp.set cimport set as cset + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_NoDataError); + __Pyx_GIVEREF(__pyx_n_s_NoDataError); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_NoDataError); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_MDAnalysis, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_NoDataError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NoDataError, __pyx_t_1) < 0) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":37 + * + * + * __all__ = ['unique_int_1d', 'make_whole', 'find_fragments'] # <<<<<<<<<<<<<< + * + * cdef extern from "calc_distances.h": + */ + __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_unique_int_1d); + __Pyx_GIVEREF(__pyx_n_s_unique_int_1d); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_unique_int_1d); + __Pyx_INCREF(__pyx_n_s_make_whole); + __Pyx_GIVEREF(__pyx_n_s_make_whole); + PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_make_whole); + __Pyx_INCREF(__pyx_n_s_find_fragments); + __Pyx_GIVEREF(__pyx_n_s_find_fragments); + PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_find_fragments); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_t_2) < 0) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":50 + * @cython.boundscheck(False) # turn off bounds-checking for entire function + * @cython.wraparound(False) # turn off negative index wrapping for entire function + * def unique_int_1d(np.int64_t[:] values): # <<<<<<<<<<<<<< + * """Find the unique elements of a 1D array of integers. + * + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6_cutil_1unique_int_1d, NULL, __pyx_n_s_MDAnalysis_lib__cutil); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_unique_int_1d, __pyx_t_2) < 0) __PYX_ERR(0, 50, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":105 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def make_whole(atomgroup, reference_atom=None): # <<<<<<<<<<<<<< + * """Move all atoms in a single molecule so that bonds don't split over images + * + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6_cutil_3make_whole, NULL, __pyx_n_s_MDAnalysis_lib__cutil); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 105, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_make_whole, __pyx_t_2) < 0) __PYX_ERR(0, 105, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":322 + * @cython.boundscheck(False) + * @cython.wraparound(False) + * def find_fragments(atoms, bondlist): # <<<<<<<<<<<<<< + * """Calculate distinct fragments from nodes (atom indices) and edges (pairs + * of atom indices). + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6_cutil_5find_fragments, NULL, __pyx_n_s_MDAnalysis_lib__cutil); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 322, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_find_fragments, __pyx_t_2) < 0) __PYX_ERR(0, 322, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/_cutil.pyx":1 + * # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- # <<<<<<<<<<<<<< + * # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + * # + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":208 + * info.obj = self + * + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __pyx_t_2 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_2) < 0) __PYX_ERR(2, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":285 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__42, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":286 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__43, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 286, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":287 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__44, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":290 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__45, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":291 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__46, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":315 + * + * DEF THREAD_LOCKS_PREALLOCATED = 8 + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":316 + * DEF THREAD_LOCKS_PREALLOCATED = 8 + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_3[0] = PyThread_allocate_lock(); + __pyx_t_3[1] = PyThread_allocate_lock(); + __pyx_t_3[2] = PyThread_allocate_lock(); + __pyx_t_3[3] = PyThread_allocate_lock(); + __pyx_t_3[4] = PyThread_allocate_lock(); + __pyx_t_3[5] = PyThread_allocate_lock(); + __pyx_t_3[6] = PyThread_allocate_lock(); + __pyx_t_3[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_3, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":544 + * info.obj = self + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 544, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_2) < 0) __PYX_ERR(2, 544, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_memoryview_type); + + /* "View.MemoryView":990 + * return self.from_object + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_2) < 0) __PYX_ERR(2, 990, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_2) < 0) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init MDAnalysis.lib._cutil", 0, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init MDAnalysis.lib._cutil"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* GetModuleGlobalName */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + if (likely(result)) { + Py_INCREF(result); + } else if (unlikely(PyErr_Occurred())) { + result = NULL; + } else { +#else + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +/* PyObjectCall */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* MemviewSliceInit */ + static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (!buf) { + PyErr_SetString(PyExc_ValueError, + "buf is NULL."); + goto fail; + } else if (memviewslice->memview || memviewslice->data) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + int first_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (!memview || (PyObject *) memview == Py_None) + return; + if (__pyx_get_slice_count(memview) < 0) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + first_time = __pyx_add_acquisition_count(memview) == 0; + if (first_time) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } +} +static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + int last_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (!memview ) { + return; + } else if ((PyObject *) memview == Py_None) { + memslice->memview = NULL; + return; + } + if (__pyx_get_slice_count(memview) <= 0) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + last_time = __pyx_sub_acquisition_count(memview) == 1; + memslice->data = NULL; + if (last_time) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + memslice->memview = NULL; + } +} + +/* PyCFunctionFastCall */ + #if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ + #if CYTHON_FAST_PYCALL +#include "frameobject.h" +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = f->f_localsplus; + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* PyErrFetchRestore */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* WriteUnraisableException */ + static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, + CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, + int full_traceback, CYTHON_UNUSED int nogil) { + PyObject *old_exc, *old_val, *old_tb; + PyObject *ctx; + __Pyx_PyThreadState_declare +#ifdef WITH_THREAD + PyGILState_STATE state; + if (nogil) + state = PyGILState_Ensure(); +#ifdef _MSC_VER + else state = (PyGILState_STATE)-1; +#endif +#endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); + if (full_traceback) { + Py_XINCREF(old_exc); + Py_XINCREF(old_val); + Py_XINCREF(old_tb); + __Pyx_ErrRestore(old_exc, old_val, old_tb); + PyErr_PrintEx(1); + } + #if PY_MAJOR_VERSION < 3 + ctx = PyString_FromString(name); + #else + ctx = PyUnicode_FromString(name); + #endif + __Pyx_ErrRestore(old_exc, old_val, old_tb); + if (!ctx) { + PyErr_WriteUnraisable(Py_None); + } else { + PyErr_WriteUnraisable(ctx); + Py_DECREF(ctx); + } +#ifdef WITH_THREAD + if (nogil) + PyGILState_Release(state); +#endif +} + +/* RaiseDoubleKeywords */ + static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ + static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* RaiseArgTupleInvalid */ + static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* SliceObject */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + PyErr_Format(PyExc_TypeError, + "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); +bad: + return NULL; +} + +/* GetItemInt */ + static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* RaiseException */ + #if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ + static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* PyObjectCallNoArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, NULL, 0); + } +#endif +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || __Pyx_TypeCheck(func, __pyx_CyFunctionType))) { +#else + if (likely(PyCFunction_Check(func))) { +#endif + if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { + return __Pyx_PyObject_CallMethO(func, NULL); + } + } + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); +} +#endif + +/* SaveResetException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if PY_VERSION_HEX >= 0x030700A3 + *type = tstate->exc_state.exc_type; + *value = tstate->exc_state.exc_value; + *tb = tstate->exc_state.exc_traceback; + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + #endif + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = type; + tstate->exc_state.exc_value = value; + tstate->exc_state.exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; icurexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = local_type; + tstate->exc_state.exc_value = local_value; + tstate->exc_state.exc_traceback = local_tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyObjectSetAttrStr */ + #if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_setattro)) + return tp->tp_setattro(obj, attr_name, value); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_setattr)) + return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value); +#endif + return PyObject_SetAttr(obj, attr_name, value); +} +#endif + +/* DictGetItem */ + #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) + PyErr_SetObject(PyExc_KeyError, args); + Py_XDECREF(args); + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* RaiseTooManyValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ + static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +/* PyErrExceptionMatches */ + #if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; icurexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + if (unlikely(PyTuple_Check(err))) + return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", + name, type->tp_name, Py_TYPE(obj)->tp_name); + return 0; +} + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* None */ + static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { + Py_ssize_t q = a / b; + Py_ssize_t r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* GetAttr */ + static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* ObjectGetItem */ + #if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { + PyObject *runerr; + Py_ssize_t key_value; + PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; + if (unlikely(!(m && m->sq_item))) { + PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); + return NULL; + } + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { + PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; + if (likely(m && m->mp_subscript)) { + return m->mp_subscript(obj, key); + } + return __Pyx_PyObject_GetIndex(obj, key); +} +#endif + +/* decode_c_string */ + static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { + Py_ssize_t length; + if (unlikely((start < 0) | (stop < 0))) { + size_t slen = strlen(cstring); + if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, + "c-string too long to convert to Python"); + return NULL; + } + length = (Py_ssize_t) slen; + if (start < 0) { + start += length; + if (start < 0) + start = 0; + } + if (stop < 0) + stop += length; + } + length = stop - start; + if (unlikely(length <= 0)) + return PyUnicode_FromUnicode(NULL, 0); + cstring += start; + if (decode_func) { + return decode_func(cstring, length, errors); + } else { + return PyUnicode_Decode(cstring, length, encoding, errors); + } +} + +/* GetAttr3 */ + static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r = __Pyx_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +} + +/* SwapException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = *type; + tstate->exc_state.exc_value = *value; + tstate->exc_state.exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + x = (long)((unsigned long)a + b); + if (likely((x^a) >= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + const digit* digits = ((PyLongObject*)op1)->ob_digit; + const Py_ssize_t size = Py_SIZE(op1); + if (likely(__Pyx_sst_abs(size) <= 1)) { + a = likely(size) ? digits[0] : 0; + if (size == -1) a = -a; + } else { + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; + double a = PyFloat_AS_DOUBLE(op1); + double result; + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* None */ + static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* None */ + static CYTHON_INLINE long __Pyx_div_long(long a, long b) { + long q = a / b; + long r = a - q*b; + q -= ((r != 0) & ((r ^ b) < 0)); + return q; +} + +/* HasAttr */ + static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (unlikely(!r)) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'%.50s' object has no attribute '%U'", + tp->tp_name, attr_name); +#else + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(attr_name)); +#endif + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* SetVTable */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX >= 0x02070000 + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#else + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* SetupReduce */ + static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; +#else + if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; +#endif +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; + setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto GOOD; +BAD: + if (!PyErr_Occurred()) + PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); + ret = -1; +GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + use_cline = __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback); + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (PyObject_Not(use_cline) != 0) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + else if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* Capsule */ + static CYTHON_INLINE PyObject * +__pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) +{ + PyObject *cobj; +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(p, sig, NULL); +#else + cobj = PyCObject_FromVoidPtr(p, NULL); +#endif + return cobj; +} + +/* IsLittleEndian */ + static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ + static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t < '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparseable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static PyObject * +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number; + int ndim = ctx->head->field->type->ndim; +; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) + return PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + if (*ts != ',' && *ts != ')') + return PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + if (*ts == ',') ts++; + i++; + } + if (i != ndim) + return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return NULL; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return Py_None; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if (ctx->enc_type == *ts && got_Z == ctx->is_complex && + ctx->enc_packmode == ctx->new_packmode) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (buf->strides[dim] != sizeof(void *)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (buf->strides[dim] != buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (stride < buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (spec & (__Pyx_MEMVIEW_PTR)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (buf->suboffsets) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) +{ + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (buf->suboffsets && buf->suboffsets[dim] >= 0) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (!buf->suboffsets || (buf->suboffsets && buf->suboffsets[dim] < 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) + { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (buf->ndim != ndim) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if ((unsigned) buf->itemsize != dtype->size) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (!__pyx_check_strides(buf, i, ndim, spec)) + goto fail; + if (!__pyx_check_suboffsets(buf, i, ndim, spec)) + goto fail; + } + if (buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_5numpy_int64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 1, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int64) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int64) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(npy_int64), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* MemviewDtypeToObject */ + static CYTHON_INLINE PyObject *__pyx_memview_get_nn___pyx_t_5numpy_int64_t(const char *itemp) { + return (PyObject *) __Pyx_PyInt_From_npy_int64(*(__pyx_t_5numpy_int64_t *) itemp); +} +static CYTHON_INLINE int __pyx_memview_set_nn___pyx_t_5numpy_int64_t(const char *itemp, PyObject *obj) { + __pyx_t_5numpy_int64_t value = __Pyx_PyInt_As_npy_int64(obj); + if ((value == ((npy_int64)-1)) && PyErr_Occurred()) + return 0; + *(__pyx_t_5numpy_int64_t *) itemp = value; + return 1; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* MemviewDtypeToObject */ + static CYTHON_INLINE PyObject *__pyx_memview_get_float(const char *itemp) { + return (PyObject *) PyFloat_FromDouble(*(float *) itemp); +} +static CYTHON_INLINE int __pyx_memview_set_float(const char *itemp, PyObject *obj) { + float value = __pyx_PyFloat_AsFloat(obj); + if ((value == (float)-1) && PyErr_Occurred()) + return 0; + *(float *) itemp = value; + return 1; +} + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = 1.0 / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = 1.0 / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0, -1); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = 1.0 / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = 1.0 / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0, -1); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); + } +} + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (from_mvs->suboffsets[i] >= 0) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* CIntFromPy */ + static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *x) { + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(npy_int64) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (npy_int64) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_int64) 0; + case 1: __PYX_VERIFY_RETURN_INT(npy_int64, digit, digits[0]) + case 2: + if (8 * sizeof(npy_int64) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) >= 2 * PyLong_SHIFT) { + return (npy_int64) (((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(npy_int64) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) >= 3 * PyLong_SHIFT) { + return (npy_int64) (((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(npy_int64) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) >= 4 * PyLong_SHIFT) { + return (npy_int64) (((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_int64) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(npy_int64) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_int64) 0; + case -1: __PYX_VERIFY_RETURN_INT(npy_int64, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(npy_int64, digit, +digits[0]) + case -2: + if (8 * sizeof(npy_int64) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT) { + return (npy_int64) (((npy_int64)-1)*(((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(npy_int64) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT) { + return (npy_int64) ((((((npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(npy_int64) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT) { + return (npy_int64) (((npy_int64)-1)*(((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(npy_int64) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT) { + return (npy_int64) ((((((((npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(npy_int64) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT) { + return (npy_int64) (((npy_int64)-1)*(((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(npy_int64) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_int64, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_int64) - 1 > 4 * PyLong_SHIFT) { + return (npy_int64) ((((((((((npy_int64)digits[3]) << PyLong_SHIFT) | (npy_int64)digits[2]) << PyLong_SHIFT) | (npy_int64)digits[1]) << PyLong_SHIFT) | (npy_int64)digits[0]))); + } + } + break; + } +#endif + if (sizeof(npy_int64) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_int64, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + npy_int64 val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (npy_int64) -1; + } + } else { + npy_int64 val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (npy_int64) -1; + val = __Pyx_PyInt_As_npy_int64(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to npy_int64"); + return (npy_int64) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to npy_int64"); + return (npy_int64) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { + const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(size_t) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (size_t) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { + return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { + return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { + return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (size_t) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(size_t) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) + case -2: + if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + } +#endif + if (sizeof(size_t) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + size_t val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (size_t) -1; + } + } else { + size_t val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (size_t) -1; + val = __Pyx_PyInt_As_size_t(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to size_t"); + return (size_t) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to size_t"); + return (size_t) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { + const char neg_one = (char) -1, const_zero = (char) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(char) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case 1: __PYX_VERIFY_RETURN_INT(char, digit, digits[0]) + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 2 * PyLong_SHIFT) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 3 * PyLong_SHIFT) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 4 * PyLong_SHIFT) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(char) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case -1: __PYX_VERIFY_RETURN_INT(char, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(char, digit, +digits[0]) + case -2: + if (8 * sizeof(char) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } +#endif + if (sizeof(char) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_Py_ssize_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 1, + &__Pyx_TypeInfo_Py_ssize_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_float(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 1, + &__Pyx_TypeInfo_float, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_int(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_int, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_float(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_float, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int32_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CheckBinaryVersion */ + static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* FunctionExport */ + static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { + PyObject *d = 0; + PyObject *cobj = 0; + union { + void (*fp)(void); + void *p; + } tmp; + d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__"); + if (!d) { + PyErr_Clear(); + d = PyDict_New(); + if (!d) + goto bad; + Py_INCREF(d); + if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0) + goto bad; + } + tmp.fp = f; +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(tmp.p, sig, 0); +#else + cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0); +#endif + if (!cobj) + goto bad; + if (PyDict_SetItemString(d, name, cobj) < 0) + goto bad; + Py_DECREF(cobj); + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(cobj); + Py_XDECREF(d); + return -1; +} + +/* ModuleImport */ + #ifndef __PYX_HAVE_RT_ImportModule +#define __PYX_HAVE_RT_ImportModule +static PyObject *__Pyx_ImportModule(const char *name) { + PyObject *py_name = 0; + PyObject *py_module = 0; + py_name = __Pyx_PyIdentifier_FromString(name); + if (!py_name) + goto bad; + py_module = PyImport_Import(py_name); + Py_DECREF(py_name); + return py_module; +bad: + Py_XDECREF(py_name); + return 0; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, + size_t size, int strict) +{ + PyObject *py_module = 0; + PyObject *result = 0; + PyObject *py_name = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + py_module = __Pyx_ImportModule(module_name); + if (!py_module) + goto bad; + py_name = __Pyx_PyIdentifier_FromString(class_name); + if (!py_name) + goto bad; + result = PyObject_GetAttr(py_module, py_name); + Py_DECREF(py_name); + py_name = 0; + Py_DECREF(py_module); + py_module = 0; + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (!strict && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + else if ((size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +/* InitStrings */ + static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/package/MDAnalysis/lib/c_distances.c b/package/MDAnalysis/lib/c_distances.c index bd1ee7124b7..2a2063cc501 100644 --- a/package/MDAnalysis/lib/c_distances.c +++ b/package/MDAnalysis/lib/c_distances.c @@ -1,11 +1,11 @@ -/* Generated by Cython 0.28.2 */ +/* Generated by Cython 0.28.5 */ /* BEGIN: Cython Metadata { "distutils": { "depends": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h", "MDAnalysis/lib/include/calc_distances.h" ], "extra_compile_args": [ @@ -15,7 +15,7 @@ "-funroll-loops" ], "include_dirs": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include", "MDAnalysis/lib/include" ], "libraries": [ @@ -37,7 +37,7 @@ END: Cython Metadata */ #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else -#define CYTHON_ABI "0_28_2" +#define CYTHON_ABI "0_28_5" #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof @@ -483,6 +483,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -684,7 +685,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -792,7 +793,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -939,7 +940,7 @@ typedef struct { } __Pyx_BufFmt_Context; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -948,7 +949,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -957,7 +958,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -966,7 +967,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -975,7 +976,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -984,7 +985,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -993,7 +994,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -1002,7 +1003,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -1011,7 +1012,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -1020,7 +1021,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -1029,7 +1030,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -1038,7 +1039,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -1047,7 +1048,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -1056,7 +1057,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -1065,7 +1066,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -1074,7 +1075,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1083,7 +1084,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1092,7 +1093,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1101,7 +1102,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1110,7 +1111,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1119,7 +1120,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1158,7 +1159,7 @@ struct __pyx_MemviewEnum_obj; struct __pyx_memoryview_obj; struct __pyx_memoryviewslice_obj; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1167,7 +1168,7 @@ struct __pyx_memoryviewslice_obj; */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1176,7 +1177,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1185,7 +1186,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -1414,6 +1415,9 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam /* None.proto */ static CYTHON_INLINE long __Pyx_div_long(long, long); +/* BufferIndexError.proto */ +static void __Pyx_RaiseBufferIndexError(int axis); + /* MemviewSliceInit.proto */ #define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d #define __Pyx_MEMVIEW_DIRECT 1 @@ -1827,6 +1831,36 @@ static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, /* Capsule.proto */ static CYTHON_INLINE PyObject *__pyx_capsule_create(void *p, const char *sig); +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_float(PyObject *, int writable_flag); + +/* MemviewDtypeToObject.proto */ +static CYTHON_INLINE PyObject *__pyx_memview_get_float(const char *itemp); +static CYTHON_INLINE int __pyx_memview_set_float(const char *itemp, PyObject *obj); + /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); @@ -1950,29 +1984,6 @@ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); -/* IsLittleEndian.proto */ -static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); - -/* BufferFormatCheck.proto */ -static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); -static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, - __Pyx_BufFmt_StackElem* stack, - __Pyx_TypeInfo* type); - -/* TypeInfoCompare.proto */ -static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); - -/* MemviewSliceValidateAndInit.proto */ -static int __Pyx_ValidateAndInit_memviewslice( - int *axes_specs, - int c_or_f_flag, - int buf_flags, - int ndim, - __Pyx_TypeInfo *dtype, - __Pyx_BufFmt_StackElem stack[], - __Pyx_memviewslice *memviewslice, - PyObject *original_obj); - /* ObjectToMemviewSlice.proto */ static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(PyObject *, int writable_flag); @@ -2404,7 +2415,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_4calc_distance_array_t static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_6calc_self_distance_array(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_ref, PyArrayObject *__pyx_v_result); /* proto */ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_8calc_self_distance_array_ortho(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_ref, PyArrayObject *__pyx_v_box, PyArrayObject *__pyx_v_result); /* proto */ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_10calc_self_distance_array_triclinic(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_ref, PyArrayObject *__pyx_v_box, PyArrayObject *__pyx_v_result); /* proto */ -static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_12coord_transform(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_coords, PyArrayObject *__pyx_v_box); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_12coord_transform(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_box); /* proto */ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_14calc_bond_distance(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_coords1, PyArrayObject *__pyx_v_coords2, PyArrayObject *__pyx_v_results); /* proto */ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_16calc_bond_distance_ortho(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_coords1, PyArrayObject *__pyx_v_coords2, PyArrayObject *__pyx_v_box, PyArrayObject *__pyx_v_results); /* proto */ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_18calc_bond_distance_triclinic(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_coords1, PyArrayObject *__pyx_v_coords2, PyArrayObject *__pyx_v_box, PyArrayObject *__pyx_v_results); /* proto */ @@ -3388,17 +3399,17 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_10calc_self_distance_a /* "MDAnalysis/lib/c_distances.pyx":128 * result.data, distnum) * - * def coord_transform(numpy.ndarray coords, # <<<<<<<<<<<<<< - * numpy.ndarray box): - * cdef int numcoords + * def coord_transform(float[:,:] coords, # <<<<<<<<<<<<<< + * float[:,:] box): + * cdef int numcoords, size */ /* Python wrapper */ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_13coord_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_11c_distances_13coord_transform = {"coord_transform", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_11c_distances_13coord_transform, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_13coord_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyArrayObject *__pyx_v_coords = 0; - PyArrayObject *__pyx_v_box = 0; + __Pyx_memviewslice __pyx_v_coords = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_box = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("coord_transform (wrapper)", 0); @@ -3437,8 +3448,8 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_13coord_transform(PyOb values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } - __pyx_v_coords = ((PyArrayObject *)values[0]); - __pyx_v_box = ((PyArrayObject *)values[1]); + __pyx_v_coords = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_coords.memview)) __PYX_ERR(0, 128, __pyx_L3_error) + __pyx_v_box = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_box.memview)) __PYX_ERR(0, 129, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; @@ -3448,60 +3459,153 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_13coord_transform(PyOb __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords), __pyx_ptype_5numpy_ndarray, 1, "coords", 0))) __PYX_ERR(0, 128, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 129, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_12coord_transform(__pyx_self, __pyx_v_coords, __pyx_v_box); /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __pyx_r = NULL; - __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } -static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_12coord_transform(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_coords, PyArrayObject *__pyx_v_box) { +static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_12coord_transform(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_box) { int __pyx_v_numcoords; + int __pyx_v_size; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + Py_ssize_t __pyx_t_7; + Py_ssize_t __pyx_t_8; __Pyx_RefNannySetupContext("coord_transform", 0); /* "MDAnalysis/lib/c_distances.pyx":131 - * numpy.ndarray box): - * cdef int numcoords + * float[:,:] box): + * cdef int numcoords, size * numcoords = coords.shape[0] # <<<<<<<<<<<<<< + * size = coords.size * - * _coord_transform( coords.data, numcoords, */ - __pyx_v_numcoords = (__pyx_v_coords->dimensions[0]); + __pyx_v_numcoords = (__pyx_v_coords.shape[0]); - /* "MDAnalysis/lib/c_distances.pyx":133 + /* "MDAnalysis/lib/c_distances.pyx":132 + * cdef int numcoords, size * numcoords = coords.shape[0] + * size = coords.size # <<<<<<<<<<<<<< + * + * if size > 0: + */ + __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_coords, 2, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_size); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_size = __pyx_t_3; + + /* "MDAnalysis/lib/c_distances.pyx":134 + * size = coords.size + * + * if size > 0: # <<<<<<<<<<<<<< + * _coord_transform( &coords[0,0], numcoords, + * &box[0,0]) + */ + __pyx_t_4 = ((__pyx_v_size > 0) != 0); + if (__pyx_t_4) { + + /* "MDAnalysis/lib/c_distances.pyx":135 * - * _coord_transform( coords.data, numcoords, # <<<<<<<<<<<<<< - * box.data) + * if size > 0: + * _coord_transform( &coords[0,0], numcoords, # <<<<<<<<<<<<<< + * &box[0,0]) * */ - _coord_transform(((coordinate *)__pyx_v_coords->data), __pyx_v_numcoords, ((coordinate *)__pyx_v_box->data)); + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_3 = -1; + if (__pyx_t_5 < 0) { + __pyx_t_5 += __pyx_v_coords.shape[0]; + if (unlikely(__pyx_t_5 < 0)) __pyx_t_3 = 0; + } else if (unlikely(__pyx_t_5 >= __pyx_v_coords.shape[0])) __pyx_t_3 = 0; + if (__pyx_t_6 < 0) { + __pyx_t_6 += __pyx_v_coords.shape[1]; + if (unlikely(__pyx_t_6 < 0)) __pyx_t_3 = 1; + } else if (unlikely(__pyx_t_6 >= __pyx_v_coords.shape[1])) __pyx_t_3 = 1; + if (unlikely(__pyx_t_3 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_3); + __PYX_ERR(0, 135, __pyx_L1_error) + } + + /* "MDAnalysis/lib/c_distances.pyx":136 + * if size > 0: + * _coord_transform( &coords[0,0], numcoords, + * &box[0,0]) # <<<<<<<<<<<<<< + * + * def calc_bond_distance(numpy.ndarray coords1, + */ + __pyx_t_7 = 0; + __pyx_t_8 = 0; + __pyx_t_3 = -1; + if (__pyx_t_7 < 0) { + __pyx_t_7 += __pyx_v_box.shape[0]; + if (unlikely(__pyx_t_7 < 0)) __pyx_t_3 = 0; + } else if (unlikely(__pyx_t_7 >= __pyx_v_box.shape[0])) __pyx_t_3 = 0; + if (__pyx_t_8 < 0) { + __pyx_t_8 += __pyx_v_box.shape[1]; + if (unlikely(__pyx_t_8 < 0)) __pyx_t_3 = 1; + } else if (unlikely(__pyx_t_8 >= __pyx_v_box.shape[1])) __pyx_t_3 = 1; + if (unlikely(__pyx_t_3 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_3); + __PYX_ERR(0, 136, __pyx_L1_error) + } + + /* "MDAnalysis/lib/c_distances.pyx":135 + * + * if size > 0: + * _coord_transform( &coords[0,0], numcoords, # <<<<<<<<<<<<<< + * &box[0,0]) + * + */ + _coord_transform((&(*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_coords.data + __pyx_t_5 * __pyx_v_coords.strides[0]) ) + __pyx_t_6 * __pyx_v_coords.strides[1]) )))), __pyx_v_numcoords, (&(*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_box.data + __pyx_t_7 * __pyx_v_box.strides[0]) ) + __pyx_t_8 * __pyx_v_box.strides[1]) ))))); + + /* "MDAnalysis/lib/c_distances.pyx":134 + * size = coords.size + * + * if size > 0: # <<<<<<<<<<<<<< + * _coord_transform( &coords[0,0], numcoords, + * &box[0,0]) + */ + } /* "MDAnalysis/lib/c_distances.pyx":128 * result.data, distnum) * - * def coord_transform(numpy.ndarray coords, # <<<<<<<<<<<<<< - * numpy.ndarray box): - * cdef int numcoords + * def coord_transform(float[:,:] coords, # <<<<<<<<<<<<<< + * float[:,:] box): + * cdef int numcoords, size */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("MDAnalysis.lib.c_distances.coord_transform", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_coords, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_box, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":136 - * box.data) +/* "MDAnalysis/lib/c_distances.pyx":138 + * &box[0,0]) * * def calc_bond_distance(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, @@ -3543,17 +3647,17 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_15calc_bond_distance(P case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance", 1, 3, 3, 1); __PYX_ERR(0, 136, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance", 1, 3, 3, 1); __PYX_ERR(0, 138, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance", 1, 3, 3, 2); __PYX_ERR(0, 136, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance", 1, 3, 3, 2); __PYX_ERR(0, 138, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_bond_distance") < 0)) __PYX_ERR(0, 136, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_bond_distance") < 0)) __PYX_ERR(0, 138, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -3568,15 +3672,15 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_15calc_bond_distance(P } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_bond_distance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 136, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 138, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_bond_distance", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 136, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 137, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 138, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 138, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 139, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 140, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_14calc_bond_distance(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_results); /* function exit code */ @@ -3594,7 +3698,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_14calc_bond_distance(C __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_bond_distance", 0); - /* "MDAnalysis/lib/c_distances.pyx":140 + /* "MDAnalysis/lib/c_distances.pyx":142 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -3603,7 +3707,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_14calc_bond_distance(C */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":142 + /* "MDAnalysis/lib/c_distances.pyx":144 * numcoords = coords1.shape[0] * * _calc_bond_distance( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -3612,8 +3716,8 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_14calc_bond_distance(C */ _calc_bond_distance(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), __pyx_v_numcoords, ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":136 - * box.data) + /* "MDAnalysis/lib/c_distances.pyx":138 + * &box[0,0]) * * def calc_bond_distance(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, @@ -3627,7 +3731,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_14calc_bond_distance(C return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":146 +/* "MDAnalysis/lib/c_distances.pyx":148 * results.data) * * def calc_bond_distance_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -3673,23 +3777,23 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_17calc_bond_distance_o case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, 1); __PYX_ERR(0, 146, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, 1); __PYX_ERR(0, 148, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, 2); __PYX_ERR(0, 146, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, 2); __PYX_ERR(0, 148, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, 3); __PYX_ERR(0, 146, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, 3); __PYX_ERR(0, 148, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_bond_distance_ortho") < 0)) __PYX_ERR(0, 146, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_bond_distance_ortho") < 0)) __PYX_ERR(0, 148, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -3706,16 +3810,16 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_17calc_bond_distance_o } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 146, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_ortho", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 148, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_bond_distance_ortho", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 146, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 147, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 148, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 149, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 148, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 149, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 151, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_16calc_bond_distance_ortho(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_box, __pyx_v_results); /* function exit code */ @@ -3733,7 +3837,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_16calc_bond_distance_o __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_bond_distance_ortho", 0); - /* "MDAnalysis/lib/c_distances.pyx":151 + /* "MDAnalysis/lib/c_distances.pyx":153 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -3742,7 +3846,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_16calc_bond_distance_o */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":153 + /* "MDAnalysis/lib/c_distances.pyx":155 * numcoords = coords1.shape[0] * * _calc_bond_distance_ortho( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -3751,7 +3855,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_16calc_bond_distance_o */ _calc_bond_distance_ortho(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), __pyx_v_numcoords, ((float *)__pyx_v_box->data), ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":146 + /* "MDAnalysis/lib/c_distances.pyx":148 * results.data) * * def calc_bond_distance_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -3766,7 +3870,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_16calc_bond_distance_o return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":158 +/* "MDAnalysis/lib/c_distances.pyx":160 * results.data) * * def calc_bond_distance_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -3812,23 +3916,23 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_19calc_bond_distance_t case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, 1); __PYX_ERR(0, 158, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, 1); __PYX_ERR(0, 160, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, 2); __PYX_ERR(0, 158, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, 2); __PYX_ERR(0, 160, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, 3); __PYX_ERR(0, 158, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, 3); __PYX_ERR(0, 160, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_bond_distance_triclinic") < 0)) __PYX_ERR(0, 158, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_bond_distance_triclinic") < 0)) __PYX_ERR(0, 160, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -3845,16 +3949,16 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_19calc_bond_distance_t } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 158, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_bond_distance_triclinic", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 160, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_bond_distance_triclinic", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 158, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 159, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 160, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 161, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 160, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 161, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 162, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 163, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_18calc_bond_distance_triclinic(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_box, __pyx_v_results); /* function exit code */ @@ -3872,7 +3976,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_18calc_bond_distance_t __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_bond_distance_triclinic", 0); - /* "MDAnalysis/lib/c_distances.pyx":163 + /* "MDAnalysis/lib/c_distances.pyx":165 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -3881,7 +3985,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_18calc_bond_distance_t */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":165 + /* "MDAnalysis/lib/c_distances.pyx":167 * numcoords = coords1.shape[0] * * _calc_bond_distance_triclinic( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -3890,7 +3994,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_18calc_bond_distance_t */ _calc_bond_distance_triclinic(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), __pyx_v_numcoords, ((coordinate *)__pyx_v_box->data), ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":158 + /* "MDAnalysis/lib/c_distances.pyx":160 * results.data) * * def calc_bond_distance_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -3905,7 +4009,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_18calc_bond_distance_t return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":170 +/* "MDAnalysis/lib/c_distances.pyx":172 * results.data) * * def calc_angle(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -3951,23 +4055,23 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_21calc_angle(PyObject case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, 1); __PYX_ERR(0, 170, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, 1); __PYX_ERR(0, 172, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords3)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, 2); __PYX_ERR(0, 170, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, 2); __PYX_ERR(0, 172, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, 3); __PYX_ERR(0, 170, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, 3); __PYX_ERR(0, 172, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_angle") < 0)) __PYX_ERR(0, 170, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_angle") < 0)) __PYX_ERR(0, 172, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -3984,16 +4088,16 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_21calc_angle(PyObject } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 170, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 172, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_angle", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 170, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 171, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 172, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 173, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 172, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 173, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 174, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 175, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_20calc_angle(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_coords3, __pyx_v_results); /* function exit code */ @@ -4011,7 +4115,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_20calc_angle(CYTHON_UN __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_angle", 0); - /* "MDAnalysis/lib/c_distances.pyx":175 + /* "MDAnalysis/lib/c_distances.pyx":177 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -4020,7 +4124,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_20calc_angle(CYTHON_UN */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":177 + /* "MDAnalysis/lib/c_distances.pyx":179 * numcoords = coords1.shape[0] * * _calc_angle( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -4029,7 +4133,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_20calc_angle(CYTHON_UN */ _calc_angle(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), ((coordinate *)__pyx_v_coords3->data), __pyx_v_numcoords, ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":170 + /* "MDAnalysis/lib/c_distances.pyx":172 * results.data) * * def calc_angle(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4044,7 +4148,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_20calc_angle(CYTHON_UN return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":182 +/* "MDAnalysis/lib/c_distances.pyx":184 * results.data) * * def calc_angle_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4093,29 +4197,29 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_23calc_angle_ortho(PyO case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 1); __PYX_ERR(0, 182, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 1); __PYX_ERR(0, 184, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords3)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 2); __PYX_ERR(0, 182, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 2); __PYX_ERR(0, 184, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 3); __PYX_ERR(0, 182, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 3); __PYX_ERR(0, 184, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 4); __PYX_ERR(0, 182, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, 4); __PYX_ERR(0, 184, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_angle_ortho") < 0)) __PYX_ERR(0, 182, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_angle_ortho") < 0)) __PYX_ERR(0, 184, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; @@ -4134,17 +4238,17 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_23calc_angle_ortho(PyO } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 182, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_ortho", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 184, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_angle_ortho", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 182, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 183, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 184, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 185, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 186, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 184, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 185, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 186, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 187, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 188, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_22calc_angle_ortho(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_coords3, __pyx_v_box, __pyx_v_results); /* function exit code */ @@ -4162,7 +4266,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_22calc_angle_ortho(CYT __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_angle_ortho", 0); - /* "MDAnalysis/lib/c_distances.pyx":188 + /* "MDAnalysis/lib/c_distances.pyx":190 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -4171,7 +4275,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_22calc_angle_ortho(CYT */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":190 + /* "MDAnalysis/lib/c_distances.pyx":192 * numcoords = coords1.shape[0] * * _calc_angle_ortho( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -4180,7 +4284,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_22calc_angle_ortho(CYT */ _calc_angle_ortho(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), ((coordinate *)__pyx_v_coords3->data), __pyx_v_numcoords, ((float *)__pyx_v_box->data), ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":182 + /* "MDAnalysis/lib/c_distances.pyx":184 * results.data) * * def calc_angle_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4195,7 +4299,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_22calc_angle_ortho(CYT return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":196 +/* "MDAnalysis/lib/c_distances.pyx":198 * results.data) * * def calc_angle_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4244,29 +4348,29 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_25calc_angle_triclinic case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 1); __PYX_ERR(0, 196, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 1); __PYX_ERR(0, 198, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords3)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 2); __PYX_ERR(0, 196, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 2); __PYX_ERR(0, 198, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 3); __PYX_ERR(0, 196, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 3); __PYX_ERR(0, 198, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 4); __PYX_ERR(0, 196, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, 4); __PYX_ERR(0, 198, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_angle_triclinic") < 0)) __PYX_ERR(0, 196, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_angle_triclinic") < 0)) __PYX_ERR(0, 198, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; @@ -4285,17 +4389,17 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_25calc_angle_triclinic } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 196, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_angle_triclinic", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 198, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_angle_triclinic", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 196, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 197, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 198, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 199, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 200, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 198, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 199, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 200, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 201, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 202, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_24calc_angle_triclinic(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_coords3, __pyx_v_box, __pyx_v_results); /* function exit code */ @@ -4313,7 +4417,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_24calc_angle_triclinic __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_angle_triclinic", 0); - /* "MDAnalysis/lib/c_distances.pyx":202 + /* "MDAnalysis/lib/c_distances.pyx":204 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -4322,7 +4426,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_24calc_angle_triclinic */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":204 + /* "MDAnalysis/lib/c_distances.pyx":206 * numcoords = coords1.shape[0] * * _calc_angle_triclinic( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -4331,7 +4435,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_24calc_angle_triclinic */ _calc_angle_triclinic(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), ((coordinate *)__pyx_v_coords3->data), __pyx_v_numcoords, ((coordinate *)__pyx_v_box->data), ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":196 + /* "MDAnalysis/lib/c_distances.pyx":198 * results.data) * * def calc_angle_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4346,7 +4450,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_24calc_angle_triclinic return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":210 +/* "MDAnalysis/lib/c_distances.pyx":212 * results.data) * * def calc_dihedral(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4395,29 +4499,29 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_27calc_dihedral(PyObje case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 1); __PYX_ERR(0, 210, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 1); __PYX_ERR(0, 212, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords3)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 2); __PYX_ERR(0, 210, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 2); __PYX_ERR(0, 212, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords4)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 3); __PYX_ERR(0, 210, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 3); __PYX_ERR(0, 212, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 4); __PYX_ERR(0, 210, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, 4); __PYX_ERR(0, 212, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_dihedral") < 0)) __PYX_ERR(0, 210, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_dihedral") < 0)) __PYX_ERR(0, 212, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; @@ -4436,17 +4540,17 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_27calc_dihedral(PyObje } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 210, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 212, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_dihedral", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 210, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 211, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 212, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords4), __pyx_ptype_5numpy_ndarray, 1, "coords4", 0))) __PYX_ERR(0, 213, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 214, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 212, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 213, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 214, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords4), __pyx_ptype_5numpy_ndarray, 1, "coords4", 0))) __PYX_ERR(0, 215, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 216, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_26calc_dihedral(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_coords3, __pyx_v_coords4, __pyx_v_results); /* function exit code */ @@ -4464,7 +4568,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_26calc_dihedral(CYTHON __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_dihedral", 0); - /* "MDAnalysis/lib/c_distances.pyx":216 + /* "MDAnalysis/lib/c_distances.pyx":218 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -4473,7 +4577,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_26calc_dihedral(CYTHON */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":218 + /* "MDAnalysis/lib/c_distances.pyx":220 * numcoords = coords1.shape[0] * * _calc_dihedral( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -4482,7 +4586,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_26calc_dihedral(CYTHON */ _calc_dihedral(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), ((coordinate *)__pyx_v_coords3->data), ((coordinate *)__pyx_v_coords4->data), __pyx_v_numcoords, ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":210 + /* "MDAnalysis/lib/c_distances.pyx":212 * results.data) * * def calc_dihedral(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4497,7 +4601,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_26calc_dihedral(CYTHON return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":223 +/* "MDAnalysis/lib/c_distances.pyx":225 * results.data) * * def calc_dihedral_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4549,35 +4653,35 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_29calc_dihedral_ortho( case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 1); __PYX_ERR(0, 223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 1); __PYX_ERR(0, 225, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords3)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 2); __PYX_ERR(0, 223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 2); __PYX_ERR(0, 225, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords4)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 3); __PYX_ERR(0, 223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 3); __PYX_ERR(0, 225, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 4); __PYX_ERR(0, 223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 4); __PYX_ERR(0, 225, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 5); __PYX_ERR(0, 223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, 5); __PYX_ERR(0, 225, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_dihedral_ortho") < 0)) __PYX_ERR(0, 223, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_dihedral_ortho") < 0)) __PYX_ERR(0, 225, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; @@ -4598,18 +4702,18 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_29calc_dihedral_ortho( } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_ortho", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 225, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_dihedral_ortho", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 223, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 224, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 225, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords4), __pyx_ptype_5numpy_ndarray, 1, "coords4", 0))) __PYX_ERR(0, 226, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 227, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 228, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 225, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 226, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 227, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords4), __pyx_ptype_5numpy_ndarray, 1, "coords4", 0))) __PYX_ERR(0, 228, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 229, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 230, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_28calc_dihedral_ortho(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_coords3, __pyx_v_coords4, __pyx_v_box, __pyx_v_results); /* function exit code */ @@ -4627,7 +4731,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_28calc_dihedral_ortho( __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_dihedral_ortho", 0); - /* "MDAnalysis/lib/c_distances.pyx":230 + /* "MDAnalysis/lib/c_distances.pyx":232 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -4636,7 +4740,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_28calc_dihedral_ortho( */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":232 + /* "MDAnalysis/lib/c_distances.pyx":234 * numcoords = coords1.shape[0] * * _calc_dihedral_ortho( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -4645,7 +4749,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_28calc_dihedral_ortho( */ _calc_dihedral_ortho(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), ((coordinate *)__pyx_v_coords3->data), ((coordinate *)__pyx_v_coords4->data), __pyx_v_numcoords, ((float *)__pyx_v_box->data), ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":223 + /* "MDAnalysis/lib/c_distances.pyx":225 * results.data) * * def calc_dihedral_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4660,7 +4764,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_28calc_dihedral_ortho( return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":238 +/* "MDAnalysis/lib/c_distances.pyx":240 * results.data) * * def calc_dihedral_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4712,35 +4816,35 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_31calc_dihedral_tricli case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 1); __PYX_ERR(0, 238, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 1); __PYX_ERR(0, 240, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords3)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 2); __PYX_ERR(0, 238, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 2); __PYX_ERR(0, 240, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords4)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 3); __PYX_ERR(0, 238, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 3); __PYX_ERR(0, 240, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 4); __PYX_ERR(0, 238, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 4); __PYX_ERR(0, 240, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_results)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 5); __PYX_ERR(0, 238, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, 5); __PYX_ERR(0, 240, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_dihedral_triclinic") < 0)) __PYX_ERR(0, 238, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "calc_dihedral_triclinic") < 0)) __PYX_ERR(0, 240, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; @@ -4761,18 +4865,18 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_31calc_dihedral_tricli } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 238, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("calc_dihedral_triclinic", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 240, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.calc_dihedral_triclinic", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 238, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 239, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 240, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords4), __pyx_ptype_5numpy_ndarray, 1, "coords4", 0))) __PYX_ERR(0, 241, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 242, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 243, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 240, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 241, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords3), __pyx_ptype_5numpy_ndarray, 1, "coords3", 0))) __PYX_ERR(0, 242, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords4), __pyx_ptype_5numpy_ndarray, 1, "coords4", 0))) __PYX_ERR(0, 243, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 244, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_results), __pyx_ptype_5numpy_ndarray, 1, "results", 0))) __PYX_ERR(0, 245, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_30calc_dihedral_triclinic(__pyx_self, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_coords3, __pyx_v_coords4, __pyx_v_box, __pyx_v_results); /* function exit code */ @@ -4790,7 +4894,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_30calc_dihedral_tricli __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("calc_dihedral_triclinic", 0); - /* "MDAnalysis/lib/c_distances.pyx":245 + /* "MDAnalysis/lib/c_distances.pyx":247 * numpy.ndarray results): * cdef int numcoords * numcoords = coords1.shape[0] # <<<<<<<<<<<<<< @@ -4799,7 +4903,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_30calc_dihedral_tricli */ __pyx_v_numcoords = (__pyx_v_coords1->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":247 + /* "MDAnalysis/lib/c_distances.pyx":249 * numcoords = coords1.shape[0] * * _calc_dihedral_triclinic( coords1.data, coords2.data, # <<<<<<<<<<<<<< @@ -4808,7 +4912,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_30calc_dihedral_tricli */ _calc_dihedral_triclinic(((coordinate *)__pyx_v_coords1->data), ((coordinate *)__pyx_v_coords2->data), ((coordinate *)__pyx_v_coords3->data), ((coordinate *)__pyx_v_coords4->data), __pyx_v_numcoords, ((coordinate *)__pyx_v_box->data), ((double *)__pyx_v_results->data)); - /* "MDAnalysis/lib/c_distances.pyx":238 + /* "MDAnalysis/lib/c_distances.pyx":240 * results.data) * * def calc_dihedral_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< @@ -4823,7 +4927,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_30calc_dihedral_tricli return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":253 +/* "MDAnalysis/lib/c_distances.pyx":255 * results.data) * * def ortho_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< @@ -4866,17 +4970,17 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_33ortho_pbc(PyObject * case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("ortho_pbc", 1, 3, 3, 1); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("ortho_pbc", 1, 3, 3, 1); __PYX_ERR(0, 255, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box_inverse)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("ortho_pbc", 1, 3, 3, 2); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("ortho_pbc", 1, 3, 3, 2); __PYX_ERR(0, 255, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ortho_pbc") < 0)) __PYX_ERR(0, 253, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ortho_pbc") < 0)) __PYX_ERR(0, 255, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -4891,15 +4995,15 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_33ortho_pbc(PyObject * } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("ortho_pbc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("ortho_pbc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 255, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.ortho_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords), __pyx_ptype_5numpy_ndarray, 1, "coords", 0))) __PYX_ERR(0, 253, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 254, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box_inverse), __pyx_ptype_5numpy_ndarray, 1, "box_inverse", 0))) __PYX_ERR(0, 254, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords), __pyx_ptype_5numpy_ndarray, 1, "coords", 0))) __PYX_ERR(0, 255, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 256, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box_inverse), __pyx_ptype_5numpy_ndarray, 1, "box_inverse", 0))) __PYX_ERR(0, 256, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_32ortho_pbc(__pyx_self, __pyx_v_coords, __pyx_v_box, __pyx_v_box_inverse); /* function exit code */ @@ -4917,7 +5021,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_32ortho_pbc(CYTHON_UNU __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("ortho_pbc", 0); - /* "MDAnalysis/lib/c_distances.pyx":256 + /* "MDAnalysis/lib/c_distances.pyx":258 * numpy.ndarray box, numpy.ndarray box_inverse): * cdef int numcoords * numcoords = coords.shape[0] # <<<<<<<<<<<<<< @@ -4926,7 +5030,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_32ortho_pbc(CYTHON_UNU */ __pyx_v_numcoords = (__pyx_v_coords->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":258 + /* "MDAnalysis/lib/c_distances.pyx":260 * numcoords = coords.shape[0] * * _ortho_pbc( coords.data, numcoords, # <<<<<<<<<<<<<< @@ -4935,7 +5039,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_32ortho_pbc(CYTHON_UNU */ _ortho_pbc(((coordinate *)__pyx_v_coords->data), __pyx_v_numcoords, ((float *)__pyx_v_box->data), ((float *)__pyx_v_box_inverse->data)); - /* "MDAnalysis/lib/c_distances.pyx":253 + /* "MDAnalysis/lib/c_distances.pyx":255 * results.data) * * def ortho_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< @@ -4950,7 +5054,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_32ortho_pbc(CYTHON_UNU return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":261 +/* "MDAnalysis/lib/c_distances.pyx":263 * box.data, box_inverse.data) * * def triclinic_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< @@ -4993,17 +5097,17 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_35triclinic_pbc(PyObje case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("triclinic_pbc", 1, 3, 3, 1); __PYX_ERR(0, 261, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("triclinic_pbc", 1, 3, 3, 1); __PYX_ERR(0, 263, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box_inverse)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("triclinic_pbc", 1, 3, 3, 2); __PYX_ERR(0, 261, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("triclinic_pbc", 1, 3, 3, 2); __PYX_ERR(0, 263, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "triclinic_pbc") < 0)) __PYX_ERR(0, 261, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "triclinic_pbc") < 0)) __PYX_ERR(0, 263, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -5018,15 +5122,15 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_35triclinic_pbc(PyObje } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("triclinic_pbc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 261, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("triclinic_pbc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 263, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.triclinic_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords), __pyx_ptype_5numpy_ndarray, 1, "coords", 0))) __PYX_ERR(0, 261, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 262, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box_inverse), __pyx_ptype_5numpy_ndarray, 1, "box_inverse", 0))) __PYX_ERR(0, 262, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords), __pyx_ptype_5numpy_ndarray, 1, "coords", 0))) __PYX_ERR(0, 263, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_5numpy_ndarray, 1, "box", 0))) __PYX_ERR(0, 264, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box_inverse), __pyx_ptype_5numpy_ndarray, 1, "box_inverse", 0))) __PYX_ERR(0, 264, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_11c_distances_34triclinic_pbc(__pyx_self, __pyx_v_coords, __pyx_v_box, __pyx_v_box_inverse); /* function exit code */ @@ -5044,7 +5148,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_34triclinic_pbc(CYTHON __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("triclinic_pbc", 0); - /* "MDAnalysis/lib/c_distances.pyx":264 + /* "MDAnalysis/lib/c_distances.pyx":266 * numpy.ndarray box, numpy.ndarray box_inverse): * cdef int numcoords * numcoords = coords.shape[0] # <<<<<<<<<<<<<< @@ -5053,7 +5157,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_34triclinic_pbc(CYTHON */ __pyx_v_numcoords = (__pyx_v_coords->dimensions[0]); - /* "MDAnalysis/lib/c_distances.pyx":266 + /* "MDAnalysis/lib/c_distances.pyx":268 * numcoords = coords.shape[0] * * _triclinic_pbc( coords.data, numcoords, # <<<<<<<<<<<<<< @@ -5062,7 +5166,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_34triclinic_pbc(CYTHON */ _triclinic_pbc(((coordinate *)__pyx_v_coords->data), __pyx_v_numcoords, ((coordinate *)__pyx_v_box->data), ((float *)__pyx_v_box_inverse->data)); - /* "MDAnalysis/lib/c_distances.pyx":261 + /* "MDAnalysis/lib/c_distances.pyx":263 * box.data, box_inverse.data) * * def triclinic_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< @@ -5077,7 +5181,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_34triclinic_pbc(CYTHON return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":271 +/* "MDAnalysis/lib/c_distances.pyx":273 * * @cython.boundscheck(False) * def contact_matrix_no_pbc(coord, sparse_contacts, cutoff): # <<<<<<<<<<<<<< @@ -5120,17 +5224,17 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_37contact_matrix_no_pb case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sparse_contacts)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("contact_matrix_no_pbc", 1, 3, 3, 1); __PYX_ERR(0, 271, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("contact_matrix_no_pbc", 1, 3, 3, 1); __PYX_ERR(0, 273, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_cutoff)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("contact_matrix_no_pbc", 1, 3, 3, 2); __PYX_ERR(0, 271, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("contact_matrix_no_pbc", 1, 3, 3, 2); __PYX_ERR(0, 273, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "contact_matrix_no_pbc") < 0)) __PYX_ERR(0, 271, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "contact_matrix_no_pbc") < 0)) __PYX_ERR(0, 273, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -5145,7 +5249,7 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_37contact_matrix_no_pb } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("contact_matrix_no_pbc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 271, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("contact_matrix_no_pbc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 273, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.contact_matrix_no_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -5195,42 +5299,42 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb int __pyx_t_25; __Pyx_RefNannySetupContext("contact_matrix_no_pbc", 0); - /* "MDAnalysis/lib/c_distances.pyx":272 + /* "MDAnalysis/lib/c_distances.pyx":274 * @cython.boundscheck(False) * def contact_matrix_no_pbc(coord, sparse_contacts, cutoff): * cdef int rows = len(coord) # <<<<<<<<<<<<<< * cdef double cutoff2 = cutoff ** 2 * cdef float[:, ::1] coord_view = coord */ - __pyx_t_1 = PyObject_Length(__pyx_v_coord); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 272, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_v_coord); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 274, __pyx_L1_error) __pyx_v_rows = __pyx_t_1; - /* "MDAnalysis/lib/c_distances.pyx":273 + /* "MDAnalysis/lib/c_distances.pyx":275 * def contact_matrix_no_pbc(coord, sparse_contacts, cutoff): * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 # <<<<<<<<<<<<<< * cdef float[:, ::1] coord_view = coord * */ - __pyx_t_2 = PyNumber_Power(__pyx_v_cutoff, __pyx_int_2, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 273, __pyx_L1_error) + __pyx_t_2 = PyNumber_Power(__pyx_v_cutoff, __pyx_int_2, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 275, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 273, __pyx_L1_error) + __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 275, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_cutoff2 = __pyx_t_3; - /* "MDAnalysis/lib/c_distances.pyx":274 + /* "MDAnalysis/lib/c_distances.pyx":276 * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 * cdef float[:, ::1] coord_view = coord # <<<<<<<<<<<<<< * * cdef int i, j */ - __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(__pyx_v_coord, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 274, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(__pyx_v_coord, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 276, __pyx_L1_error) __pyx_v_coord_view = __pyx_t_4; __pyx_t_4.memview = NULL; __pyx_t_4.data = NULL; - /* "MDAnalysis/lib/c_distances.pyx":279 + /* "MDAnalysis/lib/c_distances.pyx":281 * cdef double[3] rr * cdef double dist * for i in range(rows): # <<<<<<<<<<<<<< @@ -5242,18 +5346,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { __pyx_v_i = __pyx_t_7; - /* "MDAnalysis/lib/c_distances.pyx":280 + /* "MDAnalysis/lib/c_distances.pyx":282 * cdef double dist * for i in range(rows): * sparse_contacts[i, i] = True # <<<<<<<<<<<<<< * for j in range(i+1, rows): * rr[0] = coord_view[i, 0] - coord_view[j, 0] */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 280, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 282, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 280, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 282, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 280, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 282, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2); @@ -5261,10 +5365,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8); __pyx_t_2 = 0; __pyx_t_8 = 0; - if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_9, Py_True) < 0)) __PYX_ERR(0, 280, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_9, Py_True) < 0)) __PYX_ERR(0, 282, __pyx_L1_error) __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - /* "MDAnalysis/lib/c_distances.pyx":281 + /* "MDAnalysis/lib/c_distances.pyx":283 * for i in range(rows): * sparse_contacts[i, i] = True * for j in range(i+1, rows): # <<<<<<<<<<<<<< @@ -5276,7 +5380,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb for (__pyx_t_12 = (__pyx_v_i + 1); __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { __pyx_v_j = __pyx_t_12; - /* "MDAnalysis/lib/c_distances.pyx":282 + /* "MDAnalysis/lib/c_distances.pyx":284 * sparse_contacts[i, i] = True * for j in range(i+1, rows): * rr[0] = coord_view[i, 0] - coord_view[j, 0] # <<<<<<<<<<<<<< @@ -5293,7 +5397,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_v_coord_view.shape[1]; (__pyx_v_rr[0]) = ((*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_13 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_14)) ))) - (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_15 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_16)) )))); - /* "MDAnalysis/lib/c_distances.pyx":283 + /* "MDAnalysis/lib/c_distances.pyx":285 * for j in range(i+1, rows): * rr[0] = coord_view[i, 0] - coord_view[j, 0] * rr[1] = coord_view[i, 1] - coord_view[j, 1] # <<<<<<<<<<<<<< @@ -5310,7 +5414,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_v_coord_view.shape[1]; (__pyx_v_rr[1]) = ((*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_17 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_18)) ))) - (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_19 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_20)) )))); - /* "MDAnalysis/lib/c_distances.pyx":284 + /* "MDAnalysis/lib/c_distances.pyx":286 * rr[0] = coord_view[i, 0] - coord_view[j, 0] * rr[1] = coord_view[i, 1] - coord_view[j, 1] * rr[2] = coord_view[i, 2] - coord_view[j, 2] # <<<<<<<<<<<<<< @@ -5327,7 +5431,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb if (__pyx_t_24 < 0) __pyx_t_24 += __pyx_v_coord_view.shape[1]; (__pyx_v_rr[2]) = ((*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_21 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_22)) ))) - (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_23 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_24)) )))); - /* "MDAnalysis/lib/c_distances.pyx":285 + /* "MDAnalysis/lib/c_distances.pyx":287 * rr[1] = coord_view[i, 1] - coord_view[j, 1] * rr[2] = coord_view[i, 2] - coord_view[j, 2] * dist = rr[0]*rr[0] + rr[1]*rr[1] + rr[2]*rr[2] # <<<<<<<<<<<<<< @@ -5336,7 +5440,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb */ __pyx_v_dist = ((((__pyx_v_rr[0]) * (__pyx_v_rr[0])) + ((__pyx_v_rr[1]) * (__pyx_v_rr[1]))) + ((__pyx_v_rr[2]) * (__pyx_v_rr[2]))); - /* "MDAnalysis/lib/c_distances.pyx":286 + /* "MDAnalysis/lib/c_distances.pyx":288 * rr[2] = coord_view[i, 2] - coord_view[j, 2] * dist = rr[0]*rr[0] + rr[1]*rr[1] + rr[2]*rr[2] * if dist < cutoff2: # <<<<<<<<<<<<<< @@ -5346,18 +5450,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb __pyx_t_25 = ((__pyx_v_dist < __pyx_v_cutoff2) != 0); if (__pyx_t_25) { - /* "MDAnalysis/lib/c_distances.pyx":287 + /* "MDAnalysis/lib/c_distances.pyx":289 * dist = rr[0]*rr[0] + rr[1]*rr[1] + rr[2]*rr[2] * if dist < cutoff2: * sparse_contacts[i, j] = True # <<<<<<<<<<<<<< * sparse_contacts[j, i] = True * */ - __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 287, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 289, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 287, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 289, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 287, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 289, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_9); @@ -5365,21 +5469,21 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_8); __pyx_t_9 = 0; __pyx_t_8 = 0; - if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_2, Py_True) < 0)) __PYX_ERR(0, 287, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_2, Py_True) < 0)) __PYX_ERR(0, 289, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/c_distances.pyx":288 + /* "MDAnalysis/lib/c_distances.pyx":290 * if dist < cutoff2: * sparse_contacts[i, j] = True * sparse_contacts[j, i] = True # <<<<<<<<<<<<<< * * */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 288, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 290, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 288, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 290, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 288, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 290, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2); @@ -5387,10 +5491,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8); __pyx_t_2 = 0; __pyx_t_8 = 0; - if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_9, Py_True) < 0)) __PYX_ERR(0, 288, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_9, Py_True) < 0)) __PYX_ERR(0, 290, __pyx_L1_error) __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - /* "MDAnalysis/lib/c_distances.pyx":286 + /* "MDAnalysis/lib/c_distances.pyx":288 * rr[2] = coord_view[i, 2] - coord_view[j, 2] * dist = rr[0]*rr[0] + rr[1]*rr[1] + rr[2]*rr[2] * if dist < cutoff2: # <<<<<<<<<<<<<< @@ -5401,7 +5505,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb } } - /* "MDAnalysis/lib/c_distances.pyx":271 + /* "MDAnalysis/lib/c_distances.pyx":273 * * @cython.boundscheck(False) * def contact_matrix_no_pbc(coord, sparse_contacts, cutoff): # <<<<<<<<<<<<<< @@ -5426,7 +5530,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_36contact_matrix_no_pb return __pyx_r; } -/* "MDAnalysis/lib/c_distances.pyx":292 +/* "MDAnalysis/lib/c_distances.pyx":294 * * @cython.boundscheck(False) * def contact_matrix_pbc(coord, sparse_contacts, box, cutoff): # <<<<<<<<<<<<<< @@ -5472,23 +5576,23 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_39contact_matrix_pbc(P case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sparse_contacts)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, 1); __PYX_ERR(0, 292, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, 1); __PYX_ERR(0, 294, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, 2); __PYX_ERR(0, 292, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, 2); __PYX_ERR(0, 294, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_cutoff)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, 3); __PYX_ERR(0, 292, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, 3); __PYX_ERR(0, 294, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "contact_matrix_pbc") < 0)) __PYX_ERR(0, 292, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "contact_matrix_pbc") < 0)) __PYX_ERR(0, 294, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -5505,7 +5609,7 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_11c_distances_39contact_matrix_pbc(P } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 292, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("contact_matrix_pbc", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 294, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.c_distances.contact_matrix_pbc", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -5560,69 +5664,69 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C int __pyx_t_28; __Pyx_RefNannySetupContext("contact_matrix_pbc", 0); - /* "MDAnalysis/lib/c_distances.pyx":293 + /* "MDAnalysis/lib/c_distances.pyx":295 * @cython.boundscheck(False) * def contact_matrix_pbc(coord, sparse_contacts, box, cutoff): * cdef int rows = len(coord) # <<<<<<<<<<<<<< * cdef double cutoff2 = cutoff ** 2 * cdef float[:, ::1] coord_view = coord */ - __pyx_t_1 = PyObject_Length(__pyx_v_coord); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 293, __pyx_L1_error) + __pyx_t_1 = PyObject_Length(__pyx_v_coord); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 295, __pyx_L1_error) __pyx_v_rows = __pyx_t_1; - /* "MDAnalysis/lib/c_distances.pyx":294 + /* "MDAnalysis/lib/c_distances.pyx":296 * def contact_matrix_pbc(coord, sparse_contacts, box, cutoff): * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 # <<<<<<<<<<<<<< * cdef float[:, ::1] coord_view = coord * cdef float[::1] box_view = box */ - __pyx_t_2 = PyNumber_Power(__pyx_v_cutoff, __pyx_int_2, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 294, __pyx_L1_error) + __pyx_t_2 = PyNumber_Power(__pyx_v_cutoff, __pyx_int_2, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 294, __pyx_L1_error) + __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 296, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_cutoff2 = __pyx_t_3; - /* "MDAnalysis/lib/c_distances.pyx":295 + /* "MDAnalysis/lib/c_distances.pyx":297 * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 * cdef float[:, ::1] coord_view = coord # <<<<<<<<<<<<<< * cdef float[::1] box_view = box * cdef float[::1] box_inv = 1. / box */ - __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(__pyx_v_coord, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 295, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_float(__pyx_v_coord, PyBUF_WRITABLE); if (unlikely(!__pyx_t_4.memview)) __PYX_ERR(0, 297, __pyx_L1_error) __pyx_v_coord_view = __pyx_t_4; __pyx_t_4.memview = NULL; __pyx_t_4.data = NULL; - /* "MDAnalysis/lib/c_distances.pyx":296 + /* "MDAnalysis/lib/c_distances.pyx":298 * cdef double cutoff2 = cutoff ** 2 * cdef float[:, ::1] coord_view = coord * cdef float[::1] box_view = box # <<<<<<<<<<<<<< * cdef float[::1] box_inv = 1. / box * */ - __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_dc_float(__pyx_v_box, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_dc_float(__pyx_v_box, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 298, __pyx_L1_error) __pyx_v_box_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL; - /* "MDAnalysis/lib/c_distances.pyx":297 + /* "MDAnalysis/lib/c_distances.pyx":299 * cdef float[:, ::1] coord_view = coord * cdef float[::1] box_view = box * cdef float[::1] box_inv = 1. / box # <<<<<<<<<<<<<< * * cdef int i, j */ - __pyx_t_2 = __Pyx_PyFloat_DivideCObj(__pyx_float_1_, __pyx_v_box, 1., 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 297, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFloat_DivideCObj(__pyx_float_1_, __pyx_v_box, 1., 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 299, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_dc_float(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 297, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_dc_float(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 299, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_box_inv = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL; - /* "MDAnalysis/lib/c_distances.pyx":302 + /* "MDAnalysis/lib/c_distances.pyx":304 * cdef double[3] rr * cdef double dist * for i in range(rows): # <<<<<<<<<<<<<< @@ -5634,18 +5738,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) { __pyx_v_i = __pyx_t_8; - /* "MDAnalysis/lib/c_distances.pyx":303 + /* "MDAnalysis/lib/c_distances.pyx":305 * cdef double dist * for i in range(rows): * sparse_contacts[i, i] = True # <<<<<<<<<<<<<< * for j in range(i+1, rows): * rr[0] = coord_view[i, 0] - coord_view[j, 0] */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 303, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 305, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 303, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 305, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 303, __pyx_L1_error) + __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 305, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2); @@ -5653,10 +5757,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_9); __pyx_t_2 = 0; __pyx_t_9 = 0; - if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_10, Py_True) < 0)) __PYX_ERR(0, 303, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_10, Py_True) < 0)) __PYX_ERR(0, 305, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - /* "MDAnalysis/lib/c_distances.pyx":304 + /* "MDAnalysis/lib/c_distances.pyx":306 * for i in range(rows): * sparse_contacts[i, i] = True * for j in range(i+1, rows): # <<<<<<<<<<<<<< @@ -5668,7 +5772,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C for (__pyx_t_13 = (__pyx_v_i + 1); __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { __pyx_v_j = __pyx_t_13; - /* "MDAnalysis/lib/c_distances.pyx":305 + /* "MDAnalysis/lib/c_distances.pyx":307 * sparse_contacts[i, i] = True * for j in range(i+1, rows): * rr[0] = coord_view[i, 0] - coord_view[j, 0] # <<<<<<<<<<<<<< @@ -5685,7 +5789,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C if (__pyx_t_17 < 0) __pyx_t_17 += __pyx_v_coord_view.shape[1]; (__pyx_v_rr[0]) = ((*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_14 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_15)) ))) - (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_16 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_17)) )))); - /* "MDAnalysis/lib/c_distances.pyx":306 + /* "MDAnalysis/lib/c_distances.pyx":308 * for j in range(i+1, rows): * rr[0] = coord_view[i, 0] - coord_view[j, 0] * rr[1] = coord_view[i, 1] - coord_view[j, 1] # <<<<<<<<<<<<<< @@ -5702,7 +5806,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C if (__pyx_t_21 < 0) __pyx_t_21 += __pyx_v_coord_view.shape[1]; (__pyx_v_rr[1]) = ((*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_18 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_19)) ))) - (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_20 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_21)) )))); - /* "MDAnalysis/lib/c_distances.pyx":307 + /* "MDAnalysis/lib/c_distances.pyx":309 * rr[0] = coord_view[i, 0] - coord_view[j, 0] * rr[1] = coord_view[i, 1] - coord_view[j, 1] * rr[2] = coord_view[i, 2] - coord_view[j, 2] # <<<<<<<<<<<<<< @@ -5719,7 +5823,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C if (__pyx_t_25 < 0) __pyx_t_25 += __pyx_v_coord_view.shape[1]; (__pyx_v_rr[2]) = ((*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_22 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_23)) ))) - (*((float *) ( /* dim=1 */ ((char *) (((float *) ( /* dim=0 */ (__pyx_v_coord_view.data + __pyx_t_24 * __pyx_v_coord_view.strides[0]) )) + __pyx_t_25)) )))); - /* "MDAnalysis/lib/c_distances.pyx":309 + /* "MDAnalysis/lib/c_distances.pyx":311 * rr[2] = coord_view[i, 2] - coord_view[j, 2] * * minimum_image(rr, &box_view[0], &box_inv[0]) # <<<<<<<<<<<<<< @@ -5732,7 +5836,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C if (__pyx_t_27 < 0) __pyx_t_27 += __pyx_v_box_inv.shape[0]; minimum_image(__pyx_v_rr, (&(*((float *) ( /* dim=0 */ ((char *) (((float *) __pyx_v_box_view.data) + __pyx_t_26)) )))), (&(*((float *) ( /* dim=0 */ ((char *) (((float *) __pyx_v_box_inv.data) + __pyx_t_27)) ))))); - /* "MDAnalysis/lib/c_distances.pyx":311 + /* "MDAnalysis/lib/c_distances.pyx":313 * minimum_image(rr, &box_view[0], &box_inv[0]) * * dist = rr[0]*rr[0] + rr[1]*rr[1] + rr[2]*rr[2] # <<<<<<<<<<<<<< @@ -5741,7 +5845,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C */ __pyx_v_dist = ((((__pyx_v_rr[0]) * (__pyx_v_rr[0])) + ((__pyx_v_rr[1]) * (__pyx_v_rr[1]))) + ((__pyx_v_rr[2]) * (__pyx_v_rr[2]))); - /* "MDAnalysis/lib/c_distances.pyx":313 + /* "MDAnalysis/lib/c_distances.pyx":315 * dist = rr[0]*rr[0] + rr[1]*rr[1] + rr[2]*rr[2] * * if dist < cutoff2: # <<<<<<<<<<<<<< @@ -5751,17 +5855,17 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C __pyx_t_28 = ((__pyx_v_dist < __pyx_v_cutoff2) != 0); if (__pyx_t_28) { - /* "MDAnalysis/lib/c_distances.pyx":314 + /* "MDAnalysis/lib/c_distances.pyx":316 * * if dist < cutoff2: * sparse_contacts[i, j] = True # <<<<<<<<<<<<<< * sparse_contacts[j, i] = True */ - __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 314, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 316, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 314, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 316, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 314, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 316, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10); @@ -5769,19 +5873,19 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_9); __pyx_t_10 = 0; __pyx_t_9 = 0; - if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_2, Py_True) < 0)) __PYX_ERR(0, 314, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_2, Py_True) < 0)) __PYX_ERR(0, 316, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/c_distances.pyx":315 + /* "MDAnalysis/lib/c_distances.pyx":317 * if dist < cutoff2: * sparse_contacts[i, j] = True * sparse_contacts[j, i] = True # <<<<<<<<<<<<<< */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 315, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 317, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 315, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 317, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 315, __pyx_L1_error) + __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 317, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2); @@ -5789,10 +5893,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_9); __pyx_t_2 = 0; __pyx_t_9 = 0; - if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_10, Py_True) < 0)) __PYX_ERR(0, 315, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_v_sparse_contacts, __pyx_t_10, Py_True) < 0)) __PYX_ERR(0, 317, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - /* "MDAnalysis/lib/c_distances.pyx":313 + /* "MDAnalysis/lib/c_distances.pyx":315 * dist = rr[0]*rr[0] + rr[1]*rr[1] + rr[2]*rr[2] * * if dist < cutoff2: # <<<<<<<<<<<<<< @@ -5803,7 +5907,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C } } - /* "MDAnalysis/lib/c_distances.pyx":292 + /* "MDAnalysis/lib/c_distances.pyx":294 * * @cython.boundscheck(False) * def contact_matrix_pbc(coord, sparse_contacts, box, cutoff): # <<<<<<<<<<<<<< @@ -5831,7 +5935,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_11c_distances_38contact_matrix_pbc(C return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -5879,7 +5983,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -5888,7 +5992,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -5897,7 +6001,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -5906,7 +6010,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5920,7 +6024,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -5931,7 +6035,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5940,7 +6044,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -5953,7 +6057,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5962,7 +6066,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5976,7 +6080,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -5987,7 +6091,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5996,7 +6100,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -6009,7 +6113,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -6018,7 +6122,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -6027,7 +6131,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -6036,7 +6140,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -6046,7 +6150,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -6055,7 +6159,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -6064,7 +6168,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -6076,7 +6180,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -6085,7 +6189,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -6095,7 +6199,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -6105,7 +6209,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -6115,7 +6219,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -6126,7 +6230,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -6135,7 +6239,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -6144,7 +6248,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -6153,7 +6257,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -6162,7 +6266,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -6174,7 +6278,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -6187,7 +6291,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -6197,7 +6301,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -6207,7 +6311,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -6227,7 +6331,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -6244,7 +6348,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -6253,7 +6357,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -6266,7 +6370,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -6275,7 +6379,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -6287,7 +6391,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -6298,7 +6402,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -6309,7 +6413,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -6320,7 +6424,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -6331,7 +6435,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -6342,7 +6446,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -6353,7 +6457,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -6364,7 +6468,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -6375,7 +6479,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -6386,7 +6490,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -6397,7 +6501,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -6408,7 +6512,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -6419,7 +6523,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -6430,7 +6534,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -6441,7 +6545,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -6452,7 +6556,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -6464,7 +6568,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -6485,7 +6589,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -6494,7 +6598,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -6504,7 +6608,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -6513,7 +6617,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -6523,7 +6627,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -6532,7 +6636,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -6541,7 +6645,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -6551,7 +6655,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -6561,7 +6665,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -6593,7 +6697,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -6617,7 +6721,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -6627,7 +6731,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -6636,7 +6740,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -6645,7 +6749,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -6655,7 +6759,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -6664,7 +6768,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -6673,7 +6777,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -6685,7 +6789,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -6699,7 +6803,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -6713,7 +6817,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -6732,7 +6836,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -6746,7 +6850,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -6760,7 +6864,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -6779,7 +6883,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -6793,7 +6897,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -6807,7 +6911,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -6826,7 +6930,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -6840,7 +6944,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -6854,7 +6958,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -6873,7 +6977,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -6887,7 +6991,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -6901,7 +7005,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -6920,7 +7024,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -6934,7 +7038,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -6944,7 +7048,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -6956,7 +7060,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -6965,7 +7069,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -6979,7 +7083,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -6994,7 +7098,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -7023,7 +7127,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -7032,7 +7136,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -7041,7 +7145,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -7064,7 +7168,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -7081,7 +7185,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -7116,7 +7220,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -7133,7 +7237,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -7146,7 +7250,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -7155,7 +7259,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -7175,7 +7279,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -7192,7 +7296,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -7201,7 +7305,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -7214,7 +7318,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -7223,7 +7327,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -7239,7 +7343,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -7248,7 +7352,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -7257,7 +7361,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -7268,7 +7372,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -7278,7 +7382,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -7288,7 +7392,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -7300,7 +7404,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -7310,7 +7414,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -7323,7 +7427,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -7332,7 +7436,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -7350,7 +7454,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -7368,7 +7472,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -7386,7 +7490,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -7404,7 +7508,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -7422,7 +7526,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -7440,7 +7544,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -7458,7 +7562,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -7476,7 +7580,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -7494,7 +7598,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -7512,7 +7616,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -7530,7 +7634,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -7548,7 +7652,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -7566,7 +7670,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -7586,7 +7690,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -7606,7 +7710,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -7626,7 +7730,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -7644,7 +7748,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -7663,7 +7767,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -7672,7 +7776,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -7682,7 +7786,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -7695,7 +7799,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -7705,7 +7809,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -7715,7 +7819,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -7740,7 +7844,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -7755,7 +7859,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -7766,7 +7870,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -7775,7 +7879,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -7785,7 +7889,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -7795,7 +7899,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -7806,7 +7910,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -7815,7 +7919,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -7824,7 +7928,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -7836,7 +7940,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -7850,7 +7954,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -7860,7 +7964,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -7871,7 +7975,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -7880,7 +7984,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -7894,7 +7998,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -7909,7 +8013,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -7930,7 +8034,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -7946,7 +8050,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -7955,7 +8059,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -7969,7 +8073,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -7984,7 +8088,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -8000,7 +8104,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -8015,7 +8119,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -8038,7 +8142,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -8059,7 +8163,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -8075,7 +8179,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -8084,7 +8188,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -8098,7 +8202,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -8113,7 +8217,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -8129,7 +8233,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -8144,7 +8248,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -8167,7 +8271,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -8188,7 +8292,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -8204,7 +8308,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -8213,7 +8317,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -8227,7 +8331,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -8241,7 +8345,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -8255,7 +8359,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -8270,7 +8374,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -22067,7 +22171,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 279, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 281, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 229, __pyx_L1_error) __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 810, __pyx_L1_error) __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 1000, __pyx_L1_error) @@ -22086,7 +22190,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -22097,7 +22201,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -22108,7 +22212,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -22119,7 +22223,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -22130,7 +22234,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -22141,7 +22245,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -22152,7 +22256,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -22163,7 +22267,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -22174,7 +22278,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -22483,170 +22587,170 @@ static int __Pyx_InitCachedConstants(void) { /* "MDAnalysis/lib/c_distances.pyx":128 * result.data, distnum) * - * def coord_transform(numpy.ndarray coords, # <<<<<<<<<<<<<< - * numpy.ndarray box): - * cdef int numcoords + * def coord_transform(float[:,:] coords, # <<<<<<<<<<<<<< + * float[:,:] box): + * cdef int numcoords, size */ - __pyx_tuple__43 = PyTuple_Pack(3, __pyx_n_s_coords, __pyx_n_s_box, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_tuple__43 = PyTuple_Pack(4, __pyx_n_s_coords, __pyx_n_s_box, __pyx_n_s_numcoords, __pyx_n_s_size); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 128, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__43); __Pyx_GIVEREF(__pyx_tuple__43); - __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(2, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__43, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_coord_transform, 128, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__43, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_coord_transform, 128, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(0, 128, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":136 - * box.data) + /* "MDAnalysis/lib/c_distances.pyx":138 + * &box[0,0]) * * def calc_bond_distance(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray results): */ - __pyx_tuple__45 = PyTuple_Pack(4, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(0, 136, __pyx_L1_error) + __pyx_tuple__45 = PyTuple_Pack(4, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__45); __Pyx_GIVEREF(__pyx_tuple__45); - __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__45, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_bond_distance, 136, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) __PYX_ERR(0, 136, __pyx_L1_error) + __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__45, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_bond_distance, 138, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) __PYX_ERR(0, 138, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":146 + /* "MDAnalysis/lib/c_distances.pyx":148 * results.data) * * def calc_bond_distance_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray box, */ - __pyx_tuple__47 = PyTuple_Pack(5, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(0, 146, __pyx_L1_error) + __pyx_tuple__47 = PyTuple_Pack(5, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__47); __Pyx_GIVEREF(__pyx_tuple__47); - __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(4, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__47, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_bond_distance_ortho, 146, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(0, 146, __pyx_L1_error) + __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(4, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__47, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_bond_distance_ortho, 148, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(0, 148, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":158 + /* "MDAnalysis/lib/c_distances.pyx":160 * results.data) * * def calc_bond_distance_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray box, */ - __pyx_tuple__49 = PyTuple_Pack(5, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 158, __pyx_L1_error) + __pyx_tuple__49 = PyTuple_Pack(5, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 160, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__49); __Pyx_GIVEREF(__pyx_tuple__49); - __pyx_codeobj__50 = (PyObject*)__Pyx_PyCode_New(4, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_bond_distance_triclinic, 158, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__50)) __PYX_ERR(0, 158, __pyx_L1_error) + __pyx_codeobj__50 = (PyObject*)__Pyx_PyCode_New(4, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_bond_distance_triclinic, 160, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__50)) __PYX_ERR(0, 160, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":170 + /* "MDAnalysis/lib/c_distances.pyx":172 * results.data) * * def calc_angle(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_tuple__51 = PyTuple_Pack(5, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(0, 170, __pyx_L1_error) + __pyx_tuple__51 = PyTuple_Pack(5, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(0, 172, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__51); __Pyx_GIVEREF(__pyx_tuple__51); - __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(4, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__51, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_angle, 170, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(0, 170, __pyx_L1_error) + __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(4, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__51, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_angle, 172, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(0, 172, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":182 + /* "MDAnalysis/lib/c_distances.pyx":184 * results.data) * * def calc_angle_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_tuple__53 = PyTuple_Pack(6, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_tuple__53 = PyTuple_Pack(6, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(0, 184, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__53); __Pyx_GIVEREF(__pyx_tuple__53); - __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(5, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__53, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_angle_ortho, 182, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(5, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__53, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_angle_ortho, 184, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(0, 184, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":196 + /* "MDAnalysis/lib/c_distances.pyx":198 * results.data) * * def calc_angle_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_tuple__55 = PyTuple_Pack(6, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__55)) __PYX_ERR(0, 196, __pyx_L1_error) + __pyx_tuple__55 = PyTuple_Pack(6, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__55)) __PYX_ERR(0, 198, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__55); __Pyx_GIVEREF(__pyx_tuple__55); - __pyx_codeobj__56 = (PyObject*)__Pyx_PyCode_New(5, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__55, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_angle_triclinic, 196, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__56)) __PYX_ERR(0, 196, __pyx_L1_error) + __pyx_codeobj__56 = (PyObject*)__Pyx_PyCode_New(5, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__55, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_angle_triclinic, 198, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__56)) __PYX_ERR(0, 198, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":210 + /* "MDAnalysis/lib/c_distances.pyx":212 * results.data) * * def calc_dihedral(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_tuple__57 = PyTuple_Pack(6, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_coords4, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__57)) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_tuple__57 = PyTuple_Pack(6, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_coords4, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__57)) __PYX_ERR(0, 212, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__57); __Pyx_GIVEREF(__pyx_tuple__57); - __pyx_codeobj__58 = (PyObject*)__Pyx_PyCode_New(5, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__57, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_dihedral, 210, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__58)) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_codeobj__58 = (PyObject*)__Pyx_PyCode_New(5, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__57, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_dihedral, 212, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__58)) __PYX_ERR(0, 212, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":223 + /* "MDAnalysis/lib/c_distances.pyx":225 * results.data) * * def calc_dihedral_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_tuple__59 = PyTuple_Pack(7, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_coords4, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__59)) __PYX_ERR(0, 223, __pyx_L1_error) + __pyx_tuple__59 = PyTuple_Pack(7, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_coords4, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__59)) __PYX_ERR(0, 225, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__59); __Pyx_GIVEREF(__pyx_tuple__59); - __pyx_codeobj__60 = (PyObject*)__Pyx_PyCode_New(6, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__59, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_dihedral_ortho, 223, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__60)) __PYX_ERR(0, 223, __pyx_L1_error) + __pyx_codeobj__60 = (PyObject*)__Pyx_PyCode_New(6, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__59, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_dihedral_ortho, 225, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__60)) __PYX_ERR(0, 225, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":238 + /* "MDAnalysis/lib/c_distances.pyx":240 * results.data) * * def calc_dihedral_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_tuple__61 = PyTuple_Pack(7, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_coords4, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__61)) __PYX_ERR(0, 238, __pyx_L1_error) + __pyx_tuple__61 = PyTuple_Pack(7, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_coords3, __pyx_n_s_coords4, __pyx_n_s_box, __pyx_n_s_results, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__61)) __PYX_ERR(0, 240, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__61); __Pyx_GIVEREF(__pyx_tuple__61); - __pyx_codeobj__62 = (PyObject*)__Pyx_PyCode_New(6, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__61, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_dihedral_triclinic, 238, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__62)) __PYX_ERR(0, 238, __pyx_L1_error) + __pyx_codeobj__62 = (PyObject*)__Pyx_PyCode_New(6, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__61, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_calc_dihedral_triclinic, 240, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__62)) __PYX_ERR(0, 240, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":253 + /* "MDAnalysis/lib/c_distances.pyx":255 * results.data) * * def ortho_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< * numpy.ndarray box, numpy.ndarray box_inverse): * cdef int numcoords */ - __pyx_tuple__63 = PyTuple_Pack(4, __pyx_n_s_coords, __pyx_n_s_box, __pyx_n_s_box_inverse, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__63)) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_tuple__63 = PyTuple_Pack(4, __pyx_n_s_coords, __pyx_n_s_box, __pyx_n_s_box_inverse, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__63)) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__63); __Pyx_GIVEREF(__pyx_tuple__63); - __pyx_codeobj__64 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_ortho_pbc, 253, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__64)) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_codeobj__64 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__63, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_ortho_pbc, 255, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__64)) __PYX_ERR(0, 255, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":261 + /* "MDAnalysis/lib/c_distances.pyx":263 * box.data, box_inverse.data) * * def triclinic_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< * numpy.ndarray box, numpy.ndarray box_inverse): * cdef int numcoords */ - __pyx_tuple__65 = PyTuple_Pack(4, __pyx_n_s_coords, __pyx_n_s_box, __pyx_n_s_box_inverse, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__65)) __PYX_ERR(0, 261, __pyx_L1_error) + __pyx_tuple__65 = PyTuple_Pack(4, __pyx_n_s_coords, __pyx_n_s_box, __pyx_n_s_box_inverse, __pyx_n_s_numcoords); if (unlikely(!__pyx_tuple__65)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__65); __Pyx_GIVEREF(__pyx_tuple__65); - __pyx_codeobj__66 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__65, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_triclinic_pbc, 261, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__66)) __PYX_ERR(0, 261, __pyx_L1_error) + __pyx_codeobj__66 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__65, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_triclinic_pbc, 263, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__66)) __PYX_ERR(0, 263, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":271 + /* "MDAnalysis/lib/c_distances.pyx":273 * * @cython.boundscheck(False) * def contact_matrix_no_pbc(coord, sparse_contacts, cutoff): # <<<<<<<<<<<<<< * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 */ - __pyx_tuple__67 = PyTuple_Pack(10, __pyx_n_s_coord, __pyx_n_s_sparse_contacts, __pyx_n_s_cutoff, __pyx_n_s_rows, __pyx_n_s_cutoff2, __pyx_n_s_coord_view, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_rr, __pyx_n_s_dist); if (unlikely(!__pyx_tuple__67)) __PYX_ERR(0, 271, __pyx_L1_error) + __pyx_tuple__67 = PyTuple_Pack(10, __pyx_n_s_coord, __pyx_n_s_sparse_contacts, __pyx_n_s_cutoff, __pyx_n_s_rows, __pyx_n_s_cutoff2, __pyx_n_s_coord_view, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_rr, __pyx_n_s_dist); if (unlikely(!__pyx_tuple__67)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__67); __Pyx_GIVEREF(__pyx_tuple__67); - __pyx_codeobj__68 = (PyObject*)__Pyx_PyCode_New(3, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__67, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_contact_matrix_no_pbc, 271, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__68)) __PYX_ERR(0, 271, __pyx_L1_error) + __pyx_codeobj__68 = (PyObject*)__Pyx_PyCode_New(3, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__67, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_contact_matrix_no_pbc, 273, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__68)) __PYX_ERR(0, 273, __pyx_L1_error) - /* "MDAnalysis/lib/c_distances.pyx":292 + /* "MDAnalysis/lib/c_distances.pyx":294 * * @cython.boundscheck(False) * def contact_matrix_pbc(coord, sparse_contacts, box, cutoff): # <<<<<<<<<<<<<< * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 */ - __pyx_tuple__69 = PyTuple_Pack(13, __pyx_n_s_coord, __pyx_n_s_sparse_contacts, __pyx_n_s_box, __pyx_n_s_cutoff, __pyx_n_s_rows, __pyx_n_s_cutoff2, __pyx_n_s_coord_view, __pyx_n_s_box_view, __pyx_n_s_box_inv, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_rr, __pyx_n_s_dist); if (unlikely(!__pyx_tuple__69)) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_tuple__69 = PyTuple_Pack(13, __pyx_n_s_coord, __pyx_n_s_sparse_contacts, __pyx_n_s_box, __pyx_n_s_cutoff, __pyx_n_s_rows, __pyx_n_s_cutoff2, __pyx_n_s_coord_view, __pyx_n_s_box_view, __pyx_n_s_box_inv, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_rr, __pyx_n_s_dist); if (unlikely(!__pyx_tuple__69)) __PYX_ERR(0, 294, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__69); __Pyx_GIVEREF(__pyx_tuple__69); - __pyx_codeobj__70 = (PyObject*)__Pyx_PyCode_New(4, 0, 13, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__69, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_contact_matrix_pbc, 292, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__70)) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_codeobj__70 = (PyObject*)__Pyx_PyCode_New(4, 0, 13, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__69, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_c_distances_pyx, __pyx_n_s_contact_matrix_pbc, 294, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__70)) __PYX_ERR(0, 294, __pyx_L1_error) /* "View.MemoryView":285 * return self.name @@ -22879,8 +22983,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -23140,169 +23244,169 @@ if (!__Pyx_RefNanny) { /* "MDAnalysis/lib/c_distances.pyx":128 * result.data, distnum) * - * def coord_transform(numpy.ndarray coords, # <<<<<<<<<<<<<< - * numpy.ndarray box): - * cdef int numcoords + * def coord_transform(float[:,:] coords, # <<<<<<<<<<<<<< + * float[:,:] box): + * cdef int numcoords, size */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_13coord_transform, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 128, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_coord_transform, __pyx_t_1) < 0) __PYX_ERR(0, 128, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":136 - * box.data) + /* "MDAnalysis/lib/c_distances.pyx":138 + * &box[0,0]) * * def calc_bond_distance(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray results): */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_15calc_bond_distance, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_15calc_bond_distance, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_bond_distance, __pyx_t_1) < 0) __PYX_ERR(0, 136, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_bond_distance, __pyx_t_1) < 0) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":146 + /* "MDAnalysis/lib/c_distances.pyx":148 * results.data) * * def calc_bond_distance_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray box, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_17calc_bond_distance_ortho, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_17calc_bond_distance_ortho, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_bond_distance_ortho, __pyx_t_1) < 0) __PYX_ERR(0, 146, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_bond_distance_ortho, __pyx_t_1) < 0) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":158 + /* "MDAnalysis/lib/c_distances.pyx":160 * results.data) * * def calc_bond_distance_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray box, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_19calc_bond_distance_triclinic, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_19calc_bond_distance_triclinic, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_bond_distance_triclinic, __pyx_t_1) < 0) __PYX_ERR(0, 158, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_bond_distance_triclinic, __pyx_t_1) < 0) __PYX_ERR(0, 160, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":170 + /* "MDAnalysis/lib/c_distances.pyx":172 * results.data) * * def calc_angle(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_21calc_angle, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 170, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_21calc_angle, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 172, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_angle, __pyx_t_1) < 0) __PYX_ERR(0, 170, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_angle, __pyx_t_1) < 0) __PYX_ERR(0, 172, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":182 + /* "MDAnalysis/lib/c_distances.pyx":184 * results.data) * * def calc_angle_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_23calc_angle_ortho, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_23calc_angle_ortho, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 184, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_angle_ortho, __pyx_t_1) < 0) __PYX_ERR(0, 182, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_angle_ortho, __pyx_t_1) < 0) __PYX_ERR(0, 184, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":196 + /* "MDAnalysis/lib/c_distances.pyx":198 * results.data) * * def calc_angle_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_25calc_angle_triclinic, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 196, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_25calc_angle_triclinic, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 198, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_angle_triclinic, __pyx_t_1) < 0) __PYX_ERR(0, 196, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_angle_triclinic, __pyx_t_1) < 0) __PYX_ERR(0, 198, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":210 + /* "MDAnalysis/lib/c_distances.pyx":212 * results.data) * * def calc_dihedral(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_27calc_dihedral, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_27calc_dihedral, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_dihedral, __pyx_t_1) < 0) __PYX_ERR(0, 210, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_dihedral, __pyx_t_1) < 0) __PYX_ERR(0, 212, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":223 + /* "MDAnalysis/lib/c_distances.pyx":225 * results.data) * * def calc_dihedral_ortho(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_29calc_dihedral_ortho, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 223, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_29calc_dihedral_ortho, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 225, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_dihedral_ortho, __pyx_t_1) < 0) __PYX_ERR(0, 223, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_dihedral_ortho, __pyx_t_1) < 0) __PYX_ERR(0, 225, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":238 + /* "MDAnalysis/lib/c_distances.pyx":240 * results.data) * * def calc_dihedral_triclinic(numpy.ndarray coords1, # <<<<<<<<<<<<<< * numpy.ndarray coords2, * numpy.ndarray coords3, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_31calc_dihedral_triclinic, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 238, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_31calc_dihedral_triclinic, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 240, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_dihedral_triclinic, __pyx_t_1) < 0) __PYX_ERR(0, 238, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_calc_dihedral_triclinic, __pyx_t_1) < 0) __PYX_ERR(0, 240, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":253 + /* "MDAnalysis/lib/c_distances.pyx":255 * results.data) * * def ortho_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< * numpy.ndarray box, numpy.ndarray box_inverse): * cdef int numcoords */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_33ortho_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_33ortho_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_ortho_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 253, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ortho_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":261 + /* "MDAnalysis/lib/c_distances.pyx":263 * box.data, box_inverse.data) * * def triclinic_pbc(numpy.ndarray coords, # <<<<<<<<<<<<<< * numpy.ndarray box, numpy.ndarray box_inverse): * cdef int numcoords */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_35triclinic_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 261, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_35triclinic_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_triclinic_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 261, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_triclinic_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":271 + /* "MDAnalysis/lib/c_distances.pyx":273 * * @cython.boundscheck(False) * def contact_matrix_no_pbc(coord, sparse_contacts, cutoff): # <<<<<<<<<<<<<< * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_37contact_matrix_no_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 271, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_37contact_matrix_no_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_contact_matrix_no_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 271, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_contact_matrix_no_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/c_distances.pyx":292 + /* "MDAnalysis/lib/c_distances.pyx":294 * * @cython.boundscheck(False) * def contact_matrix_pbc(coord, sparse_contacts, box, cutoff): # <<<<<<<<<<<<<< * cdef int rows = len(coord) * cdef double cutoff2 = cutoff ** 2 */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_39contact_matrix_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 292, __pyx_L1_error) + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_11c_distances_39contact_matrix_pbc, NULL, __pyx_n_s_MDAnalysis_lib_c_distances); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_contact_matrix_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 292, __pyx_L1_error) + if (PyDict_SetItem(__pyx_d, __pyx_n_s_contact_matrix_pbc, __pyx_t_1) < 0) __PYX_ERR(0, 294, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "MDAnalysis/lib/c_distances.pyx":1 @@ -23709,6 +23813,12 @@ static CYTHON_INLINE long __Pyx_div_long(long a, long b) { return q; } +/* BufferIndexError */ +static void __Pyx_RaiseBufferIndexError(int axis) { + PyErr_Format(PyExc_IndexError, + "Out of bounds on buffer access (axis %d)", axis); +} + /* MemviewSliceInit */ static int __Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, @@ -24377,7 +24487,7 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -24392,7 +24502,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -24476,7 +24586,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -24635,6 +24745,9 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); @@ -24870,7 +24983,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -25021,14 +25134,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } +/* IsLittleEndian */ + static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ + static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif + count = *t++ - '0'; + while (*t >= '0' && *t < '9') { + count *= 10; + count += *t++ - '0'; } } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); - } + *ts = t; + return count; } - -/* CIntFromPyVerify */ - #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparseable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; } - -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { - const long neg_one = (long) -1, const_zero = (long) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; #ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; #endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); #ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); #endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; } } - -/* Declarations */ - #if CYTHON_CCOMPLEX - #ifdef __cplusplus - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - return ::std::complex< float >(x, y); +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; } - #else - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - return x + y*(__pyx_t_float_complex)_Complex_I; +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; } - #endif -#else - static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { - __pyx_t_float_complex z; - z.real = x; - z.imag = y; - return z; + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; } -#endif - -/* Arithmetic */ - #if CYTHON_CCOMPLEX -#else - static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - return (a.real == b.real) && (a.imag == b.imag); + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real + b.real; - z.imag = a.imag + b.imag; - return z; + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real - b.real; - z.imag = a.imag - b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - z.real = a.real * b.real - a.imag * b.imag; - z.imag = a.real * b.imag + a.imag * b.real; - return z; - } - #if 1 - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - if (b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); - } else if (fabsf(b.real) >= fabsf(b.imag)) { - if (b.real == 0 && b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); - } else { - float r = b.imag / b.real; - float s = 1.0 / (b.real + b.imag * r); - return __pyx_t_float_complex_from_parts( - (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); - } - } else { - float r = b.real / b.imag; - float s = 1.0 / (b.imag + b.real * r); - return __pyx_t_float_complex_from_parts( - (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); - } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; } - #else - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - if (b.imag == 0) { - return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); - } else { - float denom = b.real * b.real + b.imag * b.imag; - return __pyx_t_float_complex_from_parts( - (a.real * b.real + a.imag * b.imag) / denom, - (a.imag * b.real - a.real * b.imag) / denom); - } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); } - #endif - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { - __pyx_t_float_complex z; - z.real = -a.real; - z.imag = -a.imag; - return z; + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); } - static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { - return (a.real == 0) && (a.imag == 0); + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { - __pyx_t_float_complex z; - z.real = a.real; - z.imag = -a.imag; - return z; + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; } - #if 1 - static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { - #if !defined(HAVE_HYPOT) || defined(_MSC_VER) - return sqrtf(z.real*z.real + z.imag*z.imag); - #else - return hypotf(z.real, z.imag); - #endif - } - static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { - __pyx_t_float_complex z; - float r, lnr, theta, z_r, z_theta; - if (b.imag == 0 && b.real == (int)b.real) { - if (b.real < 0) { - float denom = a.real * a.real + a.imag * a.imag; - a.real = a.real / denom; - a.imag = -a.imag / denom; - b.real = -b.real; - } - switch ((int)b.real) { - case 0: - z.real = 1; - z.imag = 0; - return z; - case 1: - return a; - case 2: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(a, a); - case 3: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(z, a); - case 4: - z = __Pyx_c_prod_float(a, a); - return __Pyx_c_prod_float(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if (b.imag == 0) { - z.real = powf(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2f(0, -1); - } - } else { - r = __Pyx_c_abs_float(a); - theta = atan2f(a.imag, a.real); - } - lnr = logf(r); - z_r = expf(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cosf(z_theta); - z.imag = z_r * sinf(z_theta); - return z; + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; } - #endif -#endif - -/* Declarations */ - #if CYTHON_CCOMPLEX - #ifdef __cplusplus - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return ::std::complex< double >(x, y); - } - #else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return x + y*(__pyx_t_double_complex)_Complex_I; + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } } - #endif -#else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - __pyx_t_double_complex z; - z.real = x; - z.imag = y; - return z; + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static PyObject * +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number; + int ndim = ctx->head->field->type->ndim; +; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return NULL; } -#endif - -/* Arithmetic */ - #if CYTHON_CCOMPLEX -#else - static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - return (a.real == b.real) && (a.imag == b.imag); + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) + return PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + if (*ts != ',' && *ts != ')') + return PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + if (*ts == ',') ts++; + i++; } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real + b.real; - z.imag = a.imag + b.imag; - return z; + if (i != ndim) + return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return NULL; } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real - b.real; - z.imag = a.imag - b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real * b.real - a.imag * b.imag; - z.imag = a.real * b.imag + a.imag * b.real; - return z; - } - #if 1 - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); - } else if (fabs(b.real) >= fabs(b.imag)) { - if (b.real == 0 && b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); - } else { - double r = b.imag / b.real; - double s = 1.0 / (b.real + b.imag * r); - return __pyx_t_double_complex_from_parts( - (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); - } - } else { - double r = b.real / b.imag; - double s = 1.0 / (b.imag + b.real * r); - return __pyx_t_double_complex_from_parts( - (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return Py_None; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if (ctx->enc_type == *ts && got_Z == ctx->is_complex && + ctx->enc_packmode == ctx->new_packmode) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; } } - #else - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; } else { - double denom = b.real * b.real + b.imag * b.imag; - return __pyx_t_double_complex_from_parts( - (a.real * b.real + a.imag * b.imag) / denom, - (a.imag * b.real - a.real * b.imag) / denom); + return 0; } } - #endif - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = -a.real; - z.imag = -a.imag; - return z; - } - static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { - return (a.real == 0) && (a.imag == 0); - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = a.real; - z.imag = -a.imag; - return z; + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; } - #if 1 - static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { - #if !defined(HAVE_HYPOT) || defined(_MSC_VER) - return sqrt(z.real*z.real + z.imag*z.imag); - #else - return hypot(z.real, z.imag); - #endif + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - double r, lnr, theta, z_r, z_theta; - if (b.imag == 0 && b.real == (int)b.real) { - if (b.real < 0) { - double denom = a.real * a.real + a.imag * a.imag; - a.real = a.real / denom; - a.imag = -a.imag / denom; - b.real = -b.real; + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (buf->strides[dim] != sizeof(void *)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; } - switch ((int)b.real) { - case 0: - z.real = 1; - z.imag = 0; - return z; - case 1: - return a; - case 2: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(a, a); - case 3: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, a); - case 4: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if (b.imag == 0) { - z.real = pow(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2(0, -1); - } - } else { - r = __Pyx_c_abs_double(a); - theta = atan2(a.imag, a.real); + } else if (buf->strides[dim] != buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; } - lnr = log(r); - z_r = exp(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cos(z_theta); - z.imag = z_r * sin(z_theta); - return z; } - #endif -#endif - -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { - const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum NPY_TYPES) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (stride < buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } } } else { - if (sizeof(enum NPY_TYPES) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif + if (spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (spec & (__Pyx_MEMVIEW_PTR)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (buf->suboffsets) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; } } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), - little, !is_unsigned); - } + return 1; +fail: + return 0; } - -/* MemviewSliceCopyTemplate */ - static __Pyx_memviewslice -__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, - const char *mode, int ndim, - size_t sizeof_dtype, int contig_flag, - int dtype_is_object) +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) { - __Pyx_RefNannyDeclarations - int i; - __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; - struct __pyx_memoryview_obj *from_memview = from_mvs->memview; - Py_buffer *buf = &from_memview->view; - PyObject *shape_tuple = NULL; - PyObject *temp_int = NULL; - struct __pyx_array_obj *array_obj = NULL; - struct __pyx_memoryview_obj *memview_obj = NULL; - __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); - for (i = 0; i < ndim; i++) { - if (from_mvs->suboffsets[i] >= 0) { - PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " - "indirect dimensions (axis %d)", i); + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (buf->suboffsets && buf->suboffsets[dim] >= 0) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); goto fail; } } - shape_tuple = PyTuple_New(ndim); - if (unlikely(!shape_tuple)) { - goto fail; - } - __Pyx_GOTREF(shape_tuple); - for(i = 0; i < ndim; i++) { - temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); - if(unlikely(!temp_int)) { + if (spec & __Pyx_MEMVIEW_PTR) { + if (!buf->suboffsets || (buf->suboffsets && buf->suboffsets[dim] < 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); goto fail; - } else { - PyTuple_SET_ITEM(shape_tuple, i, temp_int); - temp_int = NULL; } } - array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); - if (unlikely(!array_obj)) { + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) + { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (buf->ndim != ndim) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); goto fail; } - __Pyx_GOTREF(array_obj); - memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( - (PyObject *) array_obj, contig_flag, - dtype_is_object, - from_mvs->memview->typeinfo); - if (unlikely(!memview_obj)) + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if ((unsigned) buf->itemsize != dtype->size) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); goto fail; - if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + } + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (!__pyx_check_strides(buf, i, ndim, spec)) + goto fail; + if (!__pyx_check_suboffsets(buf, i, ndim, spec)) + goto fail; + } + if (buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag)) goto fail; - if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, - dtype_is_object) < 0)) + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { goto fail; + } + retval = 0; goto no_fail; fail: - __Pyx_XDECREF(new_mvs.memview); - new_mvs.memview = NULL; - new_mvs.data = NULL; + Py_XDECREF(new_memview); + retval = -1; no_fail: - __Pyx_XDECREF(shape_tuple); - __Pyx_XDECREF(temp_int); - __Pyx_XDECREF(array_obj); __Pyx_RefNannyFinishContext(); - return new_mvs; + return retval; } -/* CIntFromPy */ - static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_float(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_float, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* MemviewDtypeToObject */ + static CYTHON_INLINE PyObject *__pyx_memview_get_float(const char *itemp) { + return (PyObject *) PyFloat_FromDouble(*(float *) itemp); +} +static CYTHON_INLINE int __pyx_memview_set_float(const char *itemp, PyObject *obj) { + float value = __pyx_PyFloat_AsFloat(obj); + if ((value == (float)-1) && PyErr_Occurred()) + return 0; + *(float *) itemp = value; + return 1; +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { + if (is_unsigned) { if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif - } } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); #endif - return (int) -1; } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } } -/* CIntFromPy */ - static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { + if (is_unsigned) { if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) - case -2: - if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif - } } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); #endif - return (long) -1; } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } } -/* CIntFromPy */ - static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { - const char neg_one = (char) -1, const_zero = (char) 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(char) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = 1.0 / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); } - return (char) val; + } else { + float r = b.real / b.imag; + float s = 1.0 / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (char) 0; - case 1: __PYX_VERIFY_RETURN_INT(char, digit, digits[0]) - case 2: - if (8 * sizeof(char) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) >= 2 * PyLong_SHIFT) { - return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(char) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) >= 3 * PyLong_SHIFT) { - return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(char) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) >= 4 * PyLong_SHIFT) { - return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (char) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(char) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (char) 0; - case -1: __PYX_VERIFY_RETURN_INT(char, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(char, digit, +digits[0]) - case -2: - if (8 * sizeof(char) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { - return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(char) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { - return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { - return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(char) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { - return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { - return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(char) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { - return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - } -#endif - if (sizeof(char) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - char val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0, -1); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); } -#endif - return (char) -1; + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; } - } else { - char val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (char) -1; - val = __Pyx_PyInt_As_char(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to char"); - return (char) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to char"); - return (char) -1; -} + #endif +#endif -/* IsLittleEndian */ - static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) -{ - union { - uint32_t u32; - uint8_t u8[4]; - } S; - S.u32 = 0x01020304; - return S.u8[0] == 4; -} - -/* BufferFormatCheck */ - static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, - __Pyx_BufFmt_StackElem* stack, - __Pyx_TypeInfo* type) { - stack[0].field = &ctx->root; - stack[0].parent_offset = 0; - ctx->root.type = type; - ctx->root.name = "buffer dtype"; - ctx->root.offset = 0; - ctx->head = stack; - ctx->head->field = &ctx->root; - ctx->fmt_offset = 0; - ctx->head->parent_offset = 0; - ctx->new_packmode = '@'; - ctx->enc_packmode = '@'; - ctx->new_count = 1; - ctx->enc_count = 0; - ctx->enc_type = 0; - ctx->is_complex = 0; - ctx->is_valid_array = 0; - ctx->struct_alignment = 0; - while (type->typegroup == 'S') { - ++ctx->head; - ctx->head->field = type->fields; - ctx->head->parent_offset = 0; - type = type->fields->type; - } -} -static int __Pyx_BufFmt_ParseNumber(const char** ts) { - int count; - const char* t = *ts; - if (*t < '0' || *t > '9') { - return -1; - } else { - count = *t++ - '0'; - while (*t >= '0' && *t < '9') { - count *= 10; - count += *t++ - '0'; - } - } - *ts = t; - return count; -} -static int __Pyx_BufFmt_ExpectNumber(const char **ts) { - int number = __Pyx_BufFmt_ParseNumber(ts); - if (number == -1) - PyErr_Format(PyExc_ValueError,\ - "Does not understand character buffer dtype format string ('%c')", **ts); - return number; -} -static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { - PyErr_Format(PyExc_ValueError, - "Unexpected format string character: '%c'", ch); -} -static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { - switch (ch) { - case 'c': return "'char'"; - case 'b': return "'signed char'"; - case 'B': return "'unsigned char'"; - case 'h': return "'short'"; - case 'H': return "'unsigned short'"; - case 'i': return "'int'"; - case 'I': return "'unsigned int'"; - case 'l': return "'long'"; - case 'L': return "'unsigned long'"; - case 'q': return "'long long'"; - case 'Q': return "'unsigned long long'"; - case 'f': return (is_complex ? "'complex float'" : "'float'"); - case 'd': return (is_complex ? "'complex double'" : "'double'"); - case 'g': return (is_complex ? "'complex long double'" : "'long double'"); - case 'T': return "a struct"; - case 'O': return "Python object"; - case 'P': return "a pointer"; - case 's': case 'p': return "a string"; - case 0: return "end"; - default: return "unparseable format string"; - } -} -static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { - switch (ch) { - case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return 2; - case 'i': case 'I': case 'l': case 'L': return 4; - case 'q': case 'Q': return 8; - case 'f': return (is_complex ? 8 : 4); - case 'd': return (is_complex ? 16 : 8); - case 'g': { - PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); - return 0; +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); } - case 'O': case 'P': return sizeof(void*); - default: - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; } -} -static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { - switch (ch) { - case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return sizeof(short); - case 'i': case 'I': return sizeof(int); - case 'l': case 'L': return sizeof(long); - #ifdef HAVE_LONG_LONG - case 'q': case 'Q': return sizeof(PY_LONG_LONG); - #endif - case 'f': return sizeof(float) * (is_complex ? 2 : 1); - case 'd': return sizeof(double) * (is_complex ? 2 : 1); - case 'g': return sizeof(long double) * (is_complex ? 2 : 1); - case 'O': case 'P': return sizeof(void*); - default: { - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; } - } -} -typedef struct { char c; short x; } __Pyx_st_short; -typedef struct { char c; int x; } __Pyx_st_int; -typedef struct { char c; long x; } __Pyx_st_long; -typedef struct { char c; float x; } __Pyx_st_float; -typedef struct { char c; double x; } __Pyx_st_double; -typedef struct { char c; long double x; } __Pyx_st_longdouble; -typedef struct { char c; void *x; } __Pyx_st_void_p; -#ifdef HAVE_LONG_LONG -typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; -#endif -static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { - switch (ch) { - case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); - case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); - case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); -#ifdef HAVE_LONG_LONG - case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); #endif - case 'f': return sizeof(__Pyx_st_float) - sizeof(float); - case 'd': return sizeof(__Pyx_st_double) - sizeof(double); - case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); - case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); - default: - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); } -} -/* These are for computing the padding at the end of the struct to align - on the first member of the struct. This will probably the same as above, - but we don't have any guarantees. - */ -typedef struct { short x; char c; } __Pyx_pad_short; -typedef struct { int x; char c; } __Pyx_pad_int; -typedef struct { long x; char c; } __Pyx_pad_long; -typedef struct { float x; char c; } __Pyx_pad_float; -typedef struct { double x; char c; } __Pyx_pad_double; -typedef struct { long double x; char c; } __Pyx_pad_longdouble; -typedef struct { void *x; char c; } __Pyx_pad_void_p; -#ifdef HAVE_LONG_LONG -typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; -#endif -static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { - switch (ch) { - case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; - case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); - case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); - case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); -#ifdef HAVE_LONG_LONG - case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); -#endif - case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); - case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); - case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); - case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); - default: - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; } -} -static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { - switch (ch) { - case 'c': - return 'H'; - case 'b': case 'h': case 'i': - case 'l': case 'q': case 's': case 'p': - return 'I'; - case 'B': case 'H': case 'I': case 'L': case 'Q': - return 'U'; - case 'f': case 'd': case 'g': - return (is_complex ? 'C' : 'R'); - case 'O': - return 'O'; - case 'P': - return 'P'; - default: { - __Pyx_BufFmt_RaiseUnexpectedChar(ch); - return 0; + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; } - } -} -static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { - if (ctx->head == NULL || ctx->head->field == &ctx->root) { - const char* expected; - const char* quote; - if (ctx->head == NULL) { - expected = "end"; - quote = ""; - } else { - expected = ctx->head->field->type->name; - quote = "'"; + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; } - PyErr_Format(PyExc_ValueError, - "Buffer dtype mismatch, expected %s%s%s but got %s", - quote, expected, quote, - __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); - } else { - __Pyx_StructField* field = ctx->head->field; - __Pyx_StructField* parent = (ctx->head - 1)->field; - PyErr_Format(PyExc_ValueError, - "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", - field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), - parent->type->name, field->name); - } -} -static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { - char group; - size_t size, offset, arraysize = 1; - if (ctx->enc_type == 0) return 0; - if (ctx->head->field->type->arraysize[0]) { - int i, ndim = 0; - if (ctx->enc_type == 's' || ctx->enc_type == 'p') { - ctx->is_valid_array = ctx->head->field->type->ndim == 1; - ndim = 1; - if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { - PyErr_Format(PyExc_ValueError, - "Expected a dimension of size %zu, got %zu", - ctx->head->field->type->arraysize[0], ctx->enc_count); - return -1; + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = 1.0 / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = 1.0 / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } } - if (!ctx->is_valid_array) { - PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", - ctx->head->field->type->ndim, ndim); - return -1; - } - for (i = 0; i < ctx->head->field->type->ndim; i++) { - arraysize *= ctx->head->field->type->arraysize[i]; - } - ctx->is_valid_array = 0; - ctx->enc_count = 1; - } - group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); - do { - __Pyx_StructField* field = ctx->head->field; - __Pyx_TypeInfo* type = field->type; - if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { - size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); - } else { - size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } } - if (ctx->enc_packmode == '@') { - size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); - size_t align_mod_offset; - if (align_at == 0) return -1; - align_mod_offset = ctx->fmt_offset % align_at; - if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; - if (ctx->struct_alignment == 0) - ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, - ctx->is_complex); + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; } - if (type->size != size || type->typegroup != group) { - if (type->typegroup == 'C' && type->fields != NULL) { - size_t parent_offset = ctx->head->parent_offset + field->offset; - ++ctx->head; - ctx->head->field = type->fields; - ctx->head->parent_offset = parent_offset; - continue; - } - if ((type->typegroup == 'H' || group == 'H') && type->size == size) { - } else { - __Pyx_BufFmt_RaiseExpected(ctx); - return -1; - } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); } - offset = ctx->head->parent_offset + field->offset; - if (ctx->fmt_offset != offset) { - PyErr_Format(PyExc_ValueError, - "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", - (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); - return -1; + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; } - ctx->fmt_offset += size; - if (arraysize) - ctx->fmt_offset += (arraysize - 1) * size; - --ctx->enc_count; - while (1) { - if (field == &ctx->root) { - ctx->head = NULL; - if (ctx->enc_count != 0) { - __Pyx_BufFmt_RaiseExpected(ctx); - return -1; + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0, -1); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif } - break; - } - ctx->head->field = ++field; - if (field->type == NULL) { - --ctx->head; - field = ctx->head->field; - continue; - } else if (field->type->typegroup == 'S') { - size_t parent_offset = ctx->head->parent_offset + field->offset; - if (field->type->fields->type == NULL) continue; - field = field->type->fields; - ++ctx->head; - ctx->head->field = field; - ctx->head->parent_offset = parent_offset; - break; - } else { - break; - } } - } while (ctx->enc_count); - ctx->enc_type = 0; - ctx->is_complex = 0; - return 0; + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); + } } -static PyObject * -__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) { - const char *ts = *tsp; - int i = 0, number; - int ndim = ctx->head->field->type->ndim; -; - ++ts; - if (ctx->new_count != 1) { - PyErr_SetString(PyExc_ValueError, - "Cannot handle repeated arrays in format string"); - return NULL; + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (from_mvs->suboffsets[i] >= 0) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } } - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - while (*ts && *ts != ')') { - switch (*ts) { - case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; - default: break; + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; } - number = __Pyx_BufFmt_ExpectNumber(&ts); - if (number == -1) return NULL; - if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) - return PyErr_Format(PyExc_ValueError, - "Expected a dimension of size %zu, got %d", - ctx->head->field->type->arraysize[i], number); - if (*ts != ',' && *ts != ')') - return PyErr_Format(PyExc_ValueError, - "Expected a comma in format string, got '%c'", *ts); - if (*ts == ',') ts++; - i++; } - if (i != ndim) - return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", - ctx->head->field->type->ndim, i); - if (!*ts) { - PyErr_SetString(PyExc_ValueError, - "Unexpected end of format string, expected ')'"); - return NULL; + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; } - ctx->is_valid_array = 1; - ctx->new_count = 1; - *tsp = ++ts; - return Py_None; + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; } -static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { - int got_Z = 0; - while (1) { - switch(*ts) { - case 0: - if (ctx->enc_type != 0 && ctx->head == NULL) { - __Pyx_BufFmt_RaiseExpected(ctx); - return NULL; - } - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - if (ctx->head != NULL) { - __Pyx_BufFmt_RaiseExpected(ctx); - return NULL; - } - return ts; - case ' ': - case '\r': - case '\n': - ++ts; - break; - case '<': - if (!__Pyx_Is_Little_Endian()) { - PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); - return NULL; - } - ctx->new_packmode = '='; - ++ts; - break; - case '>': - case '!': - if (__Pyx_Is_Little_Endian()) { - PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); - return NULL; + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; } - ctx->new_packmode = '='; - ++ts; - break; - case '=': - case '@': - case '^': - ctx->new_packmode = *ts++; - break; - case 'T': - { - const char* ts_after_sub; - size_t i, struct_count = ctx->new_count; - size_t struct_alignment = ctx->struct_alignment; - ctx->new_count = 1; - ++ts; - if (*ts != '{') { - PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); - return NULL; - } - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->enc_type = 0; - ctx->enc_count = 0; - ctx->struct_alignment = 0; - ++ts; - ts_after_sub = ts; - for (i = 0; i != struct_count; ++i) { - ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); - if (!ts_after_sub) return NULL; - } - ts = ts_after_sub; - if (struct_alignment) ctx->struct_alignment = struct_alignment; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } } - break; - case '}': { - size_t alignment = ctx->struct_alignment; - ++ts; - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->enc_type = 0; - if (alignment && ctx->fmt_offset % alignment) { - ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); - } +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; } - return ts; - case 'x': - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->fmt_offset += ctx->new_count; - ctx->new_count = 1; - ctx->enc_count = 0; - ctx->enc_type = 0; - ctx->enc_packmode = ctx->new_packmode; - ++ts; - break; - case 'Z': - got_Z = 1; - ++ts; - if (*ts != 'f' && *ts != 'd' && *ts != 'g') { - __Pyx_BufFmt_RaiseUnexpectedChar('Z'); - return NULL; + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; } - CYTHON_FALLTHROUGH; - case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': - case 'l': case 'L': case 'q': case 'Q': - case 'f': case 'd': case 'g': - case 'O': case 'p': - if (ctx->enc_type == *ts && got_Z == ctx->is_complex && - ctx->enc_packmode == ctx->new_packmode) { - ctx->enc_count += ctx->new_count; - ctx->new_count = 1; - got_Z = 0; - ++ts; - break; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } } - CYTHON_FALLTHROUGH; - case 's': - if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; - ctx->enc_count = ctx->new_count; - ctx->enc_packmode = ctx->new_packmode; - ctx->enc_type = *ts; - ctx->is_complex = got_Z; - ++ts; - ctx->new_count = 1; - got_Z = 0; - break; - case ':': - ++ts; - while(*ts != ':') ++ts; - ++ts; - break; - case '(': - if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; - break; - default: { - int number = __Pyx_BufFmt_ExpectNumber(&ts); - if (number == -1) return NULL; - ctx->new_count = (size_t)number; +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; } - } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; } -/* TypeInfoCompare */ - static int -__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) -{ - int i; - if (!a || !b) - return 0; - if (a == b) - return 1; - if (a->size != b->size || a->typegroup != b->typegroup || - a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { - if (a->typegroup == 'H' || b->typegroup == 'H') { - return a->size == b->size; +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { + const char neg_one = (char) -1, const_zero = (char) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(char) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) } else { - return 0; - } - } - if (a->ndim) { - for (i = 0; i < a->ndim; i++) - if (a->arraysize[i] != b->arraysize[i]) - return 0; - } - if (a->typegroup == 'S') { - if (a->flags != b->flags) - return 0; - if (a->fields || b->fields) { - if (!(a->fields && b->fields)) - return 0; - for (i = 0; a->fields[i].type && b->fields[i].type; i++) { - __Pyx_StructField *field_a = a->fields + i; - __Pyx_StructField *field_b = b->fields + i; - if (field_a->offset != field_b->offset || - !__pyx_typeinfo_cmp(field_a->type, field_b->type)) - return 0; + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; } - return !a->fields[i].type && !b->fields[i].type; + return (char) val; } - } - return 1; -} - -/* MemviewSliceValidateAndInit */ - static int -__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) -{ - if (buf->shape[dim] <= 1) - return 1; - if (buf->strides) { - if (spec & __Pyx_MEMVIEW_CONTIG) { - if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { - if (buf->strides[dim] != sizeof(void *)) { - PyErr_Format(PyExc_ValueError, - "Buffer is not indirectly contiguous " - "in dimension %d.", dim); - goto fail; - } - } else if (buf->strides[dim] != buf->itemsize) { - PyErr_SetString(PyExc_ValueError, - "Buffer and memoryview are not contiguous " - "in the same dimension."); - goto fail; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case 1: __PYX_VERIFY_RETURN_INT(char, digit, digits[0]) + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 2 * PyLong_SHIFT) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 3 * PyLong_SHIFT) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 4 * PyLong_SHIFT) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(char) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case -1: __PYX_VERIFY_RETURN_INT(char, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(char, digit, +digits[0]) + case -2: + if (8 * sizeof(char) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; } - } - if (spec & __Pyx_MEMVIEW_FOLLOW) { - Py_ssize_t stride = buf->strides[dim]; - if (stride < 0) - stride = -stride; - if (stride < buf->itemsize) { - PyErr_SetString(PyExc_ValueError, - "Buffer and memoryview are not contiguous " - "in the same dimension."); - goto fail; +#endif + if (sizeof(char) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif } } - } else { - if (spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1) { - PyErr_Format(PyExc_ValueError, - "C-contiguous buffer is not contiguous in " - "dimension %d", dim); - goto fail; - } else if (spec & (__Pyx_MEMVIEW_PTR)) { - PyErr_Format(PyExc_ValueError, - "C-contiguous buffer is not indirect in " - "dimension %d", dim); - goto fail; - } else if (buf->suboffsets) { - PyErr_SetString(PyExc_ValueError, - "Buffer exposes suboffsets but no strides"); - goto fail; - } - } - return 1; -fail: - return 0; -} -static int -__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) -{ - if (spec & __Pyx_MEMVIEW_DIRECT) { - if (buf->suboffsets && buf->suboffsets[dim] >= 0) { - PyErr_Format(PyExc_ValueError, - "Buffer not compatible with direct access " - "in dimension %d.", dim); - goto fail; - } - } - if (spec & __Pyx_MEMVIEW_PTR) { - if (!buf->suboffsets || (buf->suboffsets && buf->suboffsets[dim] < 0)) { - PyErr_Format(PyExc_ValueError, - "Buffer is not indirectly accessible " - "in dimension %d.", dim); - goto fail; - } - } - return 1; -fail: - return 0; -} -static int -__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) -{ - int i; - if (c_or_f_flag & __Pyx_IS_F_CONTIG) { - Py_ssize_t stride = 1; - for (i = 0; i < ndim; i++) { - if (stride * buf->itemsize != buf->strides[i] && - buf->shape[i] > 1) - { - PyErr_SetString(PyExc_ValueError, - "Buffer not fortran contiguous."); - goto fail; + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); } - stride = stride * buf->shape[i]; - } - } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { - Py_ssize_t stride = 1; - for (i = ndim - 1; i >- 1; i--) { - if (stride * buf->itemsize != buf->strides[i] && - buf->shape[i] > 1) { - PyErr_SetString(PyExc_ValueError, - "Buffer not C contiguous."); - goto fail; + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; } - stride = stride * buf->shape[i]; +#endif + return (char) -1; } - } - return 1; -fail: - return 0; -} -static int __Pyx_ValidateAndInit_memviewslice( - int *axes_specs, - int c_or_f_flag, - int buf_flags, - int ndim, - __Pyx_TypeInfo *dtype, - __Pyx_BufFmt_StackElem stack[], - __Pyx_memviewslice *memviewslice, - PyObject *original_obj) -{ - struct __pyx_memoryview_obj *memview, *new_memview; - __Pyx_RefNannyDeclarations - Py_buffer *buf; - int i, spec = 0, retval = -1; - __Pyx_BufFmt_Context ctx; - int from_memoryview = __pyx_memoryview_check(original_obj); - __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); - if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) - original_obj)->typeinfo)) { - memview = (struct __pyx_memoryview_obj *) original_obj; - new_memview = NULL; } else { - memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( - original_obj, buf_flags, 0, dtype); - new_memview = memview; - if (unlikely(!memview)) - goto fail; - } - buf = &memview->view; - if (buf->ndim != ndim) { - PyErr_Format(PyExc_ValueError, - "Buffer has wrong number of dimensions (expected %d, got %d)", - ndim, buf->ndim); - goto fail; - } - if (new_memview) { - __Pyx_BufFmt_Init(&ctx, stack, dtype); - if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; - } - if ((unsigned) buf->itemsize != dtype->size) { - PyErr_Format(PyExc_ValueError, - "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " - "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", - buf->itemsize, - (buf->itemsize > 1) ? "s" : "", - dtype->name, - dtype->size, - (dtype->size > 1) ? "s" : ""); - goto fail; - } - for (i = 0; i < ndim; i++) { - spec = axes_specs[i]; - if (!__pyx_check_strides(buf, i, ndim, spec)) - goto fail; - if (!__pyx_check_suboffsets(buf, i, ndim, spec)) - goto fail; - } - if (buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag)) - goto fail; - if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, - new_memview != NULL) == -1)) { - goto fail; + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; } - retval = 0; - goto no_fail; -fail: - Py_XDECREF(new_memview); - retval = -1; -no_fail: - __Pyx_RefNannyFinishContext(); - return retval; +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; } /* ObjectToMemviewSlice */ @@ -27860,6 +28039,9 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_DECREF(x); return ival; } +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } diff --git a/package/MDAnalysis/lib/c_distances_openmp.c b/package/MDAnalysis/lib/c_distances_openmp.c index b1f7ae73411..beaf56097dc 100644 --- a/package/MDAnalysis/lib/c_distances_openmp.c +++ b/package/MDAnalysis/lib/c_distances_openmp.c @@ -1,36 +1,25 @@ -/* Generated by Cython 0.28.2 */ +/* Generated by Cython 0.28.5 */ /* BEGIN: Cython Metadata { "distutils": { - "define_macros": [ - [ - "PARALLEL", - null - ] - ], "depends": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h", "MDAnalysis/lib/include/calc_distances.h" ], "extra_compile_args": [ - "-fopenmp", "-std=c99", "-ffast-math", "-O3", "-funroll-loops" ], - "extra_link_args": [ - "-fopenmp" - ], "include_dirs": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include", "MDAnalysis/lib/include" ], "libraries": [ - "m", - "gomp" + "m" ], "name": "MDAnalysis.lib.c_distances_openmp", "sources": [ @@ -48,7 +37,7 @@ END: Cython Metadata */ #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else -#define CYTHON_ABI "0_28_2" +#define CYTHON_ABI "0_28_5" #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof @@ -494,6 +483,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -692,7 +682,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -800,7 +790,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -838,7 +828,7 @@ static const char *__pyx_f[] = { "type.pxd", }; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -847,7 +837,7 @@ static const char *__pyx_f[] = { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -856,7 +846,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -865,7 +855,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -874,7 +864,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -883,7 +873,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -892,7 +882,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -901,7 +891,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -910,7 +900,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -919,7 +909,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -928,7 +918,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -937,7 +927,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -946,7 +936,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -955,7 +945,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -964,7 +954,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -973,7 +963,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -982,7 +972,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -991,7 +981,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1000,7 +990,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1009,7 +999,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1018,7 +1008,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1053,7 +1043,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do /*--- Type declarations ---*/ -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1062,7 +1052,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1071,7 +1061,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1080,7 +1070,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -4221,7 +4211,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_18c_distances_openmp_34triclinic_pbc return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -4269,7 +4259,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -4278,7 +4268,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -4287,7 +4277,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -4296,7 +4286,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4310,7 +4300,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -4321,7 +4311,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4330,7 +4320,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -4343,7 +4333,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4352,7 +4342,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4366,7 +4356,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -4377,7 +4367,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4386,7 +4376,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -4399,7 +4389,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -4408,7 +4398,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -4417,7 +4407,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -4426,7 +4416,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -4436,7 +4426,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -4445,7 +4435,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -4454,7 +4444,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -4466,7 +4456,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -4475,7 +4465,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -4485,7 +4475,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -4495,7 +4485,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -4505,7 +4495,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -4516,7 +4506,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -4525,7 +4515,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -4534,7 +4524,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -4543,7 +4533,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -4552,7 +4542,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -4564,7 +4554,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -4577,7 +4567,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -4587,7 +4577,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -4597,7 +4587,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4617,7 +4607,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -4634,7 +4624,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4643,7 +4633,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4656,7 +4646,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4665,7 +4655,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -4677,7 +4667,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -4688,7 +4678,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -4699,7 +4689,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -4710,7 +4700,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -4721,7 +4711,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -4732,7 +4722,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -4743,7 +4733,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -4754,7 +4744,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -4765,7 +4755,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -4776,7 +4766,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -4787,7 +4777,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -4798,7 +4788,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -4809,7 +4799,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -4820,7 +4810,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -4831,7 +4821,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -4842,7 +4832,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -4854,7 +4844,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -4875,7 +4865,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -4884,7 +4874,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -4894,7 +4884,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -4903,7 +4893,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -4913,7 +4903,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -4922,7 +4912,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -4931,7 +4921,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -4941,7 +4931,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -4951,7 +4941,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -4983,7 +4973,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -5007,7 +4997,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -5017,7 +5007,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -5026,7 +5016,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -5035,7 +5025,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -5045,7 +5035,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -5054,7 +5044,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -5063,7 +5053,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -5075,7 +5065,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -5089,7 +5079,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -5103,7 +5093,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -5122,7 +5112,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -5136,7 +5126,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -5150,7 +5140,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -5169,7 +5159,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -5183,7 +5173,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -5197,7 +5187,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -5216,7 +5206,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -5230,7 +5220,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -5244,7 +5234,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -5263,7 +5253,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -5277,7 +5267,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -5291,7 +5281,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -5310,7 +5300,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -5324,7 +5314,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -5334,7 +5324,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -5346,7 +5336,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -5355,7 +5345,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -5369,7 +5359,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -5384,7 +5374,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -5413,7 +5403,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -5422,7 +5412,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -5431,7 +5421,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -5454,7 +5444,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -5471,7 +5461,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -5506,7 +5496,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -5523,7 +5513,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -5536,7 +5526,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -5545,7 +5535,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5565,7 +5555,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -5582,7 +5572,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5591,7 +5581,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -5604,7 +5594,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5613,7 +5603,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -5629,7 +5619,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -5638,7 +5628,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -5647,7 +5637,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -5658,7 +5648,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -5668,7 +5658,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -5678,7 +5668,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -5690,7 +5680,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -5700,7 +5690,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -5713,7 +5703,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -5722,7 +5712,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -5740,7 +5730,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -5758,7 +5748,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -5776,7 +5766,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -5794,7 +5784,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -5812,7 +5802,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -5830,7 +5820,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -5848,7 +5838,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -5866,7 +5856,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -5884,7 +5874,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -5902,7 +5892,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -5920,7 +5910,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -5938,7 +5928,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -5956,7 +5946,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -5976,7 +5966,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -5996,7 +5986,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -6016,7 +6006,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -6034,7 +6024,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -6053,7 +6043,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -6062,7 +6052,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -6072,7 +6062,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -6085,7 +6075,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -6095,7 +6085,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -6105,7 +6095,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -6130,7 +6120,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -6145,7 +6135,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -6156,7 +6146,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -6165,7 +6155,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -6175,7 +6165,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -6185,7 +6175,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -6196,7 +6186,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -6205,7 +6195,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -6214,7 +6204,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -6226,7 +6216,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -6240,7 +6230,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -6250,7 +6240,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -6261,7 +6251,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -6270,7 +6260,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -6284,7 +6274,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -6299,7 +6289,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -6320,7 +6310,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -6336,7 +6326,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -6345,7 +6335,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -6359,7 +6349,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -6374,7 +6364,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -6390,7 +6380,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -6405,7 +6395,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -6428,7 +6418,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -6449,7 +6439,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -6465,7 +6455,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -6474,7 +6464,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -6488,7 +6478,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -6503,7 +6493,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -6519,7 +6509,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -6534,7 +6524,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -6557,7 +6547,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -6578,7 +6568,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -6594,7 +6584,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -6603,7 +6593,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -6617,7 +6607,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -6631,7 +6621,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -6645,7 +6635,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -6660,7 +6650,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -6789,7 +6779,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -6800,7 +6790,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -6811,7 +6801,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -6822,7 +6812,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -6833,7 +6823,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -6844,7 +6834,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -6855,7 +6845,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -6866,7 +6856,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -6877,7 +6867,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -7211,8 +7201,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -7622,7 +7612,7 @@ if (!__Pyx_RefNanny) { if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -8330,7 +8320,7 @@ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -8345,7 +8335,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -8429,7 +8419,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -8534,6 +8524,9 @@ static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_li #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); @@ -9587,14 +9580,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i #ifndef offsetof @@ -478,6 +478,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -677,7 +678,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -785,7 +786,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -934,7 +935,7 @@ typedef struct { #define __Pyx_MemoryView_Len(m) (m.shape[0]) -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -943,7 +944,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -952,7 +953,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -961,7 +962,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -970,7 +971,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -979,7 +980,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -988,7 +989,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -997,7 +998,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -1006,7 +1007,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -1015,7 +1016,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -1024,7 +1025,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -1033,7 +1034,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -1042,7 +1043,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -1051,7 +1052,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -1060,7 +1061,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -1069,7 +1070,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1078,7 +1079,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1087,7 +1088,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1096,7 +1097,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1105,7 +1106,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1114,7 +1115,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1154,7 +1155,7 @@ struct __pyx_MemviewEnum_obj; struct __pyx_memoryview_obj; struct __pyx_memoryviewslice_obj; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1163,7 +1164,7 @@ struct __pyx_memoryviewslice_obj; */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1172,7 +1173,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1181,7 +1182,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -2910,7 +2911,7 @@ static PyArrayObject *__pyx_f_10MDAnalysis_3lib_7formats_11cython_util_ptr_to_nd return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -2958,7 +2959,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -2967,7 +2968,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -2976,7 +2977,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -2985,7 +2986,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -2999,7 +3000,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -3010,7 +3011,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3019,7 +3020,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -3032,7 +3033,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(2, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3041,7 +3042,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3055,7 +3056,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -3066,7 +3067,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3075,7 +3076,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -3088,7 +3089,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(2, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -3097,7 +3098,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -3106,7 +3107,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -3115,7 +3116,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -3125,7 +3126,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -3134,7 +3135,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -3143,7 +3144,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -3155,7 +3156,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -3164,7 +3165,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -3174,7 +3175,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -3184,7 +3185,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -3194,7 +3195,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -3205,7 +3206,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -3214,7 +3215,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -3223,7 +3224,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -3232,7 +3233,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -3241,7 +3242,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -3253,7 +3254,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -3266,7 +3267,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -3276,7 +3277,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -3286,7 +3287,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3306,7 +3307,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -3323,7 +3324,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3332,7 +3333,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -3345,7 +3346,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(2, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -3354,7 +3355,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -3366,7 +3367,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -3377,7 +3378,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -3388,7 +3389,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -3399,7 +3400,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -3410,7 +3411,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -3421,7 +3422,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -3432,7 +3433,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -3443,7 +3444,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -3454,7 +3455,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -3465,7 +3466,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -3476,7 +3477,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -3487,7 +3488,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -3498,7 +3499,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -3509,7 +3510,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -3520,7 +3521,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -3531,7 +3532,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -3543,7 +3544,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -3564,7 +3565,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -3573,7 +3574,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -3583,7 +3584,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -3592,7 +3593,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -3602,7 +3603,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -3611,7 +3612,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -3620,7 +3621,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -3630,7 +3631,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(2, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -3640,7 +3641,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -3672,7 +3673,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -3696,7 +3697,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -3706,7 +3707,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -3715,7 +3716,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -3724,7 +3725,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -3734,7 +3735,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -3743,7 +3744,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -3752,7 +3753,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -3764,7 +3765,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -3778,7 +3779,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -3792,7 +3793,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -3811,7 +3812,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -3825,7 +3826,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -3839,7 +3840,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -3858,7 +3859,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -3872,7 +3873,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -3886,7 +3887,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -3905,7 +3906,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -3919,7 +3920,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -3933,7 +3934,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -3952,7 +3953,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -3966,7 +3967,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -3980,7 +3981,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -3999,7 +4000,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -4013,7 +4014,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -4023,7 +4024,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -4035,7 +4036,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -4044,7 +4045,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -4058,7 +4059,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -4073,7 +4074,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -4102,7 +4103,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -4111,7 +4112,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -4120,7 +4121,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -4143,7 +4144,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -4160,7 +4161,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -4195,7 +4196,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -4212,7 +4213,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -4225,7 +4226,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(2, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -4234,7 +4235,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4254,7 +4255,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -4271,7 +4272,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4280,7 +4281,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -4293,7 +4294,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(2, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -4302,7 +4303,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -4318,7 +4319,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -4327,7 +4328,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -4336,7 +4337,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -4347,7 +4348,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -4357,7 +4358,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -4367,7 +4368,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -4379,7 +4380,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -4389,7 +4390,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -4402,7 +4403,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(2, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -4411,7 +4412,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -4429,7 +4430,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -4447,7 +4448,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -4465,7 +4466,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -4483,7 +4484,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -4501,7 +4502,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -4519,7 +4520,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -4537,7 +4538,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -4555,7 +4556,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -4573,7 +4574,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -4591,7 +4592,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -4609,7 +4610,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -4627,7 +4628,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -4645,7 +4646,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -4665,7 +4666,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -4685,7 +4686,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -4705,7 +4706,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -4723,7 +4724,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -4742,7 +4743,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -4751,7 +4752,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -4761,7 +4762,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -4774,7 +4775,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -4784,7 +4785,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -4794,7 +4795,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -4819,7 +4820,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -4834,7 +4835,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -4845,7 +4846,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -4854,7 +4855,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -4864,7 +4865,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -4874,7 +4875,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -4885,7 +4886,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -4894,7 +4895,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -4903,7 +4904,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -4915,7 +4916,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -4929,7 +4930,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -4939,7 +4940,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -4950,7 +4951,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -4959,7 +4960,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -4973,7 +4974,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -4988,7 +4989,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -5009,7 +5010,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -5025,7 +5026,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -5034,7 +5035,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -5048,7 +5049,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -5063,7 +5064,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -5079,7 +5080,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -5094,7 +5095,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -5117,7 +5118,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -5138,7 +5139,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -5154,7 +5155,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -5163,7 +5164,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -5177,7 +5178,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -5192,7 +5193,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -5208,7 +5209,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -5223,7 +5224,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -5246,7 +5247,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -5267,7 +5268,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -5283,7 +5284,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -5292,7 +5293,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -5306,7 +5307,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -5320,7 +5321,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -5334,7 +5335,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -5349,7 +5350,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -19235,7 +19236,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -19246,7 +19247,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -19257,7 +19258,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -19268,7 +19269,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -19279,7 +19280,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -19290,7 +19291,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -19301,7 +19302,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -19312,7 +19313,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -19323,7 +19324,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -19803,8 +19804,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -20728,7 +20729,7 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -20743,7 +20744,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -20827,7 +20828,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -21149,6 +21150,9 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); @@ -21357,7 +21361,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -21508,14 +21512,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i #ifndef offsetof @@ -482,6 +482,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -685,7 +686,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -793,7 +794,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -940,7 +941,7 @@ typedef struct { #define __Pyx_FastGilFuncInit() -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -949,7 +950,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -958,7 +959,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -967,7 +968,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -976,7 +977,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -985,7 +986,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -994,7 +995,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -1003,7 +1004,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -1012,7 +1013,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -1021,7 +1022,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -1030,7 +1031,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -1039,7 +1040,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -1048,7 +1049,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -1057,7 +1058,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -1066,7 +1067,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -1075,7 +1076,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1084,7 +1085,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1093,7 +1094,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1102,7 +1103,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1111,7 +1112,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1120,7 +1121,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1198,7 +1199,7 @@ struct __pyx_MemviewEnum_obj; struct __pyx_memoryview_obj; struct __pyx_memoryviewslice_obj; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1207,7 +1208,7 @@ struct __pyx_memoryviewslice_obj; */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1216,7 +1217,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1225,7 +1226,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -1283,7 +1284,7 @@ struct __pyx_obj_10MDAnalysis_3lib_7formats_6libdcd_DCDFile { }; -/* "MDAnalysis/lib/formats/libdcd.pyx":332 +/* "MDAnalysis/lib/formats/libdcd.pyx":334 * * * cdef void _read_header(self): # <<<<<<<<<<<<<< @@ -1296,7 +1297,7 @@ struct __pyx_obj_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_he }; -/* "MDAnalysis/lib/formats/libdcd.pyx":377 +/* "MDAnalysis/lib/formats/libdcd.pyx":379 * py_remarks = py_remarks.decode('ascii', 'ignore') * * py_remarks = "".join(s for s in py_remarks if s in string.printable) # <<<<<<<<<<<<<< @@ -2410,7 +2411,7 @@ static const char __pyx_k_O[] = "O"; static const char __pyx_k_c[] = "c"; static const char __pyx_k_r[] = "r"; static const char __pyx_k_w[] = "w"; -static const char __pyx_k__4[] = ""; +static const char __pyx_k__5[] = ""; static const char __pyx_k_id[] = "id"; static const char __pyx_k_np[] = "np"; static const char __pyx_k_os[] = "os"; @@ -2473,6 +2474,7 @@ static const char __pyx_k_exc_tb[] = "exc_tb"; static const char __pyx_k_format[] = "format"; static const char __pyx_k_ignore[] = "ignore"; static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_isfile[] = "isfile"; static const char __pyx_k_istart[] = "istart"; static const char __pyx_k_name_2[] = "__name__"; static const char __pyx_k_natoms[] = "natoms"; @@ -2673,7 +2675,7 @@ static PyObject *__pyx_n_s_UnicodeDecodeError; static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_n_s_View_MemoryView; static PyObject *__pyx_kp_s_Writing_DCD_header_failed; -static PyObject *__pyx_kp_s__4; +static PyObject *__pyx_kp_s__5; static PyObject *__pyx_n_s_acf; static PyObject *__pyx_n_s_afc; static PyObject *__pyx_n_s_allocate_buffer; @@ -2728,6 +2730,7 @@ static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_indices; static PyObject *__pyx_n_s_int64; static PyObject *__pyx_n_s_is_periodic; +static PyObject *__pyx_n_s_isfile; static PyObject *__pyx_n_s_istart; static PyObject *__pyx_n_s_itemsize; static PyObject *__pyx_kp_s_itemsize_0_for_cython_array; @@ -2915,26 +2918,26 @@ static PyObject *__pyx_int_neg_8; static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__3; -static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__4; static PyObject *__pyx_tuple__6; static PyObject *__pyx_tuple__7; static PyObject *__pyx_tuple__8; static PyObject *__pyx_tuple__9; -static PyObject *__pyx_slice__17; -static PyObject *__pyx_slice__19; -static PyObject *__pyx_slice__21; -static PyObject *__pyx_slice__28; -static PyObject *__pyx_slice__30; -static PyObject *__pyx_slice__32; -static PyObject *__pyx_slice__39; -static PyObject *__pyx_slice__41; -static PyObject *__pyx_slice__43; -static PyObject *__pyx_slice__45; -static PyObject *__pyx_slice__47; -static PyObject *__pyx_slice__49; -static PyObject *__pyx_slice__75; +static PyObject *__pyx_slice__18; +static PyObject *__pyx_slice__20; +static PyObject *__pyx_slice__22; +static PyObject *__pyx_slice__29; +static PyObject *__pyx_slice__31; +static PyObject *__pyx_slice__33; +static PyObject *__pyx_slice__40; +static PyObject *__pyx_slice__42; +static PyObject *__pyx_slice__44; +static PyObject *__pyx_slice__46; +static PyObject *__pyx_slice__48; +static PyObject *__pyx_slice__50; static PyObject *__pyx_slice__76; static PyObject *__pyx_slice__77; +static PyObject *__pyx_slice__78; static PyObject *__pyx_tuple__10; static PyObject *__pyx_tuple__11; static PyObject *__pyx_tuple__12; @@ -2942,28 +2945,28 @@ static PyObject *__pyx_tuple__13; static PyObject *__pyx_tuple__14; static PyObject *__pyx_tuple__15; static PyObject *__pyx_tuple__16; -static PyObject *__pyx_tuple__18; -static PyObject *__pyx_tuple__20; -static PyObject *__pyx_tuple__22; +static PyObject *__pyx_tuple__17; +static PyObject *__pyx_tuple__19; +static PyObject *__pyx_tuple__21; static PyObject *__pyx_tuple__23; static PyObject *__pyx_tuple__24; static PyObject *__pyx_tuple__25; static PyObject *__pyx_tuple__26; static PyObject *__pyx_tuple__27; -static PyObject *__pyx_tuple__29; -static PyObject *__pyx_tuple__31; -static PyObject *__pyx_tuple__33; +static PyObject *__pyx_tuple__28; +static PyObject *__pyx_tuple__30; +static PyObject *__pyx_tuple__32; static PyObject *__pyx_tuple__34; static PyObject *__pyx_tuple__35; static PyObject *__pyx_tuple__36; static PyObject *__pyx_tuple__37; static PyObject *__pyx_tuple__38; -static PyObject *__pyx_tuple__40; -static PyObject *__pyx_tuple__42; -static PyObject *__pyx_tuple__44; -static PyObject *__pyx_tuple__46; -static PyObject *__pyx_tuple__48; -static PyObject *__pyx_tuple__50; +static PyObject *__pyx_tuple__39; +static PyObject *__pyx_tuple__41; +static PyObject *__pyx_tuple__43; +static PyObject *__pyx_tuple__45; +static PyObject *__pyx_tuple__47; +static PyObject *__pyx_tuple__49; static PyObject *__pyx_tuple__51; static PyObject *__pyx_tuple__52; static PyObject *__pyx_tuple__53; @@ -2988,7 +2991,7 @@ static PyObject *__pyx_tuple__71; static PyObject *__pyx_tuple__72; static PyObject *__pyx_tuple__73; static PyObject *__pyx_tuple__74; -static PyObject *__pyx_tuple__78; +static PyObject *__pyx_tuple__75; static PyObject *__pyx_tuple__79; static PyObject *__pyx_tuple__80; static PyObject *__pyx_tuple__81; @@ -2998,7 +3001,8 @@ static PyObject *__pyx_tuple__84; static PyObject *__pyx_tuple__85; static PyObject *__pyx_tuple__86; static PyObject *__pyx_tuple__87; -static PyObject *__pyx_codeobj__88; +static PyObject *__pyx_tuple__88; +static PyObject *__pyx_codeobj__89; /* Late includes */ /* "MDAnalysis/lib/formats/libdcd.pyx":216 @@ -4467,10 +4471,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; - char const *__pyx_t_6; - int __pyx_t_7; - PyObject *__pyx_t_8 = NULL; - int __pyx_t_9; + int __pyx_t_6; + char const *__pyx_t_7; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; __Pyx_RefNannySetupContext("open", 0); /* "MDAnalysis/lib/formats/libdcd.pyx":291 @@ -4525,8 +4529,8 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str * self.close() * * if mode == 'r': # <<<<<<<<<<<<<< - * fio_mode = FIO_READ - * elif mode == 'w': + * if not path.isfile(self.fname): + * raise IOError("DCD file does not exist") */ __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_r, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 294, __pyx_L1_error) if (__pyx_t_1) { @@ -4534,6 +4538,88 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str /* "MDAnalysis/lib/formats/libdcd.pyx":295 * * if mode == 'r': + * if not path.isfile(self.fname): # <<<<<<<<<<<<<< + * raise IOError("DCD file does not exist") + * fio_mode = FIO_READ + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_path); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_isfile); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + if (!__pyx_t_3) { + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_self->fname); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_self->fname}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_3, __pyx_v_self->fname}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL; + __Pyx_INCREF(__pyx_v_self->fname); + __Pyx_GIVEREF(__pyx_v_self->fname); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_self->fname); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 295, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_6 = ((!__pyx_t_1) != 0); + if (unlikely(__pyx_t_6)) { + + /* "MDAnalysis/lib/formats/libdcd.pyx":296 + * if mode == 'r': + * if not path.isfile(self.fname): + * raise IOError("DCD file does not exist") # <<<<<<<<<<<<<< + * fio_mode = FIO_READ + * elif mode == 'w': + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 296, __pyx_L1_error) + + /* "MDAnalysis/lib/formats/libdcd.pyx":295 + * + * if mode == 'r': + * if not path.isfile(self.fname): # <<<<<<<<<<<<<< + * raise IOError("DCD file does not exist") + * fio_mode = FIO_READ + */ + } + + /* "MDAnalysis/lib/formats/libdcd.pyx":297 + * if not path.isfile(self.fname): + * raise IOError("DCD file does not exist") * fio_mode = FIO_READ # <<<<<<<<<<<<<< * elif mode == 'w': * fio_mode = FIO_WRITE @@ -4544,23 +4630,23 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str * self.close() * * if mode == 'r': # <<<<<<<<<<<<<< - * fio_mode = FIO_READ - * elif mode == 'w': + * if not path.isfile(self.fname): + * raise IOError("DCD file does not exist") */ goto __pyx_L4; } - /* "MDAnalysis/lib/formats/libdcd.pyx":296 - * if mode == 'r': + /* "MDAnalysis/lib/formats/libdcd.pyx":298 + * raise IOError("DCD file does not exist") * fio_mode = FIO_READ * elif mode == 'w': # <<<<<<<<<<<<<< * fio_mode = FIO_WRITE * else: */ - __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_w, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 296, __pyx_L1_error) - if (likely(__pyx_t_1)) { + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_w, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 298, __pyx_L1_error) + if (likely(__pyx_t_6)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":297 + /* "MDAnalysis/lib/formats/libdcd.pyx":299 * fio_mode = FIO_READ * elif mode == 'w': * fio_mode = FIO_WRITE # <<<<<<<<<<<<<< @@ -4569,8 +4655,8 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str */ __pyx_v_fio_mode = __pyx_e_10MDAnalysis_3lib_7formats_6libdcd_FIO_WRITE; - /* "MDAnalysis/lib/formats/libdcd.pyx":296 - * if mode == 'r': + /* "MDAnalysis/lib/formats/libdcd.pyx":298 + * raise IOError("DCD file does not exist") * fio_mode = FIO_READ * elif mode == 'w': # <<<<<<<<<<<<<< * fio_mode = FIO_WRITE @@ -4579,7 +4665,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str goto __pyx_L4; } - /* "MDAnalysis/lib/formats/libdcd.pyx":299 + /* "MDAnalysis/lib/formats/libdcd.pyx":301 * fio_mode = FIO_WRITE * else: * raise IOError("unkown mode '{}', use either r or w".format(mode)) # <<<<<<<<<<<<<< @@ -4587,173 +4673,173 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str * */ /*else*/ { - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_unkown_mode_use_either_r_or_w, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 299, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_unkown_mode_use_either_r_or_w, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); + __Pyx_DECREF_SET(__pyx_t_4, function); } } - if (!__pyx_t_4) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_mode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 299, __pyx_L1_error) + if (!__pyx_t_5) { + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_mode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 301, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); } else { #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_v_mode}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 299, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_v_mode}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_v_mode}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 299, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_v_mode}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 299, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; + __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = NULL; __Pyx_INCREF(__pyx_v_mode); __Pyx_GIVEREF(__pyx_v_mode); - PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_mode); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 299, __pyx_L1_error) + PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_v_mode); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 301, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 299, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 299, __pyx_L1_error) + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(0, 301, __pyx_L1_error) } __pyx_L4:; - /* "MDAnalysis/lib/formats/libdcd.pyx":300 + /* "MDAnalysis/lib/formats/libdcd.pyx":302 * else: * raise IOError("unkown mode '{}', use either r or w".format(mode)) * self.mode = str(mode) # <<<<<<<<<<<<<< * * ok = fio_open(self.fname, fio_mode, &self.fp) */ - __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyString_Type)), __pyx_v_mode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (!(likely(PyString_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(0, 300, __pyx_L1_error) - __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyString_Type)), __pyx_v_mode); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 302, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!(likely(PyString_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(0, 302, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_4); __Pyx_GOTREF(__pyx_v_self->mode); __Pyx_DECREF(__pyx_v_self->mode); - __pyx_v_self->mode = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; + __pyx_v_self->mode = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":302 + /* "MDAnalysis/lib/formats/libdcd.pyx":304 * self.mode = str(mode) * * ok = fio_open(self.fname, fio_mode, &self.fp) # <<<<<<<<<<<<<< * if ok != 0: * raise IOError("couldn't open file: {}\n" */ - __pyx_t_6 = __Pyx_PyObject_AsString(__pyx_v_self->fname); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) __PYX_ERR(0, 302, __pyx_L1_error) - __pyx_v_ok = fio_open(__pyx_t_6, __pyx_v_fio_mode, ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_fio_fd *)(&__pyx_v_self->fp))); + __pyx_t_7 = __Pyx_PyObject_AsString(__pyx_v_self->fname); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_v_ok = fio_open(__pyx_t_7, __pyx_v_fio_mode, ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_fio_fd *)(&__pyx_v_self->fp))); - /* "MDAnalysis/lib/formats/libdcd.pyx":303 + /* "MDAnalysis/lib/formats/libdcd.pyx":305 * * ok = fio_open(self.fname, fio_mode, &self.fp) * if ok != 0: # <<<<<<<<<<<<<< * raise IOError("couldn't open file: {}\n" * "ErrorCode: {}".format(self.fname, DCD_ERRORS[ok])) */ - __pyx_t_1 = ((__pyx_v_ok != 0) != 0); - if (unlikely(__pyx_t_1)) { + __pyx_t_6 = ((__pyx_v_ok != 0) != 0); + if (unlikely(__pyx_t_6)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":305 + /* "MDAnalysis/lib/formats/libdcd.pyx":307 * if ok != 0: * raise IOError("couldn't open file: {}\n" * "ErrorCode: {}".format(self.fname, DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * self.is_open = True * self.current_frame = 0 */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_couldn_t_open_file_ErrorCode, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 305, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_couldn_t_open_file_ErrorCode, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 307, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 305, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 307, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = NULL; - __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = NULL; + __pyx_t_8 = 0; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); - __pyx_t_7 = 1; + __pyx_t_8 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_v_self->fname, __pyx_t_4}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_self->fname, __pyx_t_5}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { - PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_v_self->fname, __pyx_t_4}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_self->fname, __pyx_t_5}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } else #endif { - __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - if (__pyx_t_5) { - __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_3) { + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3); __pyx_t_3 = NULL; } __Pyx_INCREF(__pyx_v_self->fname); __Pyx_GIVEREF(__pyx_v_self->fname); - PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_v_self->fname); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4); - __pyx_t_4 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_v_self->fname); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":304 + /* "MDAnalysis/lib/formats/libdcd.pyx":306 * ok = fio_open(self.fname, fio_mode, &self.fp) * if ok != 0: * raise IOError("couldn't open file: {}\n" # <<<<<<<<<<<<<< * "ErrorCode: {}".format(self.fname, DCD_ERRORS[ok])) * self.is_open = True */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 304, __pyx_L1_error) + __PYX_ERR(0, 306, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":303 + /* "MDAnalysis/lib/formats/libdcd.pyx":305 * * ok = fio_open(self.fname, fio_mode, &self.fp) * if ok != 0: # <<<<<<<<<<<<<< @@ -4762,7 +4848,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":306 + /* "MDAnalysis/lib/formats/libdcd.pyx":308 * raise IOError("couldn't open file: {}\n" * "ErrorCode: {}".format(self.fname, DCD_ERRORS[ok])) * self.is_open = True # <<<<<<<<<<<<<< @@ -4771,7 +4857,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str */ __pyx_v_self->is_open = 1; - /* "MDAnalysis/lib/formats/libdcd.pyx":307 + /* "MDAnalysis/lib/formats/libdcd.pyx":309 * "ErrorCode: {}".format(self.fname, DCD_ERRORS[ok])) * self.is_open = True * self.current_frame = 0 # <<<<<<<<<<<<<< @@ -4780,7 +4866,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str */ __pyx_v_self->current_frame = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":308 + /* "MDAnalysis/lib/formats/libdcd.pyx":310 * self.is_open = True * self.current_frame = 0 * self.reached_eof = False # <<<<<<<<<<<<<< @@ -4789,7 +4875,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str */ __pyx_v_self->reached_eof = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":309 + /* "MDAnalysis/lib/formats/libdcd.pyx":311 * self.current_frame = 0 * self.reached_eof = False * self.wrote_header = False # <<<<<<<<<<<<<< @@ -4798,18 +4884,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str */ __pyx_v_self->wrote_header = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":311 + /* "MDAnalysis/lib/formats/libdcd.pyx":313 * self.wrote_header = False * # Has to come last since it checks the reached_eof flag * if self.mode == 'r': # <<<<<<<<<<<<<< * self._read_header() * */ - __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_r, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 311, __pyx_L1_error) - __pyx_t_9 = (__pyx_t_1 != 0); - if (__pyx_t_9) { + __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_r, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 313, __pyx_L1_error) + __pyx_t_1 = (__pyx_t_6 != 0); + if (__pyx_t_1) { - /* "MDAnalysis/lib/formats/libdcd.pyx":312 + /* "MDAnalysis/lib/formats/libdcd.pyx":314 * # Has to come last since it checks the reached_eof flag * if self.mode == 'r': * self._read_header() # <<<<<<<<<<<<<< @@ -4818,7 +4904,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str */ ((struct __pyx_vtabstruct_10MDAnalysis_3lib_7formats_6libdcd_DCDFile *)__pyx_v_self->__pyx_vtab)->_read_header(__pyx_v_self); - /* "MDAnalysis/lib/formats/libdcd.pyx":311 + /* "MDAnalysis/lib/formats/libdcd.pyx":313 * self.wrote_header = False * # Has to come last since it checks the reached_eof flag * if self.mode == 'r': # <<<<<<<<<<<<<< @@ -4843,7 +4929,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("MDAnalysis.lib.formats.libdcd.DCDFile.open", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; @@ -4852,7 +4938,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_22open(str return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":314 +/* "MDAnalysis/lib/formats/libdcd.pyx":316 * self._read_header() * * def close(self): # <<<<<<<<<<<<<< @@ -4887,7 +4973,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st PyObject *__pyx_t_7 = NULL; __Pyx_RefNannySetupContext("close", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":318 + /* "MDAnalysis/lib/formats/libdcd.pyx":320 * * """ * if self.is_open: # <<<<<<<<<<<<<< @@ -4897,7 +4983,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st __pyx_t_1 = (__pyx_v_self->is_open != 0); if (__pyx_t_1) { - /* "MDAnalysis/lib/formats/libdcd.pyx":321 + /* "MDAnalysis/lib/formats/libdcd.pyx":323 * # In case there are fixed atoms we should free the memory again. * # Both pointers are guaranted to be non NULL if either one is. * if self.freeind != NULL: # <<<<<<<<<<<<<< @@ -4907,7 +4993,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st __pyx_t_1 = ((__pyx_v_self->freeind != NULL) != 0); if (__pyx_t_1) { - /* "MDAnalysis/lib/formats/libdcd.pyx":322 + /* "MDAnalysis/lib/formats/libdcd.pyx":324 * # Both pointers are guaranted to be non NULL if either one is. * if self.freeind != NULL: * close_dcd_read(self.freeind, self.fixedcoords); # <<<<<<<<<<<<<< @@ -4916,7 +5002,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st */ close_dcd_read(__pyx_v_self->freeind, __pyx_v_self->fixedcoords); - /* "MDAnalysis/lib/formats/libdcd.pyx":321 + /* "MDAnalysis/lib/formats/libdcd.pyx":323 * # In case there are fixed atoms we should free the memory again. * # Both pointers are guaranted to be non NULL if either one is. * if self.freeind != NULL: # <<<<<<<<<<<<<< @@ -4925,7 +5011,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":324 + /* "MDAnalysis/lib/formats/libdcd.pyx":326 * close_dcd_read(self.freeind, self.fixedcoords); * * ok = fio_fclose(self.fp) # <<<<<<<<<<<<<< @@ -4934,7 +5020,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st */ __pyx_v_ok = fio_fclose(__pyx_v_self->fp); - /* "MDAnalysis/lib/formats/libdcd.pyx":326 + /* "MDAnalysis/lib/formats/libdcd.pyx":328 * ok = fio_fclose(self.fp) * * self.is_open = False # <<<<<<<<<<<<<< @@ -4943,7 +5029,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st */ __pyx_v_self->is_open = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":327 + /* "MDAnalysis/lib/formats/libdcd.pyx":329 * * self.is_open = False * if ok != 0: # <<<<<<<<<<<<<< @@ -4953,18 +5039,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st __pyx_t_1 = ((__pyx_v_ok != 0) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":329 + /* "MDAnalysis/lib/formats/libdcd.pyx":331 * if ok != 0: * raise IOError("couldn't close file: {}\n" * "ErrorCode: {}".format(self.fname, DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * * */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_couldn_t_close_file_ErrorCode, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_couldn_t_close_file_ErrorCode, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; @@ -4982,7 +5068,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_self->fname, __pyx_t_5}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; @@ -4991,14 +5077,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_self->fname, __pyx_t_5}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } else #endif { - __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_4); __pyx_t_4 = NULL; @@ -5009,27 +5095,27 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":328 + /* "MDAnalysis/lib/formats/libdcd.pyx":330 * self.is_open = False * if ok != 0: * raise IOError("couldn't close file: {}\n" # <<<<<<<<<<<<<< * "ErrorCode: {}".format(self.fname, DCD_ERRORS[ok])) * */ - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 328, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 330, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 328, __pyx_L1_error) + __PYX_ERR(0, 330, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":327 + /* "MDAnalysis/lib/formats/libdcd.pyx":329 * * self.is_open = False * if ok != 0: # <<<<<<<<<<<<<< @@ -5038,7 +5124,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":318 + /* "MDAnalysis/lib/formats/libdcd.pyx":320 * * """ * if self.is_open: # <<<<<<<<<<<<<< @@ -5047,7 +5133,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":314 + /* "MDAnalysis/lib/formats/libdcd.pyx":316 * self._read_header() * * def close(self): # <<<<<<<<<<<<<< @@ -5073,7 +5159,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_24close(st } static PyObject *__pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_header_2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ -/* "MDAnalysis/lib/formats/libdcd.pyx":377 +/* "MDAnalysis/lib/formats/libdcd.pyx":379 * py_remarks = py_remarks.decode('ascii', 'ignore') * * py_remarks = "".join(s for s in py_remarks if s in string.printable) # <<<<<<<<<<<<<< @@ -5090,7 +5176,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_he if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct_1_genexpr *)Py_None); __Pyx_INCREF(Py_None); - __PYX_ERR(0, 377, __pyx_L1_error) + __PYX_ERR(0, 379, __pyx_L1_error) } else { __Pyx_GOTREF(__pyx_cur_scope); } @@ -5098,7 +5184,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_he __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope)); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope); { - __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_header_2generator, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_DCDFile__read_header_locals_gene, __pyx_n_s_MDAnalysis_lib_formats_libdcd); if (unlikely(!gen)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_header_2generator, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_DCDFile__read_header_locals_gene, __pyx_n_s_MDAnalysis_lib_formats_libdcd); if (unlikely(!gen)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_DECREF(__pyx_cur_scope); __Pyx_RefNannyFinishContext(); return (PyObject *) gen; @@ -5135,32 +5221,32 @@ static PyObject *__pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_he return NULL; } __pyx_L3_first_run:; - if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 377, __pyx_L1_error) - if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_py_remarks)) { __Pyx_RaiseClosureNameError("py_remarks"); __PYX_ERR(0, 377, __pyx_L1_error) } + if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 379, __pyx_L1_error) + if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_py_remarks)) { __Pyx_RaiseClosureNameError("py_remarks"); __PYX_ERR(0, 379, __pyx_L1_error) } if (likely(PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_py_remarks)) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_py_remarks)) { __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_py_remarks; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; __pyx_t_3 = NULL; } else { - __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_py_remarks); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_py_remarks); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 379, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_3)) { if (likely(PyList_CheckExact(__pyx_t_1))) { if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 379, __pyx_L1_error) #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); #endif } else { if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 379, __pyx_L1_error) #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); #endif } @@ -5170,7 +5256,7 @@ static PyObject *__pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_he PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 377, __pyx_L1_error) + else __PYX_ERR(0, 379, __pyx_L1_error) } break; } @@ -5180,12 +5266,12 @@ static PyObject *__pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_he __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_s, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_string); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_string); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_printable); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_printable); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = (__Pyx_PySequence_ContainsTF(__pyx_cur_scope->__pyx_v_s, __pyx_t_5, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_6 = (__Pyx_PySequence_ContainsTF(__pyx_cur_scope->__pyx_v_s, __pyx_t_5, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = (__pyx_t_6 != 0); if (__pyx_t_7) { @@ -5207,7 +5293,7 @@ static PyObject *__pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_he __Pyx_XGOTREF(__pyx_t_1); __pyx_t_2 = __pyx_cur_scope->__pyx_t_1; __pyx_t_3 = __pyx_cur_scope->__pyx_t_2; - if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 377, __pyx_L1_error) + if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 379, __pyx_L1_error) } } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -5230,7 +5316,7 @@ static PyObject *__pyx_gb_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_he return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":332 +/* "MDAnalysis/lib/formats/libdcd.pyx":334 * * * cdef void _read_header(self): # <<<<<<<<<<<<<< @@ -5261,12 +5347,12 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header *)Py_None); __Pyx_INCREF(Py_None); - __PYX_ERR(0, 332, __pyx_L1_error) + __PYX_ERR(0, 334, __pyx_L1_error) } else { __Pyx_GOTREF(__pyx_cur_scope); } - /* "MDAnalysis/lib/formats/libdcd.pyx":334 + /* "MDAnalysis/lib/formats/libdcd.pyx":336 * cdef void _read_header(self): * """read header and populate internal fields""" * if not self.is_open: # <<<<<<<<<<<<<< @@ -5276,20 +5362,20 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_t_1 = ((!(__pyx_v_self->is_open != 0)) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":335 + /* "MDAnalysis/lib/formats/libdcd.pyx":337 * """read header and populate internal fields""" * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * * cdef char* c_remarks */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 335, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 337, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 335, __pyx_L1_error) + __PYX_ERR(0, 337, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":334 + /* "MDAnalysis/lib/formats/libdcd.pyx":336 * cdef void _read_header(self): * """read header and populate internal fields""" * if not self.is_open: # <<<<<<<<<<<<<< @@ -5298,7 +5384,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":338 + /* "MDAnalysis/lib/formats/libdcd.pyx":340 * * cdef char* c_remarks * cdef int len_remarks = 0 # <<<<<<<<<<<<<< @@ -5307,7 +5393,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str */ __pyx_v_len_remarks = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":341 + /* "MDAnalysis/lib/formats/libdcd.pyx":343 * cdef int nsets * * ok = read_dcdheader(self.fp, &self.natoms, &nsets, &self.istart, # <<<<<<<<<<<<<< @@ -5316,7 +5402,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str */ __pyx_v_ok = read_dcdheader(__pyx_v_self->fp, (&__pyx_v_self->natoms), (&__pyx_v_nsets), (&__pyx_v_self->istart), (&__pyx_v_self->nsavc), (&__pyx_v_self->delta), (&__pyx_v_self->nfixed), (&__pyx_v_self->freeind), (&__pyx_v_self->fixedcoords), (&__pyx_v_self->reverse_endian), (&__pyx_v_self->charmm), (&__pyx_v_c_remarks), (&__pyx_v_len_remarks)); - /* "MDAnalysis/lib/formats/libdcd.pyx":345 + /* "MDAnalysis/lib/formats/libdcd.pyx":347 * &self.fixedcoords, &self.reverse_endian, * &self.charmm, &c_remarks, &len_remarks) * if ok != 0: # <<<<<<<<<<<<<< @@ -5326,18 +5412,18 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_t_1 = ((__pyx_v_ok != 0) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":346 + /* "MDAnalysis/lib/formats/libdcd.pyx":348 * &self.charmm, &c_remarks, &len_remarks) * if ok != 0: * raise IOError("Reading DCD header failed: {}".format(DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * * self.is_periodic = bool((self.charmm & DCD_IS_CHARMM) and */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_header_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_header_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; @@ -5351,14 +5437,14 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str } } if (!__pyx_t_4) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_2); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_5}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; @@ -5367,33 +5453,33 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_5}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } else #endif { - __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_5); __pyx_t_5 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 346, __pyx_L1_error) + __PYX_ERR(0, 348, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":345 + /* "MDAnalysis/lib/formats/libdcd.pyx":347 * &self.fixedcoords, &self.reverse_endian, * &self.charmm, &c_remarks, &len_remarks) * if ok != 0: # <<<<<<<<<<<<<< @@ -5402,22 +5488,22 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":348 + /* "MDAnalysis/lib/formats/libdcd.pyx":350 * raise IOError("Reading DCD header failed: {}".format(DCD_ERRORS[ok])) * * self.is_periodic = bool((self.charmm & DCD_IS_CHARMM) and # <<<<<<<<<<<<<< * (self.charmm & DCD_HAS_EXTRA_BLOCK)) * */ - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 348, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_IS_CHARMM); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 348, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_IS_CHARMM); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = PyNumber_And(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 348, __pyx_L1_error) + __pyx_t_6 = PyNumber_And(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 348, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (__pyx_t_7) { } else { @@ -5425,34 +5511,34 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str goto __pyx_L5_bool_binop_done; } - /* "MDAnalysis/lib/formats/libdcd.pyx":349 + /* "MDAnalysis/lib/formats/libdcd.pyx":351 * * self.is_periodic = bool((self.charmm & DCD_IS_CHARMM) and * (self.charmm & DCD_HAS_EXTRA_BLOCK)) # <<<<<<<<<<<<<< * * if c_remarks != NULL: */ - __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 349, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 351, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 351, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_And(__pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 349, __pyx_L1_error) + __pyx_t_3 = PyNumber_And(__pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 351, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 349, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 351, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_1 = __pyx_t_7; __pyx_L5_bool_binop_done:; - /* "MDAnalysis/lib/formats/libdcd.pyx":348 + /* "MDAnalysis/lib/formats/libdcd.pyx":350 * raise IOError("Reading DCD header failed: {}".format(DCD_ERRORS[ok])) * * self.is_periodic = bool((self.charmm & DCD_IS_CHARMM) and # <<<<<<<<<<<<<< * (self.charmm & DCD_HAS_EXTRA_BLOCK)) * */ - __pyx_t_3 = __Pyx_PyBool_FromLong((!(!__pyx_t_1))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 348, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyBool_FromLong((!(!__pyx_t_1))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __Pyx_GOTREF(__pyx_v_self->is_periodic); @@ -5460,7 +5546,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_v_self->is_periodic = __pyx_t_3; __pyx_t_3 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":351 + /* "MDAnalysis/lib/formats/libdcd.pyx":353 * (self.charmm & DCD_HAS_EXTRA_BLOCK)) * * if c_remarks != NULL: # <<<<<<<<<<<<<< @@ -5470,14 +5556,14 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_t_1 = ((__pyx_v_c_remarks != NULL) != 0); if (__pyx_t_1) { - /* "MDAnalysis/lib/formats/libdcd.pyx":352 + /* "MDAnalysis/lib/formats/libdcd.pyx":354 * * if c_remarks != NULL: * py_remarks = c_remarks[:len_remarks] # <<<<<<<<<<<<<< * free(c_remarks) * else: */ - __pyx_t_3 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_c_remarks + 0, __pyx_v_len_remarks - 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 352, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_c_remarks + 0, __pyx_v_len_remarks - 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 354, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); @@ -5486,7 +5572,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_cur_scope->__pyx_v_py_remarks = __pyx_t_2; __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":353 + /* "MDAnalysis/lib/formats/libdcd.pyx":355 * if c_remarks != NULL: * py_remarks = c_remarks[:len_remarks] * free(c_remarks) # <<<<<<<<<<<<<< @@ -5495,7 +5581,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str */ free(__pyx_v_c_remarks); - /* "MDAnalysis/lib/formats/libdcd.pyx":351 + /* "MDAnalysis/lib/formats/libdcd.pyx":353 * (self.charmm & DCD_HAS_EXTRA_BLOCK)) * * if c_remarks != NULL: # <<<<<<<<<<<<<< @@ -5505,7 +5591,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str goto __pyx_L7; } - /* "MDAnalysis/lib/formats/libdcd.pyx":355 + /* "MDAnalysis/lib/formats/libdcd.pyx":357 * free(c_remarks) * else: * py_remarks = "" # <<<<<<<<<<<<<< @@ -5513,28 +5599,28 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str * # This function assumes that the dcd header was already read and */ /*else*/ { - __Pyx_INCREF(__pyx_kp_s__4); - __Pyx_GIVEREF(__pyx_kp_s__4); - __pyx_cur_scope->__pyx_v_py_remarks = __pyx_kp_s__4; + __Pyx_INCREF(__pyx_kp_s__5); + __Pyx_GIVEREF(__pyx_kp_s__5); + __pyx_cur_scope->__pyx_v_py_remarks = __pyx_kp_s__5; } __pyx_L7:; - /* "MDAnalysis/lib/formats/libdcd.pyx":356 + /* "MDAnalysis/lib/formats/libdcd.pyx":358 * else: * py_remarks = "" * self.ndims = 3 if not self.charmm & DCD_HAS_4DIMS else 4 # <<<<<<<<<<<<<< * # This function assumes that the dcd header was already read and * # self.ndims is set. It will only work when called here !!! */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 356, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_4DIMS); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 356, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_4DIMS); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 358, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_6 = PyNumber_And(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 356, __pyx_L1_error) + __pyx_t_6 = PyNumber_And(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 358, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 356, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 358, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (((!__pyx_t_1) != 0)) { __pyx_t_8 = 3; @@ -5543,7 +5629,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str } __pyx_v_self->ndims = __pyx_t_8; - /* "MDAnalysis/lib/formats/libdcd.pyx":359 + /* "MDAnalysis/lib/formats/libdcd.pyx":361 * # This function assumes that the dcd header was already read and * # self.ndims is set. It will only work when called here !!! * self.n_frames = self._estimate_n_frames() # <<<<<<<<<<<<<< @@ -5552,7 +5638,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str */ __pyx_v_self->n_frames = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_7formats_6libdcd_DCDFile *)__pyx_v_self->__pyx_vtab)->_estimate_n_frames(__pyx_v_self); - /* "MDAnalysis/lib/formats/libdcd.pyx":360 + /* "MDAnalysis/lib/formats/libdcd.pyx":362 * # self.ndims is set. It will only work when called here !!! * self.n_frames = self._estimate_n_frames() * self.b_read_header = True # <<<<<<<<<<<<<< @@ -5561,7 +5647,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str */ __pyx_v_self->b_read_header = 1; - /* "MDAnalysis/lib/formats/libdcd.pyx":363 + /* "MDAnalysis/lib/formats/libdcd.pyx":365 * * # make sure fixed atoms have been read * try: # <<<<<<<<<<<<<< @@ -5577,14 +5663,14 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_XGOTREF(__pyx_t_11); /*try:*/ { - /* "MDAnalysis/lib/formats/libdcd.pyx":364 + /* "MDAnalysis/lib/formats/libdcd.pyx":366 * # make sure fixed atoms have been read * try: * self.read() # <<<<<<<<<<<<<< * self.seek(0) * except IOError: */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 364, __pyx_L8_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 366, __pyx_L8_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -5597,30 +5683,30 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str } } if (__pyx_t_2) { - __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 364, __pyx_L8_error) + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 366, __pyx_L8_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else { - __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 364, __pyx_L8_error) + __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 366, __pyx_L8_error) } __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":365 + /* "MDAnalysis/lib/formats/libdcd.pyx":367 * try: * self.read() * self.seek(0) # <<<<<<<<<<<<<< * except IOError: * if self.n_frames != 0: */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_seek); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 365, __pyx_L8_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_seek); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 367, __pyx_L8_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 365, __pyx_L8_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 367, __pyx_L8_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":363 + /* "MDAnalysis/lib/formats/libdcd.pyx":365 * * # make sure fixed atoms have been read * try: # <<<<<<<<<<<<<< @@ -5639,7 +5725,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":366 + /* "MDAnalysis/lib/formats/libdcd.pyx":368 * self.read() * self.seek(0) * except IOError: # <<<<<<<<<<<<<< @@ -5649,12 +5735,12 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_IOError); if (__pyx_t_8) { __Pyx_AddTraceback("MDAnalysis.lib.formats.libdcd.DCDFile._read_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_6, &__pyx_t_2) < 0) __PYX_ERR(0, 366, __pyx_L10_except_error) + if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_6, &__pyx_t_2) < 0) __PYX_ERR(0, 368, __pyx_L10_except_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_2); - /* "MDAnalysis/lib/formats/libdcd.pyx":367 + /* "MDAnalysis/lib/formats/libdcd.pyx":369 * self.seek(0) * except IOError: * if self.n_frames != 0: # <<<<<<<<<<<<<< @@ -5664,20 +5750,20 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_t_1 = ((__pyx_v_self->n_frames != 0) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":368 + /* "MDAnalysis/lib/formats/libdcd.pyx":370 * except IOError: * if self.n_frames != 0: * raise IOError("DCD is corrupted") # <<<<<<<<<<<<<< * * if sys.version_info[0] < 3: */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 368, __pyx_L10_except_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 370, __pyx_L10_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(0, 368, __pyx_L10_except_error) + __PYX_ERR(0, 370, __pyx_L10_except_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":367 + /* "MDAnalysis/lib/formats/libdcd.pyx":369 * self.seek(0) * except IOError: * if self.n_frames != 0: # <<<<<<<<<<<<<< @@ -5693,7 +5779,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str goto __pyx_L10_except_error; __pyx_L10_except_error:; - /* "MDAnalysis/lib/formats/libdcd.pyx":363 + /* "MDAnalysis/lib/formats/libdcd.pyx":365 * * # make sure fixed atoms have been read * try: # <<<<<<<<<<<<<< @@ -5713,35 +5799,35 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_L13_try_end:; } - /* "MDAnalysis/lib/formats/libdcd.pyx":370 + /* "MDAnalysis/lib/formats/libdcd.pyx":372 * raise IOError("DCD is corrupted") * * if sys.version_info[0] < 3: # <<<<<<<<<<<<<< * py_remarks = unicode(py_remarks, 'ascii', "ignore") * py_remarks = str(py_remarks.encode('ascii', 'ignore')) */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_sys); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 370, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_sys); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_version_info); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 370, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_version_info); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_6, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 370, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_6, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_int_3, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 370, __pyx_L1_error) + __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_int_3, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 370, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (__pyx_t_1) { - /* "MDAnalysis/lib/formats/libdcd.pyx":371 + /* "MDAnalysis/lib/formats/libdcd.pyx":373 * * if sys.version_info[0] < 3: * py_remarks = unicode(py_remarks, 'ascii', "ignore") # <<<<<<<<<<<<<< * py_remarks = str(py_remarks.encode('ascii', 'ignore')) * else: */ - __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 371, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 373, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_INCREF(__pyx_cur_scope->__pyx_v_py_remarks); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_py_remarks); @@ -5752,7 +5838,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_INCREF(__pyx_n_s_ignore); __Pyx_GIVEREF(__pyx_n_s_ignore); PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_n_s_ignore); - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)(&PyUnicode_Type)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 371, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)(&PyUnicode_Type)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 373, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_py_remarks); @@ -5760,19 +5846,19 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":372 + /* "MDAnalysis/lib/formats/libdcd.pyx":374 * if sys.version_info[0] < 3: * py_remarks = unicode(py_remarks, 'ascii', "ignore") * py_remarks = str(py_remarks.encode('ascii', 'ignore')) # <<<<<<<<<<<<<< * else: * if isinstance(py_remarks, bytes): */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_py_remarks, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 372, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_py_remarks, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 374, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 372, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 374, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyString_Type)), __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 372, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyString_Type)), __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 374, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_py_remarks); @@ -5780,7 +5866,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":370 + /* "MDAnalysis/lib/formats/libdcd.pyx":372 * raise IOError("DCD is corrupted") * * if sys.version_info[0] < 3: # <<<<<<<<<<<<<< @@ -5790,7 +5876,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str goto __pyx_L17; } - /* "MDAnalysis/lib/formats/libdcd.pyx":374 + /* "MDAnalysis/lib/formats/libdcd.pyx":376 * py_remarks = str(py_remarks.encode('ascii', 'ignore')) * else: * if isinstance(py_remarks, bytes): # <<<<<<<<<<<<<< @@ -5805,16 +5891,16 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __pyx_t_7 = (__pyx_t_1 != 0); if (__pyx_t_7) { - /* "MDAnalysis/lib/formats/libdcd.pyx":375 + /* "MDAnalysis/lib/formats/libdcd.pyx":377 * else: * if isinstance(py_remarks, bytes): * py_remarks = py_remarks.decode('ascii', 'ignore') # <<<<<<<<<<<<<< * * py_remarks = "".join(s for s in py_remarks if s in string.printable) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_py_remarks, __pyx_n_s_decode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 375, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_py_remarks, __pyx_n_s_decode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 377, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 375, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 377, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_py_remarks); @@ -5822,7 +5908,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":374 + /* "MDAnalysis/lib/formats/libdcd.pyx":376 * py_remarks = str(py_remarks.encode('ascii', 'ignore')) * else: * if isinstance(py_remarks, bytes): # <<<<<<<<<<<<<< @@ -5833,16 +5919,16 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str } __pyx_L17:; - /* "MDAnalysis/lib/formats/libdcd.pyx":377 + /* "MDAnalysis/lib/formats/libdcd.pyx":379 * py_remarks = py_remarks.decode('ascii', 'ignore') * * py_remarks = "".join(s for s in py_remarks if s in string.printable) # <<<<<<<<<<<<<< * * self.remarks = py_remarks */ - __pyx_t_6 = __pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_header_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_6 = __pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_read_header_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_2 = __Pyx_PyString_Join(__pyx_kp_s__4, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 377, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyString_Join(__pyx_kp_s__5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 379, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_py_remarks); @@ -5850,7 +5936,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":379 + /* "MDAnalysis/lib/formats/libdcd.pyx":381 * py_remarks = "".join(s for s in py_remarks if s in string.printable) * * self.remarks = py_remarks # <<<<<<<<<<<<<< @@ -5863,7 +5949,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_DECREF(__pyx_v_self->remarks); __pyx_v_self->remarks = __pyx_cur_scope->__pyx_v_py_remarks; - /* "MDAnalysis/lib/formats/libdcd.pyx":332 + /* "MDAnalysis/lib/formats/libdcd.pyx":334 * * * cdef void _read_header(self): # <<<<<<<<<<<<<< @@ -5885,7 +5971,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__read_header(str __Pyx_RefNannyFinishContext(); } -/* "MDAnalysis/lib/formats/libdcd.pyx":381 +/* "MDAnalysis/lib/formats/libdcd.pyx":383 * self.remarks = py_remarks * * cdef int _estimate_n_frames(self): # <<<<<<<<<<<<<< @@ -5907,22 +5993,22 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__estimate_n_frame int __pyx_t_6; __Pyx_RefNannySetupContext("_estimate_n_frames", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":384 + /* "MDAnalysis/lib/formats/libdcd.pyx":386 * """ Only call this function in _read_header!!! * """ * extrablocksize = 48 + 8 if self.charmm & DCD_HAS_EXTRA_BLOCK else 0 # <<<<<<<<<<<<<< * self._firstframesize = (self.natoms + 2) * self.ndims * sizeof(float) + extrablocksize * self._framesize = ((self.natoms - self.nfixed + 2) * self.ndims * sizeof(float) + */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 384, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyNumber_And(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error) + __pyx_t_4 = PyNumber_And(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 384, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_5) { __Pyx_INCREF(__pyx_int_56); @@ -5934,64 +6020,64 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__estimate_n_frame __pyx_v_extrablocksize = __pyx_t_1; __pyx_t_1 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":385 + /* "MDAnalysis/lib/formats/libdcd.pyx":387 * """ * extrablocksize = 48 + 8 if self.charmm & DCD_HAS_EXTRA_BLOCK else 0 * self._firstframesize = (self.natoms + 2) * self.ndims * sizeof(float) + extrablocksize # <<<<<<<<<<<<<< * self._framesize = ((self.natoms - self.nfixed + 2) * self.ndims * sizeof(float) + * extrablocksize) */ - __pyx_t_1 = __Pyx_PyInt_FromSize_t((((__pyx_v_self->natoms + 2) * __pyx_v_self->ndims) * (sizeof(float)))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 385, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_FromSize_t((((__pyx_v_self->natoms + 2) * __pyx_v_self->ndims) * (sizeof(float)))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 387, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = PyNumber_Add(__pyx_t_1, __pyx_v_extrablocksize); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 385, __pyx_L1_error) + __pyx_t_4 = PyNumber_Add(__pyx_t_1, __pyx_v_extrablocksize); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 387, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 385, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 387, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_self->_firstframesize = __pyx_t_6; - /* "MDAnalysis/lib/formats/libdcd.pyx":386 + /* "MDAnalysis/lib/formats/libdcd.pyx":388 * extrablocksize = 48 + 8 if self.charmm & DCD_HAS_EXTRA_BLOCK else 0 * self._firstframesize = (self.natoms + 2) * self.ndims * sizeof(float) + extrablocksize * self._framesize = ((self.natoms - self.nfixed + 2) * self.ndims * sizeof(float) + # <<<<<<<<<<<<<< * extrablocksize) * filesize = path.getsize(self.fname) */ - __pyx_t_4 = __Pyx_PyInt_FromSize_t(((((__pyx_v_self->natoms - __pyx_v_self->nfixed) + 2) * __pyx_v_self->ndims) * (sizeof(float)))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 386, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_FromSize_t(((((__pyx_v_self->natoms - __pyx_v_self->nfixed) + 2) * __pyx_v_self->ndims) * (sizeof(float)))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 388, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - /* "MDAnalysis/lib/formats/libdcd.pyx":387 + /* "MDAnalysis/lib/formats/libdcd.pyx":389 * self._firstframesize = (self.natoms + 2) * self.ndims * sizeof(float) + extrablocksize * self._framesize = ((self.natoms - self.nfixed + 2) * self.ndims * sizeof(float) + * extrablocksize) # <<<<<<<<<<<<<< * filesize = path.getsize(self.fname) * # It's safe to use ftell, even though ftell returns a long, because the */ - __pyx_t_1 = PyNumber_Add(__pyx_t_4, __pyx_v_extrablocksize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 386, __pyx_L1_error) + __pyx_t_1 = PyNumber_Add(__pyx_t_4, __pyx_v_extrablocksize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 388, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":386 + /* "MDAnalysis/lib/formats/libdcd.pyx":388 * extrablocksize = 48 + 8 if self.charmm & DCD_HAS_EXTRA_BLOCK else 0 * self._firstframesize = (self.natoms + 2) * self.ndims * sizeof(float) + extrablocksize * self._framesize = ((self.natoms - self.nfixed + 2) * self.ndims * sizeof(float) + # <<<<<<<<<<<<<< * extrablocksize) * filesize = path.getsize(self.fname) */ - __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 386, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 388, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_self->_framesize = __pyx_t_6; - /* "MDAnalysis/lib/formats/libdcd.pyx":388 + /* "MDAnalysis/lib/formats/libdcd.pyx":390 * self._framesize = ((self.natoms - self.nfixed + 2) * self.ndims * sizeof(float) + * extrablocksize) * filesize = path.getsize(self.fname) # <<<<<<<<<<<<<< * # It's safe to use ftell, even though ftell returns a long, because the * # header size is < 4GB. */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_path); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 388, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_path); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_getsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 388, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_getsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; @@ -6005,13 +6091,13 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__estimate_n_frame } } if (!__pyx_t_4) { - __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_self->fname); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 388, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_self->fname); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_v_self->fname}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 388, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_1); } else @@ -6019,19 +6105,19 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__estimate_n_frame #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_v_self->fname}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 388, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_1); } else #endif { - __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 388, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4); __pyx_t_4 = NULL; __Pyx_INCREF(__pyx_v_self->fname); __Pyx_GIVEREF(__pyx_v_self->fname); PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_v_self->fname); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 388, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } @@ -6040,7 +6126,7 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__estimate_n_frame __pyx_v_filesize = __pyx_t_1; __pyx_t_1 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":391 + /* "MDAnalysis/lib/formats/libdcd.pyx":393 * # It's safe to use ftell, even though ftell returns a long, because the * # header size is < 4GB. * self._header_size = fio_ftell(self.fp) # <<<<<<<<<<<<<< @@ -6049,48 +6135,48 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__estimate_n_frame */ __pyx_v_self->_header_size = fio_ftell(__pyx_v_self->fp); - /* "MDAnalysis/lib/formats/libdcd.pyx":392 + /* "MDAnalysis/lib/formats/libdcd.pyx":394 * # header size is < 4GB. * self._header_size = fio_ftell(self.fp) * nframessize = filesize - self._header_size - self._firstframesize # <<<<<<<<<<<<<< * return nframessize / self._framesize + 1 * */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_header_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 392, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_header_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyNumber_Subtract(__pyx_v_filesize, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 392, __pyx_L1_error) + __pyx_t_3 = PyNumber_Subtract(__pyx_v_filesize, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_firstframesize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 392, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_firstframesize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyNumber_Subtract(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 392, __pyx_L1_error) + __pyx_t_2 = PyNumber_Subtract(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_nframessize = __pyx_t_2; __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":393 + /* "MDAnalysis/lib/formats/libdcd.pyx":395 * self._header_size = fio_ftell(self.fp) * nframessize = filesize - self._header_size - self._firstframesize * return nframessize / self._framesize + 1 # <<<<<<<<<<<<<< * * def seek(self, frame): */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->_framesize); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 393, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->_framesize); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_v_nframessize, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 393, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_v_nframessize, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 395, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 393, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 393, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_6; goto __pyx_L0; - /* "MDAnalysis/lib/formats/libdcd.pyx":381 + /* "MDAnalysis/lib/formats/libdcd.pyx":383 * self.remarks = py_remarks * * cdef int _estimate_n_frames(self): # <<<<<<<<<<<<<< @@ -6114,7 +6200,7 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile__estimate_n_frame return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":395 +/* "MDAnalysis/lib/formats/libdcd.pyx":397 * return nframessize / self._framesize + 1 * * def seek(self, frame): # <<<<<<<<<<<<<< @@ -6151,35 +6237,35 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("seek", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":406 + /* "MDAnalysis/lib/formats/libdcd.pyx":408 * * """ * if frame >= self.n_frames: # <<<<<<<<<<<<<< * raise EOFError('Trying to seek over max number of frames') * self.reached_eof = False */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->n_frames); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 406, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->n_frames); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyObject_RichCompare(__pyx_v_frame, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 406, __pyx_L1_error) + __pyx_t_2 = PyObject_RichCompare(__pyx_v_frame, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 406, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":407 + /* "MDAnalysis/lib/formats/libdcd.pyx":409 * """ * if frame >= self.n_frames: * raise EOFError('Trying to seek over max number of frames') # <<<<<<<<<<<<<< * self.reached_eof = False * */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_EOFError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 407, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_EOFError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 409, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 407, __pyx_L1_error) + __PYX_ERR(0, 409, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":406 + /* "MDAnalysis/lib/formats/libdcd.pyx":408 * * """ * if frame >= self.n_frames: # <<<<<<<<<<<<<< @@ -6188,7 +6274,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":408 + /* "MDAnalysis/lib/formats/libdcd.pyx":410 * if frame >= self.n_frames: * raise EOFError('Trying to seek over max number of frames') * self.reached_eof = False # <<<<<<<<<<<<<< @@ -6197,20 +6283,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str */ __pyx_v_self->reached_eof = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":411 + /* "MDAnalysis/lib/formats/libdcd.pyx":413 * * cdef fio_size_t offset * if frame == 0: # <<<<<<<<<<<<<< * offset = self._header_size * else: */ - __pyx_t_2 = __Pyx_PyInt_EqObjC(__pyx_v_frame, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 411, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_EqObjC(__pyx_v_frame, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 413, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 411, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 413, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { - /* "MDAnalysis/lib/formats/libdcd.pyx":412 + /* "MDAnalysis/lib/formats/libdcd.pyx":414 * cdef fio_size_t offset * if frame == 0: * offset = self._header_size # <<<<<<<<<<<<<< @@ -6220,7 +6306,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str __pyx_t_4 = __pyx_v_self->_header_size; __pyx_v_offset = __pyx_t_4; - /* "MDAnalysis/lib/formats/libdcd.pyx":411 + /* "MDAnalysis/lib/formats/libdcd.pyx":413 * * cdef fio_size_t offset * if frame == 0: # <<<<<<<<<<<<<< @@ -6230,7 +6316,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str goto __pyx_L4; } - /* "MDAnalysis/lib/formats/libdcd.pyx":414 + /* "MDAnalysis/lib/formats/libdcd.pyx":416 * offset = self._header_size * else: * offset = self._header_size + self._firstframesize + self._framesize * (frame - 1) # <<<<<<<<<<<<<< @@ -6238,43 +6324,43 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str * ok = fio_fseek(self.fp, offset, _whence_vals["FIO_SEEK_SET"]) */ /*else*/ { - __pyx_t_2 = __Pyx_PyInt_From_int((__pyx_v_self->_header_size + __pyx_v_self->_firstframesize)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 414, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int((__pyx_v_self->_header_size + __pyx_v_self->_firstframesize)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 416, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_framesize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 414, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_framesize); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 416, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyInt_SubtractObjC(__pyx_v_frame, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 414, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_SubtractObjC(__pyx_v_frame, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 416, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyNumber_Multiply(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 414, __pyx_L1_error) + __pyx_t_6 = PyNumber_Multiply(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 416, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyNumber_Add(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 414, __pyx_L1_error) + __pyx_t_5 = PyNumber_Add(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 416, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_7 = __Pyx_PyInt_As_off_t(__pyx_t_5); if (unlikely((__pyx_t_7 == ((off_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 414, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyInt_As_off_t(__pyx_t_5); if (unlikely((__pyx_t_7 == ((off_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 416, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_offset = __pyx_t_7; } __pyx_L4:; - /* "MDAnalysis/lib/formats/libdcd.pyx":416 + /* "MDAnalysis/lib/formats/libdcd.pyx":418 * offset = self._header_size + self._firstframesize + self._framesize * (frame - 1) * * ok = fio_fseek(self.fp, offset, _whence_vals["FIO_SEEK_SET"]) # <<<<<<<<<<<<<< * if ok != 0: * raise IOError("DCD seek failed with DCD error={}".format(DCD_ERRORS[ok])) */ - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_whence_vals); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 416, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_whence_vals); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyObject_Dict_GetItem(__pyx_t_5, __pyx_n_s_FIO_SEEK_SET); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 416, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Dict_GetItem(__pyx_t_5, __pyx_n_s_FIO_SEEK_SET); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 416, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_ok = fio_fseek(__pyx_v_self->fp, __pyx_v_offset, __pyx_t_4); - /* "MDAnalysis/lib/formats/libdcd.pyx":417 + /* "MDAnalysis/lib/formats/libdcd.pyx":419 * * ok = fio_fseek(self.fp, offset, _whence_vals["FIO_SEEK_SET"]) * if ok != 0: # <<<<<<<<<<<<<< @@ -6284,18 +6370,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str __pyx_t_3 = ((__pyx_v_ok != 0) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":418 + /* "MDAnalysis/lib/formats/libdcd.pyx":420 * ok = fio_fseek(self.fp, offset, _whence_vals["FIO_SEEK_SET"]) * if ok != 0: * raise IOError("DCD seek failed with DCD error={}".format(DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * self.current_frame = frame * */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_DCD_seek_failed_with_DCD_error, __pyx_n_s_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_DCD_seek_failed_with_DCD_error, __pyx_n_s_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_ok, __pyx_t_10MDAnalysis_3lib_7formats_6libdcd_fio_size_t, 1, __Pyx_PyInt_From_off_t, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_ok, __pyx_t_10MDAnalysis_3lib_7formats_6libdcd_fio_size_t, 1, __Pyx_PyInt_From_off_t, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; @@ -6309,14 +6395,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str } } if (!__pyx_t_2) { - __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_GOTREF(__pyx_t_6); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_1}; - __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -6325,33 +6411,33 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_1}; - __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } else #endif { - __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2); __pyx_t_2 = NULL; __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 418, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(0, 418, __pyx_L1_error) + __PYX_ERR(0, 420, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":417 + /* "MDAnalysis/lib/formats/libdcd.pyx":419 * * ok = fio_fseek(self.fp, offset, _whence_vals["FIO_SEEK_SET"]) * if ok != 0: # <<<<<<<<<<<<<< @@ -6360,17 +6446,17 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":419 + /* "MDAnalysis/lib/formats/libdcd.pyx":421 * if ok != 0: * raise IOError("DCD seek failed with DCD error={}".format(DCD_ERRORS[ok])) * self.current_frame = frame # <<<<<<<<<<<<<< * * @property */ - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_frame); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 419, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_frame); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 421, __pyx_L1_error) __pyx_v_self->current_frame = __pyx_t_4; - /* "MDAnalysis/lib/formats/libdcd.pyx":395 + /* "MDAnalysis/lib/formats/libdcd.pyx":397 * return nframessize / self._framesize + 1 * * def seek(self, frame): # <<<<<<<<<<<<<< @@ -6395,7 +6481,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_26seek(str return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":422 +/* "MDAnalysis/lib/formats/libdcd.pyx":424 * * @property * def header(self): # <<<<<<<<<<<<<< @@ -6423,7 +6509,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_6header___ PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("__get__", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":436 + /* "MDAnalysis/lib/formats/libdcd.pyx":438 * * """ * return {'natoms': self.natoms, # <<<<<<<<<<<<<< @@ -6431,71 +6517,71 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_6header___ * 'nsavc': self.nsavc, */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyDict_NewPresized(6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 436, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyDict_NewPresized(6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 438, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 436, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 438, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_natoms, __pyx_t_2) < 0) __PYX_ERR(0, 436, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_natoms, __pyx_t_2) < 0) __PYX_ERR(0, 438, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":437 + /* "MDAnalysis/lib/formats/libdcd.pyx":439 * """ * return {'natoms': self.natoms, * 'istart': self.istart, # <<<<<<<<<<<<<< * 'nsavc': self.nsavc, * 'delta': self.delta, */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->istart); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 437, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->istart); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 439, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_istart, __pyx_t_2) < 0) __PYX_ERR(0, 436, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_istart, __pyx_t_2) < 0) __PYX_ERR(0, 438, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":438 + /* "MDAnalysis/lib/formats/libdcd.pyx":440 * return {'natoms': self.natoms, * 'istart': self.istart, * 'nsavc': self.nsavc, # <<<<<<<<<<<<<< * 'delta': self.delta, * 'is_periodic': self.is_periodic, */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nsavc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 438, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->nsavc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 440, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_nsavc, __pyx_t_2) < 0) __PYX_ERR(0, 436, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_nsavc, __pyx_t_2) < 0) __PYX_ERR(0, 438, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":439 + /* "MDAnalysis/lib/formats/libdcd.pyx":441 * 'istart': self.istart, * 'nsavc': self.nsavc, * 'delta': self.delta, # <<<<<<<<<<<<<< * 'is_periodic': self.is_periodic, * 'remarks': self.remarks} */ - __pyx_t_2 = PyFloat_FromDouble(__pyx_v_self->delta); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 439, __pyx_L1_error) + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_self->delta); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 441, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_delta, __pyx_t_2) < 0) __PYX_ERR(0, 436, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_delta, __pyx_t_2) < 0) __PYX_ERR(0, 438, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":440 + /* "MDAnalysis/lib/formats/libdcd.pyx":442 * 'nsavc': self.nsavc, * 'delta': self.delta, * 'is_periodic': self.is_periodic, # <<<<<<<<<<<<<< * 'remarks': self.remarks} * */ - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_is_periodic, __pyx_v_self->is_periodic) < 0) __PYX_ERR(0, 436, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_is_periodic, __pyx_v_self->is_periodic) < 0) __PYX_ERR(0, 438, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":441 + /* "MDAnalysis/lib/formats/libdcd.pyx":443 * 'delta': self.delta, * 'is_periodic': self.is_periodic, * 'remarks': self.remarks} # <<<<<<<<<<<<<< * * @property */ - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_remarks, __pyx_v_self->remarks) < 0) __PYX_ERR(0, 436, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_remarks, __pyx_v_self->remarks) < 0) __PYX_ERR(0, 438, __pyx_L1_error) __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/formats/libdcd.pyx":422 + /* "MDAnalysis/lib/formats/libdcd.pyx":424 * * @property * def header(self): # <<<<<<<<<<<<<< @@ -6515,7 +6601,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_6header___ return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":444 +/* "MDAnalysis/lib/formats/libdcd.pyx":446 * * @property * def charmm_bitfield(self): # <<<<<<<<<<<<<< @@ -6542,7 +6628,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_15charmm_b PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("__get__", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":460 + /* "MDAnalysis/lib/formats/libdcd.pyx":462 * * """ * return self.charmm # <<<<<<<<<<<<<< @@ -6550,13 +6636,13 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_15charmm_b * def write_header(self, remarks, natoms, istart, nsavc, delta, is_periodic): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 460, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 462, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/formats/libdcd.pyx":444 + /* "MDAnalysis/lib/formats/libdcd.pyx":446 * * @property * def charmm_bitfield(self): # <<<<<<<<<<<<<< @@ -6575,7 +6661,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_15charmm_b return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":462 +/* "MDAnalysis/lib/formats/libdcd.pyx":464 * return self.charmm * * def write_header(self, remarks, natoms, istart, nsavc, delta, is_periodic): # <<<<<<<<<<<<<< @@ -6627,35 +6713,35 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_29write_he case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_natoms)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 1); __PYX_ERR(0, 462, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 1); __PYX_ERR(0, 464, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_istart)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 2); __PYX_ERR(0, 462, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 2); __PYX_ERR(0, 464, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_nsavc)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 3); __PYX_ERR(0, 462, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 3); __PYX_ERR(0, 464, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_delta)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 4); __PYX_ERR(0, 462, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 4); __PYX_ERR(0, 464, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_is_periodic)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 5); __PYX_ERR(0, 462, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, 5); __PYX_ERR(0, 464, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_header") < 0)) __PYX_ERR(0, 462, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write_header") < 0)) __PYX_ERR(0, 464, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { goto __pyx_L5_argtuple_error; @@ -6676,7 +6762,7 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_29write_he } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 462, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("write_header", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 464, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.formats.libdcd.DCDFile.write_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -6711,7 +6797,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __Pyx_RefNannySetupContext("write_header", 0); __Pyx_INCREF(__pyx_v_remarks); - /* "MDAnalysis/lib/formats/libdcd.pyx":485 + /* "MDAnalysis/lib/formats/libdcd.pyx":487 * * """ * if not self.is_open: # <<<<<<<<<<<<<< @@ -6721,20 +6807,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __pyx_t_1 = ((!(__pyx_v_self->is_open != 0)) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":486 + /* "MDAnalysis/lib/formats/libdcd.pyx":488 * """ * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if not self.mode=='w': * raise IOError("Incorrect file mode for writing.") */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 486, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 486, __pyx_L1_error) + __PYX_ERR(0, 488, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":485 + /* "MDAnalysis/lib/formats/libdcd.pyx":487 * * """ * if not self.is_open: # <<<<<<<<<<<<<< @@ -6743,31 +6829,31 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":487 + /* "MDAnalysis/lib/formats/libdcd.pyx":489 * if not self.is_open: * raise IOError("No file open") * if not self.mode=='w': # <<<<<<<<<<<<<< * raise IOError("Incorrect file mode for writing.") * if self.wrote_header: */ - __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_w, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 487, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_w, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 489, __pyx_L1_error) __pyx_t_3 = ((!(__pyx_t_1 != 0)) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":488 + /* "MDAnalysis/lib/formats/libdcd.pyx":490 * raise IOError("No file open") * if not self.mode=='w': * raise IOError("Incorrect file mode for writing.") # <<<<<<<<<<<<<< * if self.wrote_header: * raise IOError("Header already written") */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 488, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 488, __pyx_L1_error) + __PYX_ERR(0, 490, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":487 + /* "MDAnalysis/lib/formats/libdcd.pyx":489 * if not self.is_open: * raise IOError("No file open") * if not self.mode=='w': # <<<<<<<<<<<<<< @@ -6776,7 +6862,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":489 + /* "MDAnalysis/lib/formats/libdcd.pyx":491 * if not self.mode=='w': * raise IOError("Incorrect file mode for writing.") * if self.wrote_header: # <<<<<<<<<<<<<< @@ -6786,20 +6872,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __pyx_t_3 = (__pyx_v_self->wrote_header != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":490 + /* "MDAnalysis/lib/formats/libdcd.pyx":492 * raise IOError("Incorrect file mode for writing.") * if self.wrote_header: * raise IOError("Header already written") # <<<<<<<<<<<<<< * * cdef int with_unitcell = is_periodic */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 490, __pyx_L1_error) + __PYX_ERR(0, 492, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":489 + /* "MDAnalysis/lib/formats/libdcd.pyx":491 * if not self.mode=='w': * raise IOError("Incorrect file mode for writing.") * if self.wrote_header: # <<<<<<<<<<<<<< @@ -6808,46 +6894,46 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":492 + /* "MDAnalysis/lib/formats/libdcd.pyx":494 * raise IOError("Header already written") * * cdef int with_unitcell = is_periodic # <<<<<<<<<<<<<< * if is_periodic: * self.charmm = DCD_HAS_EXTRA_BLOCK | DCD_IS_CHARMM */ - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_is_periodic); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 492, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_is_periodic); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 494, __pyx_L1_error) __pyx_v_with_unitcell = __pyx_t_4; - /* "MDAnalysis/lib/formats/libdcd.pyx":493 + /* "MDAnalysis/lib/formats/libdcd.pyx":495 * * cdef int with_unitcell = is_periodic * if is_periodic: # <<<<<<<<<<<<<< * self.charmm = DCD_HAS_EXTRA_BLOCK | DCD_IS_CHARMM * self.natoms = natoms */ - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_is_periodic); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 493, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_is_periodic); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 495, __pyx_L1_error) if (__pyx_t_3) { - /* "MDAnalysis/lib/formats/libdcd.pyx":494 + /* "MDAnalysis/lib/formats/libdcd.pyx":496 * cdef int with_unitcell = is_periodic * if is_periodic: * self.charmm = DCD_HAS_EXTRA_BLOCK | DCD_IS_CHARMM # <<<<<<<<<<<<<< * self.natoms = natoms * */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 494, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 496, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_IS_CHARMM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 494, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_IS_CHARMM); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 496, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyNumber_Or(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 494, __pyx_L1_error) + __pyx_t_6 = PyNumber_Or(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 496, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 494, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 496, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_self->charmm = __pyx_t_4; - /* "MDAnalysis/lib/formats/libdcd.pyx":493 + /* "MDAnalysis/lib/formats/libdcd.pyx":495 * * cdef int with_unitcell = is_periodic * if is_periodic: # <<<<<<<<<<<<<< @@ -6856,34 +6942,34 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":495 + /* "MDAnalysis/lib/formats/libdcd.pyx":497 * if is_periodic: * self.charmm = DCD_HAS_EXTRA_BLOCK | DCD_IS_CHARMM * self.natoms = natoms # <<<<<<<<<<<<<< * * if isinstance(remarks, six.string_types): */ - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_natoms); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 495, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_natoms); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 497, __pyx_L1_error) __pyx_v_self->natoms = __pyx_t_4; - /* "MDAnalysis/lib/formats/libdcd.pyx":497 + /* "MDAnalysis/lib/formats/libdcd.pyx":499 * self.natoms = natoms * * if isinstance(remarks, six.string_types): # <<<<<<<<<<<<<< * try: * remarks = bytearray(remarks, 'ascii') */ - __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_six); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 497, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_six); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 499, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_string_types); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 497, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_string_types); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 499, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_3 = PyObject_IsInstance(__pyx_v_remarks, __pyx_t_5); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 497, __pyx_L1_error) + __pyx_t_3 = PyObject_IsInstance(__pyx_v_remarks, __pyx_t_5); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 499, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_1 = (__pyx_t_3 != 0); if (__pyx_t_1) { - /* "MDAnalysis/lib/formats/libdcd.pyx":498 + /* "MDAnalysis/lib/formats/libdcd.pyx":500 * * if isinstance(remarks, six.string_types): * try: # <<<<<<<<<<<<<< @@ -6899,14 +6985,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __Pyx_XGOTREF(__pyx_t_9); /*try:*/ { - /* "MDAnalysis/lib/formats/libdcd.pyx":499 + /* "MDAnalysis/lib/formats/libdcd.pyx":501 * if isinstance(remarks, six.string_types): * try: * remarks = bytearray(remarks, 'ascii') # <<<<<<<<<<<<<< * except UnicodeDecodeError: * remarks = bytearray(remarks) */ - __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 499, __pyx_L8_error) + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 501, __pyx_L8_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_remarks); __Pyx_GIVEREF(__pyx_v_remarks); @@ -6914,13 +7000,13 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __Pyx_INCREF(__pyx_n_s_ascii); __Pyx_GIVEREF(__pyx_n_s_ascii); PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_n_s_ascii); - __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)(&PyByteArray_Type)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 499, __pyx_L8_error) + __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)(&PyByteArray_Type)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 501, __pyx_L8_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF_SET(__pyx_v_remarks, __pyx_t_6); __pyx_t_6 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":498 + /* "MDAnalysis/lib/formats/libdcd.pyx":500 * * if isinstance(remarks, six.string_types): * try: # <<<<<<<<<<<<<< @@ -6937,7 +7023,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":500 + /* "MDAnalysis/lib/formats/libdcd.pyx":502 * try: * remarks = bytearray(remarks, 'ascii') * except UnicodeDecodeError: # <<<<<<<<<<<<<< @@ -6947,19 +7033,19 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError); if (__pyx_t_4) { __Pyx_AddTraceback("MDAnalysis.lib.formats.libdcd.DCDFile.write_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_2) < 0) __PYX_ERR(0, 500, __pyx_L10_except_error) + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_2) < 0) __PYX_ERR(0, 502, __pyx_L10_except_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_2); - /* "MDAnalysis/lib/formats/libdcd.pyx":501 + /* "MDAnalysis/lib/formats/libdcd.pyx":503 * remarks = bytearray(remarks, 'ascii') * except UnicodeDecodeError: * remarks = bytearray(remarks) # <<<<<<<<<<<<<< * * ok = write_dcdheader(self.fp, remarks, self.natoms, istart, */ - __pyx_t_10 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyByteArray_Type)), __pyx_v_remarks); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 501, __pyx_L10_except_error) + __pyx_t_10 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyByteArray_Type)), __pyx_v_remarks); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 503, __pyx_L10_except_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF_SET(__pyx_v_remarks, __pyx_t_10); __pyx_t_10 = 0; @@ -6971,7 +7057,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he goto __pyx_L10_except_error; __pyx_L10_except_error:; - /* "MDAnalysis/lib/formats/libdcd.pyx":498 + /* "MDAnalysis/lib/formats/libdcd.pyx":500 * * if isinstance(remarks, six.string_types): * try: # <<<<<<<<<<<<<< @@ -6991,7 +7077,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __pyx_L13_try_end:; } - /* "MDAnalysis/lib/formats/libdcd.pyx":497 + /* "MDAnalysis/lib/formats/libdcd.pyx":499 * self.natoms = natoms * * if isinstance(remarks, six.string_types): # <<<<<<<<<<<<<< @@ -7000,27 +7086,27 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":503 + /* "MDAnalysis/lib/formats/libdcd.pyx":505 * remarks = bytearray(remarks) * * ok = write_dcdheader(self.fp, remarks, self.natoms, istart, # <<<<<<<<<<<<<< * nsavc, delta, with_unitcell, * self.charmm) */ - __pyx_t_11 = __Pyx_PyObject_AsString(__pyx_v_remarks); if (unlikely((!__pyx_t_11) && PyErr_Occurred())) __PYX_ERR(0, 503, __pyx_L1_error) - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_istart); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 503, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyObject_AsString(__pyx_v_remarks); if (unlikely((!__pyx_t_11) && PyErr_Occurred())) __PYX_ERR(0, 505, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_istart); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 505, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":504 + /* "MDAnalysis/lib/formats/libdcd.pyx":506 * * ok = write_dcdheader(self.fp, remarks, self.natoms, istart, * nsavc, delta, with_unitcell, # <<<<<<<<<<<<<< * self.charmm) * if ok != 0: */ - __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_v_nsavc); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 504, __pyx_L1_error) - __pyx_t_13 = __pyx_PyFloat_AsDouble(__pyx_v_delta); if (unlikely((__pyx_t_13 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 504, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_v_nsavc); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 506, __pyx_L1_error) + __pyx_t_13 = __pyx_PyFloat_AsDouble(__pyx_v_delta); if (unlikely((__pyx_t_13 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 506, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":503 + /* "MDAnalysis/lib/formats/libdcd.pyx":505 * remarks = bytearray(remarks) * * ok = write_dcdheader(self.fp, remarks, self.natoms, istart, # <<<<<<<<<<<<<< @@ -7029,7 +7115,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ __pyx_v_ok = write_dcdheader(__pyx_v_self->fp, __pyx_t_11, __pyx_v_self->natoms, __pyx_t_4, __pyx_t_12, __pyx_t_13, __pyx_v_with_unitcell, __pyx_v_self->charmm); - /* "MDAnalysis/lib/formats/libdcd.pyx":506 + /* "MDAnalysis/lib/formats/libdcd.pyx":508 * nsavc, delta, with_unitcell, * self.charmm) * if ok != 0: # <<<<<<<<<<<<<< @@ -7039,18 +7125,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he __pyx_t_1 = ((__pyx_v_ok != 0) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":507 + /* "MDAnalysis/lib/formats/libdcd.pyx":509 * self.charmm) * if ok != 0: * raise IOError("Writing DCD header failed: {}".format(DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * self.wrote_header = True * */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Writing_DCD_header_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Writing_DCD_header_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = NULL; @@ -7064,14 +7150,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he } } if (!__pyx_t_6) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_2); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_10}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; @@ -7080,33 +7166,33 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_10}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } else #endif { - __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_6); __pyx_t_6 = NULL; __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_t_10); __pyx_t_10 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_14, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_14, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; } } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 507, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 509, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(0, 507, __pyx_L1_error) + __PYX_ERR(0, 509, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":506 + /* "MDAnalysis/lib/formats/libdcd.pyx":508 * nsavc, delta, with_unitcell, * self.charmm) * if ok != 0: # <<<<<<<<<<<<<< @@ -7115,7 +7201,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":508 + /* "MDAnalysis/lib/formats/libdcd.pyx":510 * if ok != 0: * raise IOError("Writing DCD header failed: {}".format(DCD_ERRORS[ok])) * self.wrote_header = True # <<<<<<<<<<<<<< @@ -7124,7 +7210,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he */ __pyx_v_self->wrote_header = 1; - /* "MDAnalysis/lib/formats/libdcd.pyx":462 + /* "MDAnalysis/lib/formats/libdcd.pyx":464 * return self.charmm * * def write_header(self, remarks, natoms, istart, nsavc, delta, is_periodic): # <<<<<<<<<<<<<< @@ -7150,7 +7236,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_28write_he return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":510 +/* "MDAnalysis/lib/formats/libdcd.pyx":512 * self.wrote_header = True * * def write(self, xyz, box=None): # <<<<<<<<<<<<<< @@ -7195,7 +7281,7 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_31write(Py } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write") < 0)) __PYX_ERR(0, 510, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "write") < 0)) __PYX_ERR(0, 512, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -7211,7 +7297,7 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_31write(Py } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("write", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 510, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("write", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 512, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.formats.libdcd.DCDFile.write", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -7252,7 +7338,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st __Pyx_INCREF(__pyx_v_xyz); __Pyx_INCREF(__pyx_v_box); - /* "MDAnalysis/lib/formats/libdcd.pyx":522 + /* "MDAnalysis/lib/formats/libdcd.pyx":524 * * """ * if not self.is_open: # <<<<<<<<<<<<<< @@ -7262,20 +7348,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st __pyx_t_1 = ((!(__pyx_v_self->is_open != 0)) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":523 + /* "MDAnalysis/lib/formats/libdcd.pyx":525 * """ * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if self.mode != 'w': * raise IOError('File opened in mode: {}. Writing only allowed ' */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 523, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 525, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 523, __pyx_L1_error) + __PYX_ERR(0, 525, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":522 + /* "MDAnalysis/lib/formats/libdcd.pyx":524 * * """ * if not self.is_open: # <<<<<<<<<<<<<< @@ -7284,45 +7370,45 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":524 + /* "MDAnalysis/lib/formats/libdcd.pyx":526 * if not self.is_open: * raise IOError("No file open") * if self.mode != 'w': # <<<<<<<<<<<<<< * raise IOError('File opened in mode: {}. Writing only allowed ' * 'in mode "w"'.format('self.mode')) */ - __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_w, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 524, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_w, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 526, __pyx_L1_error) __pyx_t_3 = (__pyx_t_1 != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":526 + /* "MDAnalysis/lib/formats/libdcd.pyx":528 * if self.mode != 'w': * raise IOError('File opened in mode: {}. Writing only allowed ' * 'in mode "w"'.format('self.mode')) # <<<<<<<<<<<<<< * if (self.charmm & DCD_HAS_EXTRA_BLOCK): * if len(box) != 6: */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_File_opened_in_mode_Writing_only, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 526, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_File_opened_in_mode_Writing_only, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 528, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 526, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 528, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":525 + /* "MDAnalysis/lib/formats/libdcd.pyx":527 * raise IOError("No file open") * if self.mode != 'w': * raise IOError('File opened in mode: {}. Writing only allowed ' # <<<<<<<<<<<<<< * 'in mode "w"'.format('self.mode')) * if (self.charmm & DCD_HAS_EXTRA_BLOCK): */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 525, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 527, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 525, __pyx_L1_error) + __PYX_ERR(0, 527, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":524 + /* "MDAnalysis/lib/formats/libdcd.pyx":526 * if not self.is_open: * raise IOError("No file open") * if self.mode != 'w': # <<<<<<<<<<<<<< @@ -7331,46 +7417,46 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":527 + /* "MDAnalysis/lib/formats/libdcd.pyx":529 * raise IOError('File opened in mode: {}. Writing only allowed ' * 'in mode "w"'.format('self.mode')) * if (self.charmm & DCD_HAS_EXTRA_BLOCK): # <<<<<<<<<<<<<< * if len(box) != 6: * raise ValueError("box size is wrong should be 6, got: {}".format(box.size)) */ - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 527, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->charmm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 529, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 527, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_HAS_EXTRA_BLOCK); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 529, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyNumber_And(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 527, __pyx_L1_error) + __pyx_t_5 = PyNumber_And(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 529, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 527, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 529, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_3) { - /* "MDAnalysis/lib/formats/libdcd.pyx":528 + /* "MDAnalysis/lib/formats/libdcd.pyx":530 * 'in mode "w"'.format('self.mode')) * if (self.charmm & DCD_HAS_EXTRA_BLOCK): * if len(box) != 6: # <<<<<<<<<<<<<< * raise ValueError("box size is wrong should be 6, got: {}".format(box.size)) * else: */ - __pyx_t_6 = PyObject_Length(__pyx_v_box); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(0, 528, __pyx_L1_error) + __pyx_t_6 = PyObject_Length(__pyx_v_box); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(0, 530, __pyx_L1_error) __pyx_t_3 = ((__pyx_t_6 != 6) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":529 + /* "MDAnalysis/lib/formats/libdcd.pyx":531 * if (self.charmm & DCD_HAS_EXTRA_BLOCK): * if len(box) != 6: * raise ValueError("box size is wrong should be 6, got: {}".format(box.size)) # <<<<<<<<<<<<<< * else: * # use a dummy box. It won't be written anyway in readdcd. */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_box_size_is_wrong_should_be_6_go, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_box_size_is_wrong_should_be_6_go, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_box, __pyx_n_s_size); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_box, __pyx_n_s_size); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { @@ -7383,14 +7469,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } } if (!__pyx_t_7) { - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_5); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_2}; - __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -7399,33 +7485,33 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_t_2}; - __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else #endif { - __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __pyx_t_7 = NULL; __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_2); __pyx_t_2 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_8, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_8, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 531, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(0, 529, __pyx_L1_error) + __PYX_ERR(0, 531, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":528 + /* "MDAnalysis/lib/formats/libdcd.pyx":530 * 'in mode "w"'.format('self.mode')) * if (self.charmm & DCD_HAS_EXTRA_BLOCK): * if len(box) != 6: # <<<<<<<<<<<<<< @@ -7434,7 +7520,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":527 + /* "MDAnalysis/lib/formats/libdcd.pyx":529 * raise IOError('File opened in mode: {}. Writing only allowed ' * 'in mode "w"'.format('self.mode')) * if (self.charmm & DCD_HAS_EXTRA_BLOCK): # <<<<<<<<<<<<<< @@ -7444,7 +7530,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st goto __pyx_L5; } - /* "MDAnalysis/lib/formats/libdcd.pyx":532 + /* "MDAnalysis/lib/formats/libdcd.pyx":534 * else: * # use a dummy box. It won't be written anyway in readdcd. * box = np.zeros(6) # <<<<<<<<<<<<<< @@ -7452,12 +7538,12 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st * if not self.wrote_header: */ /*else*/ { - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 532, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 534, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 532, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 534, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 532, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 534, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF_SET(__pyx_v_box, __pyx_t_4); @@ -7465,7 +7551,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } __pyx_L5:; - /* "MDAnalysis/lib/formats/libdcd.pyx":534 + /* "MDAnalysis/lib/formats/libdcd.pyx":536 * box = np.zeros(6) * * if not self.wrote_header: # <<<<<<<<<<<<<< @@ -7475,20 +7561,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st __pyx_t_3 = ((!(__pyx_v_self->wrote_header != 0)) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":535 + /* "MDAnalysis/lib/formats/libdcd.pyx":537 * * if not self.wrote_header: * raise IOError("write header first before frames can be written") # <<<<<<<<<<<<<< * xyz = np.asarray(xyz, order='F', dtype=FLOAT) * if xyz.shape != (self.natoms, 3): */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 535, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 537, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(0, 535, __pyx_L1_error) + __PYX_ERR(0, 537, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":534 + /* "MDAnalysis/lib/formats/libdcd.pyx":536 * box = np.zeros(6) * * if not self.wrote_header: # <<<<<<<<<<<<<< @@ -7497,31 +7583,31 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":536 + /* "MDAnalysis/lib/formats/libdcd.pyx":538 * if not self.wrote_header: * raise IOError("write header first before frames can be written") * xyz = np.asarray(xyz, order='F', dtype=FLOAT) # <<<<<<<<<<<<<< * if xyz.shape != (self.natoms, 3): * raise ValueError("xyz shape is wrong should be (natoms, 3), got:".format(xyz.shape)) */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 536, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_asarray); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 536, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_asarray); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 536, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_xyz); __Pyx_GIVEREF(__pyx_v_xyz); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_xyz); - __pyx_t_8 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 536, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 536, __pyx_L1_error) - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 536, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 536, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, __pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 536, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, __pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; @@ -7529,18 +7615,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st __Pyx_DECREF_SET(__pyx_v_xyz, __pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":537 + /* "MDAnalysis/lib/formats/libdcd.pyx":539 * raise IOError("write header first before frames can be written") * xyz = np.asarray(xyz, order='F', dtype=FLOAT) * if xyz.shape != (self.natoms, 3): # <<<<<<<<<<<<<< * raise ValueError("xyz shape is wrong should be (natoms, 3), got:".format(xyz.shape)) * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_xyz, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 537, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_xyz, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 539, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 537, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 539, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 537, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 539, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8); @@ -7548,23 +7634,23 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st __Pyx_GIVEREF(__pyx_int_3); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_3); __pyx_t_8 = 0; - __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 537, __pyx_L1_error) + __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_NE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 539, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 537, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 539, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":538 + /* "MDAnalysis/lib/formats/libdcd.pyx":540 * xyz = np.asarray(xyz, order='F', dtype=FLOAT) * if xyz.shape != (self.natoms, 3): * raise ValueError("xyz shape is wrong should be (natoms, 3), got:".format(xyz.shape)) # <<<<<<<<<<<<<< * * cdef DOUBLE_T[::1] c_box = np.asarray(box, order='C', dtype=DOUBLE) */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_xyz_shape_is_wrong_should_be_nat, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_xyz_shape_is_wrong_should_be_nat, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_xyz, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_xyz, __pyx_n_s_shape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { @@ -7577,14 +7663,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } } if (!__pyx_t_5) { - __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_8); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_2}; - __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -7593,33 +7679,33 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_2}; - __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else #endif { - __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL; __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_2); __pyx_t_2 = 0; - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 538, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 540, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(0, 538, __pyx_L1_error) + __PYX_ERR(0, 540, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":537 + /* "MDAnalysis/lib/formats/libdcd.pyx":539 * raise IOError("write header first before frames can be written") * xyz = np.asarray(xyz, order='F', dtype=FLOAT) * if xyz.shape != (self.natoms, 3): # <<<<<<<<<<<<<< @@ -7628,87 +7714,87 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":540 + /* "MDAnalysis/lib/formats/libdcd.pyx":542 * raise ValueError("xyz shape is wrong should be (natoms, 3), got:".format(xyz.shape)) * * cdef DOUBLE_T[::1] c_box = np.asarray(box, order='C', dtype=DOUBLE) # <<<<<<<<<<<<<< * cdef FLOAT_T[::1] x = xyz[:, 0] * cdef FLOAT_T[::1] y = xyz[:, 1] */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 540, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_asarray); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 540, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_asarray); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 540, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_box); __Pyx_GIVEREF(__pyx_v_box); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_box); - __pyx_t_7 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 540, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 540, __pyx_L1_error) - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 540, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 542, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 540, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 540, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 540, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 542, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_c_box = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":541 + /* "MDAnalysis/lib/formats/libdcd.pyx":543 * * cdef DOUBLE_T[::1] c_box = np.asarray(box, order='C', dtype=DOUBLE) * cdef FLOAT_T[::1] x = xyz[:, 0] # <<<<<<<<<<<<<< * cdef FLOAT_T[::1] y = xyz[:, 1] * cdef FLOAT_T[::1] z = xyz[:, 2] */ - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_xyz, __pyx_tuple__18); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 541, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_xyz, __pyx_tuple__19); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 543, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 541, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 543, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_x = __pyx_t_10; __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":542 + /* "MDAnalysis/lib/formats/libdcd.pyx":544 * cdef DOUBLE_T[::1] c_box = np.asarray(box, order='C', dtype=DOUBLE) * cdef FLOAT_T[::1] x = xyz[:, 0] * cdef FLOAT_T[::1] y = xyz[:, 1] # <<<<<<<<<<<<<< * cdef FLOAT_T[::1] z = xyz[:, 2] * */ - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_xyz, __pyx_tuple__20); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 542, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_xyz, __pyx_tuple__21); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 544, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 542, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 544, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_y = __pyx_t_10; __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":543 + /* "MDAnalysis/lib/formats/libdcd.pyx":545 * cdef FLOAT_T[::1] x = xyz[:, 0] * cdef FLOAT_T[::1] y = xyz[:, 1] * cdef FLOAT_T[::1] z = xyz[:, 2] # <<<<<<<<<<<<<< * * step = self.istart + self.current_frame * self.nsavc */ - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_xyz, __pyx_tuple__22); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 543, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_v_xyz, __pyx_tuple__23); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 545, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 543, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 545, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_z = __pyx_t_10; __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":545 + /* "MDAnalysis/lib/formats/libdcd.pyx":547 * cdef FLOAT_T[::1] z = xyz[:, 2] * * step = self.istart + self.current_frame * self.nsavc # <<<<<<<<<<<<<< @@ -7717,7 +7803,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ __pyx_v_step = (__pyx_v_self->istart + (__pyx_v_self->current_frame * __pyx_v_self->nsavc)); - /* "MDAnalysis/lib/formats/libdcd.pyx":547 + /* "MDAnalysis/lib/formats/libdcd.pyx":549 * step = self.istart + self.current_frame * self.nsavc * ok = write_dcdstep(self.fp, self.current_frame + 1, step, * self.natoms, &x[0], # <<<<<<<<<<<<<< @@ -7732,10 +7818,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } else if (unlikely(__pyx_t_11 >= __pyx_v_x.shape[0])) __pyx_t_12 = 0; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); - __PYX_ERR(0, 547, __pyx_L1_error) + __PYX_ERR(0, 549, __pyx_L1_error) } - /* "MDAnalysis/lib/formats/libdcd.pyx":548 + /* "MDAnalysis/lib/formats/libdcd.pyx":550 * ok = write_dcdstep(self.fp, self.current_frame + 1, step, * self.natoms, &x[0], * &y[0], &z[0], # <<<<<<<<<<<<<< @@ -7750,7 +7836,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } else if (unlikely(__pyx_t_13 >= __pyx_v_y.shape[0])) __pyx_t_12 = 0; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); - __PYX_ERR(0, 548, __pyx_L1_error) + __PYX_ERR(0, 550, __pyx_L1_error) } __pyx_t_14 = 0; __pyx_t_12 = -1; @@ -7760,10 +7846,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } else if (unlikely(__pyx_t_14 >= __pyx_v_z.shape[0])) __pyx_t_12 = 0; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); - __PYX_ERR(0, 548, __pyx_L1_error) + __PYX_ERR(0, 550, __pyx_L1_error) } - /* "MDAnalysis/lib/formats/libdcd.pyx":549 + /* "MDAnalysis/lib/formats/libdcd.pyx":551 * self.natoms, &x[0], * &y[0], &z[0], * &c_box[0], self.charmm) # <<<<<<<<<<<<<< @@ -7778,10 +7864,10 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } else if (unlikely(__pyx_t_15 >= __pyx_v_c_box.shape[0])) __pyx_t_12 = 0; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); - __PYX_ERR(0, 549, __pyx_L1_error) + __PYX_ERR(0, 551, __pyx_L1_error) } - /* "MDAnalysis/lib/formats/libdcd.pyx":546 + /* "MDAnalysis/lib/formats/libdcd.pyx":548 * * step = self.istart + self.current_frame * self.nsavc * ok = write_dcdstep(self.fp, self.current_frame + 1, step, # <<<<<<<<<<<<<< @@ -7790,7 +7876,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ __pyx_v_ok = write_dcdstep(__pyx_v_self->fp, (__pyx_v_self->current_frame + 1), __pyx_v_step, __pyx_v_self->natoms, ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) __pyx_v_x.data) + __pyx_t_11)) ))))), ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) __pyx_v_y.data) + __pyx_t_13)) ))))), ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) __pyx_v_z.data) + __pyx_t_14)) ))))), ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T *) __pyx_v_c_box.data) + __pyx_t_15)) ))))), __pyx_v_self->charmm); - /* "MDAnalysis/lib/formats/libdcd.pyx":550 + /* "MDAnalysis/lib/formats/libdcd.pyx":552 * &y[0], &z[0], * &c_box[0], self.charmm) * if ok != 0: # <<<<<<<<<<<<<< @@ -7800,18 +7886,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st __pyx_t_3 = ((__pyx_v_ok != 0) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":551 + /* "MDAnalysis/lib/formats/libdcd.pyx":553 * &c_box[0], self.charmm) * if ok != 0: * raise IOError("Couldn't write DCD frame: reason {}".format(DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * * self.current_frame += 1 */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Couldn_t_write_DCD_frame_reason, __pyx_n_s_format); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Couldn_t_write_DCD_frame_reason, __pyx_n_s_format); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; @@ -7825,14 +7911,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st } } if (!__pyx_t_4) { - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_GOTREF(__pyx_t_2); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_8}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -7841,33 +7927,33 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_8}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif { - __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_8); __pyx_t_8 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 551, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 553, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_7, 0, 0, 0); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __PYX_ERR(0, 551, __pyx_L1_error) + __PYX_ERR(0, 553, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":550 + /* "MDAnalysis/lib/formats/libdcd.pyx":552 * &y[0], &z[0], * &c_box[0], self.charmm) * if ok != 0: # <<<<<<<<<<<<<< @@ -7876,7 +7962,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":553 + /* "MDAnalysis/lib/formats/libdcd.pyx":555 * raise IOError("Couldn't write DCD frame: reason {}".format(DCD_ERRORS[ok])) * * self.current_frame += 1 # <<<<<<<<<<<<<< @@ -7885,7 +7971,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st */ __pyx_v_self->current_frame = (__pyx_v_self->current_frame + 1); - /* "MDAnalysis/lib/formats/libdcd.pyx":510 + /* "MDAnalysis/lib/formats/libdcd.pyx":512 * self.wrote_header = True * * def write(self, xyz, box=None): # <<<<<<<<<<<<<< @@ -7918,7 +8004,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_30write(st return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":555 +/* "MDAnalysis/lib/formats/libdcd.pyx":557 * self.current_frame += 1 * * def read(self): # <<<<<<<<<<<<<< @@ -7961,7 +8047,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str PyObject *__pyx_t_12 = NULL; __Pyx_RefNannySetupContext("read", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":571 + /* "MDAnalysis/lib/formats/libdcd.pyx":573 * * """ * if self.reached_eof: # <<<<<<<<<<<<<< @@ -7971,20 +8057,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str __pyx_t_1 = (__pyx_v_self->reached_eof != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":572 + /* "MDAnalysis/lib/formats/libdcd.pyx":574 * """ * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') # <<<<<<<<<<<<<< * if not self.is_open: * raise IOError("No file open") */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_EOFError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 572, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_EOFError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 574, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 572, __pyx_L1_error) + __PYX_ERR(0, 574, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":571 + /* "MDAnalysis/lib/formats/libdcd.pyx":573 * * """ * if self.reached_eof: # <<<<<<<<<<<<<< @@ -7993,7 +8079,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":573 + /* "MDAnalysis/lib/formats/libdcd.pyx":575 * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: # <<<<<<<<<<<<<< @@ -8003,20 +8089,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str __pyx_t_1 = ((!(__pyx_v_self->is_open != 0)) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":574 + /* "MDAnalysis/lib/formats/libdcd.pyx":576 * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 574, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 576, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 574, __pyx_L1_error) + __PYX_ERR(0, 576, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":573 + /* "MDAnalysis/lib/formats/libdcd.pyx":575 * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: # <<<<<<<<<<<<<< @@ -8025,45 +8111,45 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":575 + /* "MDAnalysis/lib/formats/libdcd.pyx":577 * if not self.is_open: * raise IOError("No file open") * if self.mode != 'r': # <<<<<<<<<<<<<< * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) */ - __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_r, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 575, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_r, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 577, __pyx_L1_error) __pyx_t_3 = (__pyx_t_1 != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":577 + /* "MDAnalysis/lib/formats/libdcd.pyx":579 * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) # <<<<<<<<<<<<<< * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_File_opened_in_mode_Reading_only, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 577, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_File_opened_in_mode_Reading_only, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 579, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 577, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 579, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":576 + /* "MDAnalysis/lib/formats/libdcd.pyx":578 * raise IOError("No file open") * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' # <<<<<<<<<<<<<< * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 576, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 578, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 576, __pyx_L1_error) + __PYX_ERR(0, 578, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":575 + /* "MDAnalysis/lib/formats/libdcd.pyx":577 * if not self.is_open: * raise IOError("No file open") * if self.mode != 'r': # <<<<<<<<<<<<<< @@ -8072,7 +8158,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":578 + /* "MDAnalysis/lib/formats/libdcd.pyx":580 * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: # <<<<<<<<<<<<<< @@ -8082,20 +8168,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str __pyx_t_3 = ((__pyx_v_self->n_frames == 0) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":579 + /* "MDAnalysis/lib/formats/libdcd.pyx":581 * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") # <<<<<<<<<<<<<< * * cdef np.ndarray xyz = np.empty((self.natoms, self.ndims), dtype=FLOAT, order='F') */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 579, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 579, __pyx_L1_error) + __PYX_ERR(0, 581, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":578 + /* "MDAnalysis/lib/formats/libdcd.pyx":580 * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: # <<<<<<<<<<<<<< @@ -8104,23 +8190,23 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":581 + /* "MDAnalysis/lib/formats/libdcd.pyx":583 * raise IOError("opened empty file. No frames are saved") * * cdef np.ndarray xyz = np.empty((self.natoms, self.ndims), dtype=FLOAT, order='F') # <<<<<<<<<<<<<< * cdef np.ndarray unitcell = np.empty(6, dtype=DOUBLE) * unitcell[0] = unitcell[2] = unitcell[5] = 0.0; */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2); @@ -8128,108 +8214,108 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5); __pyx_t_2 = 0; __pyx_t_5 = 0; - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 581, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 581, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 581, __pyx_L1_error) - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 581, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 583, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 583, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 581, __pyx_L1_error) + if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 583, __pyx_L1_error) __pyx_v_xyz = ((PyArrayObject *)__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":582 + /* "MDAnalysis/lib/formats/libdcd.pyx":584 * * cdef np.ndarray xyz = np.empty((self.natoms, self.ndims), dtype=FLOAT, order='F') * cdef np.ndarray unitcell = np.empty(6, dtype=DOUBLE) # <<<<<<<<<<<<<< * unitcell[0] = unitcell[2] = unitcell[5] = 0.0; * unitcell[4] = unitcell[3] = unitcell[1] = 90.0; */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 582, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 584, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 582, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 584, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 582, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 584, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 582, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DOUBLE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 584, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 582, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 584, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__27, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 582, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__28, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 584, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 582, __pyx_L1_error) + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 584, __pyx_L1_error) __pyx_v_unitcell = ((PyArrayObject *)__pyx_t_5); __pyx_t_5 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":583 + /* "MDAnalysis/lib/formats/libdcd.pyx":585 * cdef np.ndarray xyz = np.empty((self.natoms, self.ndims), dtype=FLOAT, order='F') * cdef np.ndarray unitcell = np.empty(6, dtype=DOUBLE) * unitcell[0] = unitcell[2] = unitcell[5] = 0.0; # <<<<<<<<<<<<<< * unitcell[4] = unitcell[3] = unitcell[1] = 90.0; * */ - if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 0, __pyx_float_0_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 583, __pyx_L1_error) - if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 2, __pyx_float_0_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 583, __pyx_L1_error) - if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 5, __pyx_float_0_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 583, __pyx_L1_error) + if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 0, __pyx_float_0_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 585, __pyx_L1_error) + if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 2, __pyx_float_0_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 585, __pyx_L1_error) + if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 5, __pyx_float_0_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 585, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":584 + /* "MDAnalysis/lib/formats/libdcd.pyx":586 * cdef np.ndarray unitcell = np.empty(6, dtype=DOUBLE) * unitcell[0] = unitcell[2] = unitcell[5] = 0.0; * unitcell[4] = unitcell[3] = unitcell[1] = 90.0; # <<<<<<<<<<<<<< * * first_frame = self.current_frame == 0 */ - if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 4, __pyx_float_90_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 584, __pyx_L1_error) - if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 3, __pyx_float_90_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 584, __pyx_L1_error) - if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 1, __pyx_float_90_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 584, __pyx_L1_error) + if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 4, __pyx_float_90_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 586, __pyx_L1_error) + if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 3, __pyx_float_90_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 586, __pyx_L1_error) + if (unlikely(__Pyx_SetItemInt(((PyObject *)__pyx_v_unitcell), 1, __pyx_float_90_0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 586, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":586 + /* "MDAnalysis/lib/formats/libdcd.pyx":588 * unitcell[4] = unitcell[3] = unitcell[1] = 90.0; * * first_frame = self.current_frame == 0 # <<<<<<<<<<<<<< * ok = self.c_readframes_helper(xyz[:, 0], xyz[:, 1], xyz[:, 2], unitcell, first_frame) * if ok != 0 and ok != -4: */ - __pyx_t_5 = __Pyx_PyBool_FromLong((__pyx_v_self->current_frame == 0)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 586, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyBool_FromLong((__pyx_v_self->current_frame == 0)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 588, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_v_first_frame = __pyx_t_5; __pyx_t_5 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":587 + /* "MDAnalysis/lib/formats/libdcd.pyx":589 * * first_frame = self.current_frame == 0 * ok = self.c_readframes_helper(xyz[:, 0], xyz[:, 1], xyz[:, 2], unitcell, first_frame) # <<<<<<<<<<<<<< * if ok != 0 and ok != -4: * raise IOError("Reading DCD header failed: {}".format(DCD_ERRORS[ok])) */ - __pyx_t_5 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz), __pyx_tuple__29); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 587, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz), __pyx_tuple__30); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 589, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 587, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 589, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz), __pyx_tuple__31); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 587, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz), __pyx_tuple__32); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 589, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 587, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 589, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz), __pyx_tuple__33); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 587, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz), __pyx_tuple__34); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 589, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 587, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 589, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(((PyObject *)__pyx_v_unitcell), PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 587, __pyx_L1_error) - __pyx_t_11 = __Pyx_PyInt_As_int(__pyx_v_first_frame); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 587, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(((PyObject *)__pyx_v_unitcell), PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyInt_As_int(__pyx_v_first_frame); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 589, __pyx_L1_error) __pyx_v_ok = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_7formats_6libdcd_DCDFile *)__pyx_v_self->__pyx_vtab)->c_readframes_helper(__pyx_v_self, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10, __pyx_t_11); __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); __pyx_t_7.memview = NULL; @@ -8244,7 +8330,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":588 + /* "MDAnalysis/lib/formats/libdcd.pyx":590 * first_frame = self.current_frame == 0 * ok = self.c_readframes_helper(xyz[:, 0], xyz[:, 1], xyz[:, 2], unitcell, first_frame) * if ok != 0 and ok != -4: # <<<<<<<<<<<<<< @@ -8262,18 +8348,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str } if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":589 + /* "MDAnalysis/lib/formats/libdcd.pyx":591 * ok = self.c_readframes_helper(xyz[:, 0], xyz[:, 1], xyz[:, 2], unitcell, first_frame) * if ok != 0 and ok != -4: * raise IOError("Reading DCD header failed: {}".format(DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * * # we couldn't read any more frames. */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_header_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_header_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = NULL; @@ -8287,14 +8373,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str } } if (!__pyx_t_6) { - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_5); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_4}; - __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; @@ -8303,33 +8389,33 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_4}; - __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } else #endif { - __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_6); __pyx_t_6 = NULL; __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 589, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 591, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 589, __pyx_L1_error) + __PYX_ERR(0, 591, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":588 + /* "MDAnalysis/lib/formats/libdcd.pyx":590 * first_frame = self.current_frame == 0 * ok = self.c_readframes_helper(xyz[:, 0], xyz[:, 1], xyz[:, 2], unitcell, first_frame) * if ok != 0 and ok != -4: # <<<<<<<<<<<<<< @@ -8338,7 +8424,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":592 + /* "MDAnalysis/lib/formats/libdcd.pyx":594 * * # we couldn't read any more frames. * if ok == -4: # <<<<<<<<<<<<<< @@ -8348,7 +8434,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str __pyx_t_3 = ((__pyx_v_ok == -4L) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":593 + /* "MDAnalysis/lib/formats/libdcd.pyx":595 * # we couldn't read any more frames. * if ok == -4: * self.reached_eof = True # <<<<<<<<<<<<<< @@ -8357,7 +8443,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ __pyx_v_self->reached_eof = 1; - /* "MDAnalysis/lib/formats/libdcd.pyx":594 + /* "MDAnalysis/lib/formats/libdcd.pyx":596 * if ok == -4: * self.reached_eof = True * raise StopIteration # <<<<<<<<<<<<<< @@ -8365,9 +8451,9 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str * self.current_frame += 1 */ __Pyx_Raise(__pyx_builtin_StopIteration, 0, 0, 0); - __PYX_ERR(0, 594, __pyx_L1_error) + __PYX_ERR(0, 596, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":592 + /* "MDAnalysis/lib/formats/libdcd.pyx":594 * * # we couldn't read any more frames. * if ok == -4: # <<<<<<<<<<<<<< @@ -8376,7 +8462,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":596 + /* "MDAnalysis/lib/formats/libdcd.pyx":598 * raise StopIteration * * self.current_frame += 1 # <<<<<<<<<<<<<< @@ -8385,7 +8471,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str */ __pyx_v_self->current_frame = (__pyx_v_self->current_frame + 1); - /* "MDAnalysis/lib/formats/libdcd.pyx":597 + /* "MDAnalysis/lib/formats/libdcd.pyx":599 * * self.current_frame += 1 * return DCDFrame(xyz, unitcell) # <<<<<<<<<<<<<< @@ -8393,7 +8479,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCDFrame); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 597, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCDFrame); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 599, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_12 = NULL; __pyx_t_11 = 0; @@ -8410,7 +8496,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[3] = {__pyx_t_12, ((PyObject *)__pyx_v_xyz), ((PyObject *)__pyx_v_unitcell)}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 597, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 599, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_GOTREF(__pyx_t_2); } else @@ -8418,13 +8504,13 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[3] = {__pyx_t_12, ((PyObject *)__pyx_v_xyz), ((PyObject *)__pyx_v_unitcell)}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 597, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 599, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif { - __pyx_t_4 = PyTuple_New(2+__pyx_t_11); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 597, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(2+__pyx_t_11); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 599, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (__pyx_t_12) { __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_12); __pyx_t_12 = NULL; @@ -8435,7 +8521,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str __Pyx_INCREF(((PyObject *)__pyx_v_unitcell)); __Pyx_GIVEREF(((PyObject *)__pyx_v_unitcell)); PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_11, ((PyObject *)__pyx_v_unitcell)); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 597, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 599, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } @@ -8444,7 +8530,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str __pyx_t_2 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/formats/libdcd.pyx":555 + /* "MDAnalysis/lib/formats/libdcd.pyx":557 * self.current_frame += 1 * * def read(self): # <<<<<<<<<<<<<< @@ -8474,7 +8560,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_32read(str return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":600 +/* "MDAnalysis/lib/formats/libdcd.pyx":602 * * * def readframes(self, start=None, stop=None, step=None, order='fac', indices=None): # <<<<<<<<<<<<<< @@ -8552,7 +8638,7 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_35readfram } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "readframes") < 0)) __PYX_ERR(0, 600, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "readframes") < 0)) __PYX_ERR(0, 602, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -8578,7 +8664,7 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_35readfram } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("readframes", 0, 0, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 600, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("readframes", 0, 0, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 602, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.formats.libdcd.DCDFile.readframes", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -8652,7 +8738,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_pybuffernd_box.data = NULL; __pyx_pybuffernd_box.rcbuffer = &__pyx_pybuffer_box; - /* "MDAnalysis/lib/formats/libdcd.pyx":631 + /* "MDAnalysis/lib/formats/libdcd.pyx":633 * * """ * if self.reached_eof: # <<<<<<<<<<<<<< @@ -8662,20 +8748,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_1 = (__pyx_v_self->reached_eof != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":632 + /* "MDAnalysis/lib/formats/libdcd.pyx":634 * """ * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') # <<<<<<<<<<<<<< * if not self.is_open: * raise IOError("No file open") */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_EOFError, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 632, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_EOFError, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 634, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 632, __pyx_L1_error) + __PYX_ERR(0, 634, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":631 + /* "MDAnalysis/lib/formats/libdcd.pyx":633 * * """ * if self.reached_eof: # <<<<<<<<<<<<<< @@ -8684,7 +8770,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":633 + /* "MDAnalysis/lib/formats/libdcd.pyx":635 * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: # <<<<<<<<<<<<<< @@ -8694,20 +8780,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_1 = ((!(__pyx_v_self->is_open != 0)) != 0); if (unlikely(__pyx_t_1)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":634 + /* "MDAnalysis/lib/formats/libdcd.pyx":636 * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 634, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 636, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 634, __pyx_L1_error) + __PYX_ERR(0, 636, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":633 + /* "MDAnalysis/lib/formats/libdcd.pyx":635 * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: # <<<<<<<<<<<<<< @@ -8716,45 +8802,45 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":635 + /* "MDAnalysis/lib/formats/libdcd.pyx":637 * if not self.is_open: * raise IOError("No file open") * if self.mode != 'r': # <<<<<<<<<<<<<< * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) */ - __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_r, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 635, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->mode, __pyx_n_s_r, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 637, __pyx_L1_error) __pyx_t_3 = (__pyx_t_1 != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":637 + /* "MDAnalysis/lib/formats/libdcd.pyx":639 * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) # <<<<<<<<<<<<<< * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_File_opened_in_mode_Reading_only, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 637, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_File_opened_in_mode_Reading_only, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 639, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 637, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 639, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":636 + /* "MDAnalysis/lib/formats/libdcd.pyx":638 * raise IOError("No file open") * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' # <<<<<<<<<<<<<< * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 636, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 638, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 636, __pyx_L1_error) + __PYX_ERR(0, 638, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":635 + /* "MDAnalysis/lib/formats/libdcd.pyx":637 * if not self.is_open: * raise IOError("No file open") * if self.mode != 'r': # <<<<<<<<<<<<<< @@ -8763,7 +8849,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":638 + /* "MDAnalysis/lib/formats/libdcd.pyx":640 * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: # <<<<<<<<<<<<<< @@ -8773,20 +8859,20 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_3 = ((__pyx_v_self->n_frames == 0) != 0); if (unlikely(__pyx_t_3)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":639 + /* "MDAnalysis/lib/formats/libdcd.pyx":641 * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") # <<<<<<<<<<<<<< * * self.seek(0) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 639, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IOError, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 641, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 639, __pyx_L1_error) + __PYX_ERR(0, 641, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":638 + /* "MDAnalysis/lib/formats/libdcd.pyx":640 * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: # <<<<<<<<<<<<<< @@ -8795,21 +8881,21 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":641 + /* "MDAnalysis/lib/formats/libdcd.pyx":643 * raise IOError("opened empty file. No frames are saved") * * self.seek(0) # <<<<<<<<<<<<<< * # if we only want to iterate backwards flip start and end * if start is None and stop is None and step is not None and step < 0: */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_seek); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 641, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_seek); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 643, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 641, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 643, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":643 + /* "MDAnalysis/lib/formats/libdcd.pyx":645 * self.seek(0) * # if we only want to iterate backwards flip start and end * if start is None and stop is None and step is not None and step < 0: # <<<<<<<<<<<<<< @@ -8837,14 +8923,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_3 = __pyx_t_5; goto __pyx_L8_bool_binop_done; } - __pyx_t_4 = PyObject_RichCompare(__pyx_v_step, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 643, __pyx_L1_error) - __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 643, __pyx_L1_error) + __pyx_t_4 = PyObject_RichCompare(__pyx_v_step, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 645, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 645, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_3 = __pyx_t_5; __pyx_L8_bool_binop_done:; if (__pyx_t_3) { - /* "MDAnalysis/lib/formats/libdcd.pyx":644 + /* "MDAnalysis/lib/formats/libdcd.pyx":646 * # if we only want to iterate backwards flip start and end * if start is None and stop is None and step is not None and step < 0: * stop = -1 # <<<<<<<<<<<<<< @@ -8854,19 +8940,19 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_INCREF(__pyx_int_neg_1); __Pyx_DECREF_SET(__pyx_v_stop, __pyx_int_neg_1); - /* "MDAnalysis/lib/formats/libdcd.pyx":645 + /* "MDAnalysis/lib/formats/libdcd.pyx":647 * if start is None and stop is None and step is not None and step < 0: * stop = -1 * start = self.n_frames - 1 # <<<<<<<<<<<<<< * stop = stop if not stop is None else self.n_frames * start = start if not start is None else 0 */ - __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_self->n_frames - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 645, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_self->n_frames - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 647, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_start, __pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":643 + /* "MDAnalysis/lib/formats/libdcd.pyx":645 * self.seek(0) * # if we only want to iterate backwards flip start and end * if start is None and stop is None and step is not None and step < 0: # <<<<<<<<<<<<<< @@ -8875,7 +8961,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":646 + /* "MDAnalysis/lib/formats/libdcd.pyx":648 * stop = -1 * start = self.n_frames - 1 * stop = stop if not stop is None else self.n_frames # <<<<<<<<<<<<<< @@ -8887,7 +8973,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_INCREF(__pyx_v_stop); __pyx_t_4 = __pyx_v_stop; } else { - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->n_frames); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 646, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->n_frames); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 648, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __pyx_t_2; __pyx_t_2 = 0; @@ -8895,7 +8981,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_DECREF_SET(__pyx_v_stop, __pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":647 + /* "MDAnalysis/lib/formats/libdcd.pyx":649 * start = self.n_frames - 1 * stop = stop if not stop is None else self.n_frames * start = start if not start is None else 0 # <<<<<<<<<<<<<< @@ -8913,7 +8999,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_DECREF_SET(__pyx_v_start, __pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":648 + /* "MDAnalysis/lib/formats/libdcd.pyx":650 * stop = stop if not stop is None else self.n_frames * start = start if not start is None else 0 * step = step if not step is None else 1 # <<<<<<<<<<<<<< @@ -8931,14 +9017,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_DECREF_SET(__pyx_v_step, __pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":652 + /* "MDAnalysis/lib/formats/libdcd.pyx":654 * * cdef int n * n = len(range(start, stop, step)) # <<<<<<<<<<<<<< * * cdef np.ndarray[np.int64_t, ndim=1] c_indices */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_range); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 652, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_range); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 654, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = NULL; __pyx_t_7 = 0; @@ -8955,7 +9041,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_start, __pyx_v_stop, __pyx_v_step}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 652, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 654, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_4); } else @@ -8963,13 +9049,13 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_start, __pyx_v_stop, __pyx_v_step}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 652, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 654, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GOTREF(__pyx_t_4); } else #endif { - __pyx_t_8 = PyTuple_New(3+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 652, __pyx_L1_error) + __pyx_t_8 = PyTuple_New(3+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 654, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); if (__pyx_t_6) { __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __pyx_t_6 = NULL; @@ -8983,88 +9069,61 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_INCREF(__pyx_v_step); __Pyx_GIVEREF(__pyx_v_step); PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_7, __pyx_v_step); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 652, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 654, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_9 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 652, __pyx_L1_error) + __pyx_t_9 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 654, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_n = __pyx_t_9; - /* "MDAnalysis/lib/formats/libdcd.pyx":655 + /* "MDAnalysis/lib/formats/libdcd.pyx":657 * * cdef np.ndarray[np.int64_t, ndim=1] c_indices * if indices is None: # <<<<<<<<<<<<<< - * c_indices = np.arange(self.natoms) + * c_indices = np.arange(self.natoms, dtype=np.int64) * natoms = self.natoms */ __pyx_t_3 = (__pyx_v_indices == Py_None); __pyx_t_5 = (__pyx_t_3 != 0); if (__pyx_t_5) { - /* "MDAnalysis/lib/formats/libdcd.pyx":656 + /* "MDAnalysis/lib/formats/libdcd.pyx":658 * cdef np.ndarray[np.int64_t, ndim=1] c_indices * if indices is None: - * c_indices = np.arange(self.natoms) # <<<<<<<<<<<<<< + * c_indices = np.arange(self.natoms, dtype=np.int64) # <<<<<<<<<<<<<< * natoms = self.natoms * else: */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 656, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_arange); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 658, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_arange); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 656, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 658, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_int64); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 658, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 658, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 656, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_8))) { - __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8); - if (likely(__pyx_t_6)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_8, function); - } - } - if (!__pyx_t_6) { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 656, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_4); - } else { - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_8)) { - PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_2}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 656, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) { - PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_2}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 656, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else - #endif - { - __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 656, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6); __pyx_t_6 = NULL; - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_2); - __pyx_t_2 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_10, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 656, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - } - } __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 656, __pyx_L1_error) - __pyx_t_11 = ((PyArrayObject *)__pyx_t_4); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 658, __pyx_L1_error) + __pyx_t_11 = ((PyArrayObject *)__pyx_t_10); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_c_indices.rcbuffer->pybuffer); @@ -9080,15 +9139,15 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_12 = __pyx_t_13 = __pyx_t_14 = 0; } __pyx_pybuffernd_c_indices.diminfo[0].strides = __pyx_pybuffernd_c_indices.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_c_indices.diminfo[0].shape = __pyx_pybuffernd_c_indices.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 656, __pyx_L1_error) + if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 658, __pyx_L1_error) } __pyx_t_11 = 0; - __pyx_v_c_indices = ((PyArrayObject *)__pyx_t_4); - __pyx_t_4 = 0; + __pyx_v_c_indices = ((PyArrayObject *)__pyx_t_10); + __pyx_t_10 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":657 + /* "MDAnalysis/lib/formats/libdcd.pyx":659 * if indices is None: - * c_indices = np.arange(self.natoms) + * c_indices = np.arange(self.natoms, dtype=np.int64) * natoms = self.natoms # <<<<<<<<<<<<<< * else: * natoms = len(indices) @@ -9096,17 +9155,17 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_7 = __pyx_v_self->natoms; __pyx_v_natoms = __pyx_t_7; - /* "MDAnalysis/lib/formats/libdcd.pyx":655 + /* "MDAnalysis/lib/formats/libdcd.pyx":657 * * cdef np.ndarray[np.int64_t, ndim=1] c_indices * if indices is None: # <<<<<<<<<<<<<< - * c_indices = np.arange(self.natoms) + * c_indices = np.arange(self.natoms, dtype=np.int64) * natoms = self.natoms */ goto __pyx_L12; } - /* "MDAnalysis/lib/formats/libdcd.pyx":659 + /* "MDAnalysis/lib/formats/libdcd.pyx":661 * natoms = self.natoms * else: * natoms = len(indices) # <<<<<<<<<<<<<< @@ -9114,41 +9173,41 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram * */ /*else*/ { - __pyx_t_9 = PyObject_Length(__pyx_v_indices); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 659, __pyx_L1_error) + __pyx_t_9 = PyObject_Length(__pyx_v_indices); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 661, __pyx_L1_error) __pyx_v_natoms = __pyx_t_9; - /* "MDAnalysis/lib/formats/libdcd.pyx":660 + /* "MDAnalysis/lib/formats/libdcd.pyx":662 * else: * natoms = len(indices) * c_indices = np.asarray(indices, dtype=np.int64) # <<<<<<<<<<<<<< * * cdef int hash_order = -1 */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 660, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_asarray); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 660, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 660, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 662, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 662, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 662, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); __Pyx_INCREF(__pyx_v_indices); __Pyx_GIVEREF(__pyx_v_indices); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_indices); - __pyx_t_10 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 660, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 660, __pyx_L1_error) + PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_indices); + __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 662, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 662, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 660, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 662, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PyDict_SetItem(__pyx_t_10, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 660, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 662, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_4, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 660, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_10, __pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 662, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 660, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 662, __pyx_L1_error) __pyx_t_11 = ((PyArrayObject *)__pyx_t_6); { __Pyx_BufFmt_StackElem __pyx_stack[1]; @@ -9165,7 +9224,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_14 = __pyx_t_13 = __pyx_t_12 = 0; } __pyx_pybuffernd_c_indices.diminfo[0].strides = __pyx_pybuffernd_c_indices.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_c_indices.diminfo[0].shape = __pyx_pybuffernd_c_indices.rcbuffer->pybuffer.shape[0]; - if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 660, __pyx_L1_error) + if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 662, __pyx_L1_error) } __pyx_t_11 = 0; __pyx_v_c_indices = ((PyArrayObject *)__pyx_t_6); @@ -9173,7 +9232,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram } __pyx_L12:; - /* "MDAnalysis/lib/formats/libdcd.pyx":662 + /* "MDAnalysis/lib/formats/libdcd.pyx":664 * c_indices = np.asarray(indices, dtype=np.int64) * * cdef int hash_order = -1 # <<<<<<<<<<<<<< @@ -9182,44 +9241,44 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ __pyx_v_hash_order = -1; - /* "MDAnalysis/lib/formats/libdcd.pyx":663 + /* "MDAnalysis/lib/formats/libdcd.pyx":665 * * cdef int hash_order = -1 * if order == 'fac': # <<<<<<<<<<<<<< * shape = (n, natoms, self.ndims) * hash_order = 1 */ - __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_fac, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 663, __pyx_L1_error) + __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_fac, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 665, __pyx_L1_error) if (__pyx_t_5) { - /* "MDAnalysis/lib/formats/libdcd.pyx":664 + /* "MDAnalysis/lib/formats/libdcd.pyx":666 * cdef int hash_order = -1 * if order == 'fac': * shape = (n, natoms, self.ndims) # <<<<<<<<<<<<<< * hash_order = 1 * elif order == 'fca': */ - __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 664, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 666, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 664, __pyx_L1_error) + __pyx_t_8 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 666, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 666, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 664, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 666, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 664, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_10); __pyx_t_6 = 0; + __pyx_t_8 = 0; __pyx_t_10 = 0; + __pyx_v_shape = __pyx_t_4; __pyx_t_4 = 0; - __pyx_v_shape = __pyx_t_8; - __pyx_t_8 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":665 + /* "MDAnalysis/lib/formats/libdcd.pyx":667 * if order == 'fac': * shape = (n, natoms, self.ndims) * hash_order = 1 # <<<<<<<<<<<<<< @@ -9228,7 +9287,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ __pyx_v_hash_order = 1; - /* "MDAnalysis/lib/formats/libdcd.pyx":663 + /* "MDAnalysis/lib/formats/libdcd.pyx":665 * * cdef int hash_order = -1 * if order == 'fac': # <<<<<<<<<<<<<< @@ -9238,44 +9297,44 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram goto __pyx_L13; } - /* "MDAnalysis/lib/formats/libdcd.pyx":666 + /* "MDAnalysis/lib/formats/libdcd.pyx":668 * shape = (n, natoms, self.ndims) * hash_order = 1 * elif order == 'fca': # <<<<<<<<<<<<<< * shape = (n, self.ndims, natoms) * hash_order = 2 */ - __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_fca, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 666, __pyx_L1_error) + __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_fca, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 668, __pyx_L1_error) if (__pyx_t_5) { - /* "MDAnalysis/lib/formats/libdcd.pyx":667 + /* "MDAnalysis/lib/formats/libdcd.pyx":669 * hash_order = 1 * elif order == 'fca': * shape = (n, self.ndims, natoms) # <<<<<<<<<<<<<< * hash_order = 2 * elif order == 'afc': */ - __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 667, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 667, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 669, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 667, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 669, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 667, __pyx_L1_error) + __pyx_t_8 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 669, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 669, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_10); - __pyx_t_8 = 0; + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_10); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8); __pyx_t_4 = 0; __pyx_t_10 = 0; + __pyx_t_8 = 0; __pyx_v_shape = __pyx_t_6; __pyx_t_6 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":668 + /* "MDAnalysis/lib/formats/libdcd.pyx":670 * elif order == 'fca': * shape = (n, self.ndims, natoms) * hash_order = 2 # <<<<<<<<<<<<<< @@ -9284,7 +9343,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ __pyx_v_hash_order = 2; - /* "MDAnalysis/lib/formats/libdcd.pyx":666 + /* "MDAnalysis/lib/formats/libdcd.pyx":668 * shape = (n, natoms, self.ndims) * hash_order = 1 * elif order == 'fca': # <<<<<<<<<<<<<< @@ -9294,44 +9353,44 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram goto __pyx_L13; } - /* "MDAnalysis/lib/formats/libdcd.pyx":669 + /* "MDAnalysis/lib/formats/libdcd.pyx":671 * shape = (n, self.ndims, natoms) * hash_order = 2 * elif order == 'afc': # <<<<<<<<<<<<<< * shape = (natoms, n, self.ndims) * hash_order = 3 */ - __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_afc, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 669, __pyx_L1_error) + __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_afc, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 671, __pyx_L1_error) if (__pyx_t_5) { - /* "MDAnalysis/lib/formats/libdcd.pyx":670 + /* "MDAnalysis/lib/formats/libdcd.pyx":672 * hash_order = 2 * elif order == 'afc': * shape = (natoms, n, self.ndims) # <<<<<<<<<<<<<< * hash_order = 3 * elif order == 'acf': */ - __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 670, __pyx_L1_error) + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 672, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 670, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 672, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 672, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 670, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 672, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 670, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_10); __pyx_t_6 = 0; + __pyx_t_8 = 0; __pyx_t_10 = 0; + __pyx_v_shape = __pyx_t_4; __pyx_t_4 = 0; - __pyx_v_shape = __pyx_t_8; - __pyx_t_8 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":671 + /* "MDAnalysis/lib/formats/libdcd.pyx":673 * elif order == 'afc': * shape = (natoms, n, self.ndims) * hash_order = 3 # <<<<<<<<<<<<<< @@ -9340,7 +9399,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ __pyx_v_hash_order = 3; - /* "MDAnalysis/lib/formats/libdcd.pyx":669 + /* "MDAnalysis/lib/formats/libdcd.pyx":671 * shape = (n, self.ndims, natoms) * hash_order = 2 * elif order == 'afc': # <<<<<<<<<<<<<< @@ -9350,44 +9409,44 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram goto __pyx_L13; } - /* "MDAnalysis/lib/formats/libdcd.pyx":672 + /* "MDAnalysis/lib/formats/libdcd.pyx":674 * shape = (natoms, n, self.ndims) * hash_order = 3 * elif order == 'acf': # <<<<<<<<<<<<<< * shape = (natoms, self.ndims, n) * hash_order = 4 */ - __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_acf, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 672, __pyx_L1_error) + __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_acf, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 674, __pyx_L1_error) if (__pyx_t_5) { - /* "MDAnalysis/lib/formats/libdcd.pyx":673 + /* "MDAnalysis/lib/formats/libdcd.pyx":675 * hash_order = 3 * elif order == 'acf': * shape = (natoms, self.ndims, n) # <<<<<<<<<<<<<< * hash_order = 4 * elif order == 'caf': */ - __pyx_t_8 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 673, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 673, __pyx_L1_error) + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 675, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 673, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 675, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 673, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 675, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 675, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_10); - __pyx_t_8 = 0; + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_10); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8); __pyx_t_4 = 0; __pyx_t_10 = 0; + __pyx_t_8 = 0; __pyx_v_shape = __pyx_t_6; __pyx_t_6 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":674 + /* "MDAnalysis/lib/formats/libdcd.pyx":676 * elif order == 'acf': * shape = (natoms, self.ndims, n) * hash_order = 4 # <<<<<<<<<<<<<< @@ -9396,7 +9455,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ __pyx_v_hash_order = 4; - /* "MDAnalysis/lib/formats/libdcd.pyx":672 + /* "MDAnalysis/lib/formats/libdcd.pyx":674 * shape = (natoms, n, self.ndims) * hash_order = 3 * elif order == 'acf': # <<<<<<<<<<<<<< @@ -9406,44 +9465,44 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram goto __pyx_L13; } - /* "MDAnalysis/lib/formats/libdcd.pyx":675 + /* "MDAnalysis/lib/formats/libdcd.pyx":677 * shape = (natoms, self.ndims, n) * hash_order = 4 * elif order == 'caf': # <<<<<<<<<<<<<< * shape = (self.ndims, natoms, n) * hash_order = 5 */ - __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_caf, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 675, __pyx_L1_error) + __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_caf, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 677, __pyx_L1_error) if (__pyx_t_5) { - /* "MDAnalysis/lib/formats/libdcd.pyx":676 + /* "MDAnalysis/lib/formats/libdcd.pyx":678 * hash_order = 4 * elif order == 'caf': * shape = (self.ndims, natoms, n) # <<<<<<<<<<<<<< * hash_order = 5 * elif order == 'cfa': */ - __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 676, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 678, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 676, __pyx_L1_error) + __pyx_t_8 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 678, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 678, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 676, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 678, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 676, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_10); __pyx_t_6 = 0; + __pyx_t_8 = 0; __pyx_t_10 = 0; + __pyx_v_shape = __pyx_t_4; __pyx_t_4 = 0; - __pyx_v_shape = __pyx_t_8; - __pyx_t_8 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":677 + /* "MDAnalysis/lib/formats/libdcd.pyx":679 * elif order == 'caf': * shape = (self.ndims, natoms, n) * hash_order = 5 # <<<<<<<<<<<<<< @@ -9452,7 +9511,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ __pyx_v_hash_order = 5; - /* "MDAnalysis/lib/formats/libdcd.pyx":675 + /* "MDAnalysis/lib/formats/libdcd.pyx":677 * shape = (natoms, self.ndims, n) * hash_order = 4 * elif order == 'caf': # <<<<<<<<<<<<<< @@ -9462,17 +9521,17 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram goto __pyx_L13; } - /* "MDAnalysis/lib/formats/libdcd.pyx":678 + /* "MDAnalysis/lib/formats/libdcd.pyx":680 * shape = (self.ndims, natoms, n) * hash_order = 5 * elif order == 'cfa': # <<<<<<<<<<<<<< * hash_order = 6 * shape = (self.ndims, n, natoms) */ - __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_cfa, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 678, __pyx_L1_error) + __pyx_t_5 = (__Pyx_PyString_Equals(__pyx_v_order, __pyx_n_s_cfa, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 680, __pyx_L1_error) if (likely(__pyx_t_5)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":679 + /* "MDAnalysis/lib/formats/libdcd.pyx":681 * hash_order = 5 * elif order == 'cfa': * hash_order = 6 # <<<<<<<<<<<<<< @@ -9481,34 +9540,34 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ __pyx_v_hash_order = 6; - /* "MDAnalysis/lib/formats/libdcd.pyx":680 + /* "MDAnalysis/lib/formats/libdcd.pyx":682 * elif order == 'cfa': * hash_order = 6 * shape = (self.ndims, n, natoms) # <<<<<<<<<<<<<< * else: * raise ValueError("unkown order '{}'".format(order)) */ - __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 680, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 680, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 682, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 680, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 682, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 680, __pyx_L1_error) + __pyx_t_8 = PyInt_FromSsize_t(__pyx_v_natoms); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 682, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 682, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_10); - __pyx_t_8 = 0; + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_10); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8); __pyx_t_4 = 0; __pyx_t_10 = 0; + __pyx_t_8 = 0; __pyx_v_shape = __pyx_t_6; __pyx_t_6 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":678 + /* "MDAnalysis/lib/formats/libdcd.pyx":680 * shape = (self.ndims, natoms, n) * hash_order = 5 * elif order == 'cfa': # <<<<<<<<<<<<<< @@ -9518,7 +9577,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram goto __pyx_L13; } - /* "MDAnalysis/lib/formats/libdcd.pyx":682 + /* "MDAnalysis/lib/formats/libdcd.pyx":684 * shape = (self.ndims, n, natoms) * else: * raise ValueError("unkown order '{}'".format(order)) # <<<<<<<<<<<<<< @@ -9526,387 +9585,387 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram * cdef np.ndarray[FLOAT_T, ndim=3] xyz = np.empty(shape, dtype=FLOAT) */ /*else*/ { - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_unkown_order, __pyx_n_s_format); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 682, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_10); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); - __Pyx_INCREF(__pyx_t_4); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_unkown_order, __pyx_n_s_format); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_10, function); + __Pyx_DECREF_SET(__pyx_t_8, function); } } - if (!__pyx_t_4) { - __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_v_order); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 682, __pyx_L1_error) + if (!__pyx_t_10) { + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_order); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 684, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); } else { #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_v_order}; - __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 682, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyFunction_Check(__pyx_t_8)) { + PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_v_order}; + __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 684, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_6); } else #endif #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_v_order}; - __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 682, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) { + PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_v_order}; + __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 684, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_6); } else #endif { - __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 682, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4); __pyx_t_4 = NULL; + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10); __pyx_t_10 = NULL; __Pyx_INCREF(__pyx_v_order); __Pyx_GIVEREF(__pyx_v_order); - PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_v_order); - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 682, __pyx_L1_error) + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_order); + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 684, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } } - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 682, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 682, __pyx_L1_error) + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(0, 684, __pyx_L1_error) } __pyx_L13:; - /* "MDAnalysis/lib/formats/libdcd.pyx":684 + /* "MDAnalysis/lib/formats/libdcd.pyx":686 * raise ValueError("unkown order '{}'".format(order)) * * cdef np.ndarray[FLOAT_T, ndim=3] xyz = np.empty(shape, dtype=FLOAT) # <<<<<<<<<<<<<< * cdef np.ndarray[DOUBLE_T, ndim=2] box = np.empty((n, 6)) * */ - __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 684, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_empty); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 684, __pyx_L1_error) + __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 686, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_empty); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 686, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 684, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 686, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_v_shape); __Pyx_GIVEREF(__pyx_v_shape); - PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_shape); - __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 684, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 684, __pyx_L1_error) + PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_shape); + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 686, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 684, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_10, __pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 684, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 686, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 686, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, __pyx_t_4); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 686, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 684, __pyx_L1_error) - __pyx_t_15 = ((PyArrayObject *)__pyx_t_4); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 686, __pyx_L1_error) + __pyx_t_15 = ((PyArrayObject *)__pyx_t_10); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_xyz.rcbuffer->pybuffer, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T, PyBUF_FORMAT| PyBUF_STRIDES, 3, 0, __pyx_stack) == -1)) { __pyx_v_xyz = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_xyz.rcbuffer->pybuffer.buf = NULL; - __PYX_ERR(0, 684, __pyx_L1_error) + __PYX_ERR(0, 686, __pyx_L1_error) } else {__pyx_pybuffernd_xyz.diminfo[0].strides = __pyx_pybuffernd_xyz.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_xyz.diminfo[0].shape = __pyx_pybuffernd_xyz.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_xyz.diminfo[1].strides = __pyx_pybuffernd_xyz.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_xyz.diminfo[1].shape = __pyx_pybuffernd_xyz.rcbuffer->pybuffer.shape[1]; __pyx_pybuffernd_xyz.diminfo[2].strides = __pyx_pybuffernd_xyz.rcbuffer->pybuffer.strides[2]; __pyx_pybuffernd_xyz.diminfo[2].shape = __pyx_pybuffernd_xyz.rcbuffer->pybuffer.shape[2]; } } __pyx_t_15 = 0; - __pyx_v_xyz = ((PyArrayObject *)__pyx_t_4); - __pyx_t_4 = 0; + __pyx_v_xyz = ((PyArrayObject *)__pyx_t_10); + __pyx_t_10 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":685 + /* "MDAnalysis/lib/formats/libdcd.pyx":687 * * cdef np.ndarray[FLOAT_T, ndim=3] xyz = np.empty(shape, dtype=FLOAT) * cdef np.ndarray[DOUBLE_T, ndim=2] box = np.empty((n, 6)) # <<<<<<<<<<<<<< * * */ - __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 685, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 685, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 685, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 687, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 687, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 685, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 687, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 687, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_8); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_INCREF(__pyx_int_6); __Pyx_GIVEREF(__pyx_int_6); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_6); - __pyx_t_8 = 0; - __pyx_t_8 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_10))) { - __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_10); - if (likely(__pyx_t_8)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); - __Pyx_INCREF(__pyx_t_8); + __pyx_t_4 = 0; + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_10, function); + __Pyx_DECREF_SET(__pyx_t_8, function); } } - if (!__pyx_t_8) { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 685, __pyx_L1_error) + if (!__pyx_t_4) { + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 687, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); } else { #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 685, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_GOTREF(__pyx_t_4); + if (PyFunction_Check(__pyx_t_8)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_6}; + __pyx_t_10 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 687, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { - PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 685, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_GOTREF(__pyx_t_4); + if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_6}; + __pyx_t_10 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 687, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif { - __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 685, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 687, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_8); __pyx_t_8 = NULL; + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4); __pyx_t_4 = NULL; __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_t_6); __pyx_t_6 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 685, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_2, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 687, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } } - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 685, __pyx_L1_error) - __pyx_t_16 = ((PyArrayObject *)__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 687, __pyx_L1_error) + __pyx_t_16 = ((PyArrayObject *)__pyx_t_10); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_box.rcbuffer->pybuffer, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) { __pyx_v_box = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_box.rcbuffer->pybuffer.buf = NULL; - __PYX_ERR(0, 685, __pyx_L1_error) + __PYX_ERR(0, 687, __pyx_L1_error) } else {__pyx_pybuffernd_box.diminfo[0].strides = __pyx_pybuffernd_box.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_box.diminfo[0].shape = __pyx_pybuffernd_box.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_box.diminfo[1].strides = __pyx_pybuffernd_box.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_box.diminfo[1].shape = __pyx_pybuffernd_box.rcbuffer->pybuffer.shape[1]; } } __pyx_t_16 = 0; - __pyx_v_box = ((PyArrayObject *)__pyx_t_4); - __pyx_t_4 = 0; + __pyx_v_box = ((PyArrayObject *)__pyx_t_10); + __pyx_t_10 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":688 + /* "MDAnalysis/lib/formats/libdcd.pyx":690 * * * cdef np.ndarray xyz_tmp = np.empty((self.natoms, self.ndims), dtype=FLOAT, order='F') # <<<<<<<<<<<<<< * cdef int ok, i * */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 688, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 688, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 690, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 688, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 688, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 690, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_self->natoms); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 690, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->ndims); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 690, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 688, __pyx_L1_error) + __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 690, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_10); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2); - __pyx_t_4 = 0; + __pyx_t_10 = 0; __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 688, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 690, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 688, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 690, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 688, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 688, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 688, __pyx_L1_error) - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 688, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_FLOAT); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 690, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 690, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_order, __pyx_n_s_F) < 0) __PYX_ERR(0, 690, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 690, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 688, __pyx_L1_error) - __pyx_v_xyz_tmp = ((PyArrayObject *)__pyx_t_4); - __pyx_t_4 = 0; + if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 690, __pyx_L1_error) + __pyx_v_xyz_tmp = ((PyArrayObject *)__pyx_t_10); + __pyx_t_10 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":691 + /* "MDAnalysis/lib/formats/libdcd.pyx":693 * cdef int ok, i * * if start == 0 and step == 1 and stop == self.n_frames: # <<<<<<<<<<<<<< * for i in range(n): * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[i], i==0) */ - __pyx_t_4 = __Pyx_PyInt_EqObjC(__pyx_v_start, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 691, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 691, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = __Pyx_PyInt_EqObjC(__pyx_v_start, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 693, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; if (__pyx_t_3) { } else { __pyx_t_5 = __pyx_t_3; goto __pyx_L15_bool_binop_done; } - __pyx_t_4 = __Pyx_PyInt_EqObjC(__pyx_v_step, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 691, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 691, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = __Pyx_PyInt_EqObjC(__pyx_v_step, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 693, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; if (__pyx_t_3) { } else { __pyx_t_5 = __pyx_t_3; goto __pyx_L15_bool_binop_done; } - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->n_frames); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 691, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = PyObject_RichCompare(__pyx_v_stop, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 691, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 691, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_self->n_frames); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_6 = PyObject_RichCompare(__pyx_v_stop, __pyx_t_10, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 693, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 693, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_5 = __pyx_t_3; __pyx_L15_bool_binop_done:; if (__pyx_t_5) { - /* "MDAnalysis/lib/formats/libdcd.pyx":692 + /* "MDAnalysis/lib/formats/libdcd.pyx":694 * * if start == 0 and step == 1 and stop == self.n_frames: * for i in range(n): # <<<<<<<<<<<<<< * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[i], i==0) * if ok != 0 and ok != -4: */ - __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_range); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 692, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_range); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 694, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 694, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_10)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_10); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_10))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_10); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); + __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); + __Pyx_DECREF_SET(__pyx_t_10, function); } } - if (!__pyx_t_10) { - __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 692, __pyx_L1_error) + if (!__pyx_t_8) { + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_6); } else { #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_2}; - __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 692, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + if (PyFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_2}; + __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else #endif #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_2}; - __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 692, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_2}; + __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else #endif { - __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 692, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_10); __pyx_t_10 = NULL; + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 694, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8); __pyx_t_8 = NULL; __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_2); __pyx_t_2 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } } - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; if (likely(PyList_CheckExact(__pyx_t_6)) || PyTuple_CheckExact(__pyx_t_6)) { - __pyx_t_4 = __pyx_t_6; __Pyx_INCREF(__pyx_t_4); __pyx_t_9 = 0; + __pyx_t_10 = __pyx_t_6; __Pyx_INCREF(__pyx_t_10); __pyx_t_9 = 0; __pyx_t_17 = NULL; } else { - __pyx_t_9 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 692, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_17 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_9 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 694, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext; if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 694, __pyx_L1_error) } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; for (;;) { if (likely(!__pyx_t_17)) { - if (likely(PyList_CheckExact(__pyx_t_4))) { - if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_4)) break; + if (likely(PyList_CheckExact(__pyx_t_10))) { + if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_10)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 694, __pyx_L1_error) #else - __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_6 = PySequence_ITEM(__pyx_t_10, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); #endif } else { - if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_4)) break; + if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_10)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 694, __pyx_L1_error) #else - __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_6 = PySequence_ITEM(__pyx_t_10, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 694, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); #endif } } else { - __pyx_t_6 = __pyx_t_17(__pyx_t_4); + __pyx_t_6 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_6)) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 692, __pyx_L1_error) + else __PYX_ERR(0, 694, __pyx_L1_error) } break; } __Pyx_GOTREF(__pyx_t_6); } - __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 692, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 694, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_i = __pyx_t_7; - /* "MDAnalysis/lib/formats/libdcd.pyx":693 + /* "MDAnalysis/lib/formats/libdcd.pyx":695 * if start == 0 and step == 1 and stop == self.n_frames: * for i in range(n): * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[i], i==0) # <<<<<<<<<<<<<< * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) */ - __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__40); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__41); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__42); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__43); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__44); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__45); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_20 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_20.memview)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_20 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_20.memview)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_box), __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_box), __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_21 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_21.memview)) __PYX_ERR(0, 693, __pyx_L1_error) + __pyx_t_21 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(__pyx_t_6, PyBUF_WRITABLE); if (unlikely(!__pyx_t_21.memview)) __PYX_ERR(0, 695, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_ok = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_7formats_6libdcd_DCDFile *)__pyx_v_self->__pyx_vtab)->c_readframes_helper(__pyx_v_self, __pyx_t_18, __pyx_t_19, __pyx_t_20, __pyx_t_21, (__pyx_v_i == 0)); __PYX_XDEC_MEMVIEW(&__pyx_t_18, 1); @@ -9922,7 +9981,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_21.memview = NULL; __pyx_t_21.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":694 + /* "MDAnalysis/lib/formats/libdcd.pyx":696 * for i in range(n): * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[i], i==0) * if ok != 0 and ok != -4: # <<<<<<<<<<<<<< @@ -9940,74 +9999,74 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram } if (unlikely(__pyx_t_5)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":695 + /* "MDAnalysis/lib/formats/libdcd.pyx":697 * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[i], i==0) * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * copy_in_order(xyz_tmp[c_indices], xyz, hash_order, i) * else: */ - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_frames_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 695, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 695, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_frames_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 697, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 697, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 695, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); + __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 697, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { - __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_8); + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_2)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_8, function); + __Pyx_DECREF_SET(__pyx_t_4, function); } } if (!__pyx_t_2) { - __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 697, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_GOTREF(__pyx_t_6); } else { #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_8)) { - PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_10}; - __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_8}; + __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 697, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) { - PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_10}; - __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_8}; + __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 697, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif { - __pyx_t_22 = PyTuple_New(1+1); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 695, __pyx_L1_error) + __pyx_t_22 = PyTuple_New(1+1); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 697, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_22, 0, __pyx_t_2); __pyx_t_2 = NULL; - __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_22, 0+1, __pyx_t_10); - __pyx_t_10 = 0; - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_22, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_22, 0+1, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_22, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 697, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; } } - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_6); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 695, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 697, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(0, 697, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":694 + /* "MDAnalysis/lib/formats/libdcd.pyx":696 * for i in range(n): * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[i], i==0) * if ok != 0 and ok != -4: # <<<<<<<<<<<<<< @@ -10016,18 +10075,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":696 + /* "MDAnalysis/lib/formats/libdcd.pyx":698 * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) * copy_in_order(xyz_tmp[c_indices], xyz, hash_order, i) # <<<<<<<<<<<<<< * else: * counter = 0 */ - __pyx_t_8 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), ((PyObject *)__pyx_v_c_indices)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 696, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_23 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_8, PyBUF_WRITABLE); if (unlikely(!__pyx_t_23.memview)) __PYX_ERR(0, 696, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_24 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(((PyObject *)__pyx_v_xyz), PyBUF_WRITABLE); if (unlikely(!__pyx_t_24.memview)) __PYX_ERR(0, 696, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), ((PyObject *)__pyx_v_c_indices)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_23 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_23.memview)) __PYX_ERR(0, 698, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_24 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(((PyObject *)__pyx_v_xyz), PyBUF_WRITABLE); if (unlikely(!__pyx_t_24.memview)) __PYX_ERR(0, 698, __pyx_L1_error) __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_copy_in_order(__pyx_t_23, __pyx_t_24, __pyx_v_hash_order, __pyx_v_i); __PYX_XDEC_MEMVIEW(&__pyx_t_23, 1); __pyx_t_23.memview = NULL; @@ -10036,7 +10095,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_24.memview = NULL; __pyx_t_24.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":692 + /* "MDAnalysis/lib/formats/libdcd.pyx":694 * * if start == 0 and step == 1 and stop == self.n_frames: * for i in range(n): # <<<<<<<<<<<<<< @@ -10044,9 +10103,9 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram * if ok != 0 and ok != -4: */ } - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":691 + /* "MDAnalysis/lib/formats/libdcd.pyx":693 * cdef int ok, i * * if start == 0 and step == 1 and stop == self.n_frames: # <<<<<<<<<<<<<< @@ -10056,7 +10115,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram goto __pyx_L14; } - /* "MDAnalysis/lib/formats/libdcd.pyx":698 + /* "MDAnalysis/lib/formats/libdcd.pyx":700 * copy_in_order(xyz_tmp[c_indices], xyz, hash_order, i) * else: * counter = 0 # <<<<<<<<<<<<<< @@ -10067,45 +10126,45 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_INCREF(__pyx_int_0); __pyx_v_counter = __pyx_int_0; - /* "MDAnalysis/lib/formats/libdcd.pyx":699 + /* "MDAnalysis/lib/formats/libdcd.pyx":701 * else: * counter = 0 * for i in range(start, stop, step): # <<<<<<<<<<<<<< * self.seek(i) * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) */ - __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_range); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 699, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_range); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 701, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); __pyx_t_6 = NULL; __pyx_t_7 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_8))) { - __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8); + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_6)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_8, function); + __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_7 = 1; } } #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_8)) { + if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_start, __pyx_v_stop, __pyx_v_step}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 699, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 701, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); } else #endif #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_8)) { + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[4] = {__pyx_t_6, __pyx_v_start, __pyx_v_stop, __pyx_v_step}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_8, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 699, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 3+__pyx_t_7); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 701, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); } else #endif { - __pyx_t_22 = PyTuple_New(3+__pyx_t_7); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 699, __pyx_L1_error) + __pyx_t_22 = PyTuple_New(3+__pyx_t_7); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 701, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); if (__pyx_t_6) { __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_22, 0, __pyx_t_6); __pyx_t_6 = NULL; @@ -10119,137 +10178,137 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __Pyx_INCREF(__pyx_v_step); __Pyx_GIVEREF(__pyx_v_step); PyTuple_SET_ITEM(__pyx_t_22, 2+__pyx_t_7, __pyx_v_step); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_22, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 699, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_22, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 701, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; } - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) { - __pyx_t_8 = __pyx_t_4; __Pyx_INCREF(__pyx_t_8); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (likely(PyList_CheckExact(__pyx_t_10)) || PyTuple_CheckExact(__pyx_t_10)) { + __pyx_t_4 = __pyx_t_10; __Pyx_INCREF(__pyx_t_4); __pyx_t_9 = 0; __pyx_t_17 = NULL; } else { - __pyx_t_9 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 699, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_17 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 699, __pyx_L1_error) + __pyx_t_9 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_10); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 701, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_17 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 701, __pyx_L1_error) } - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; for (;;) { if (likely(!__pyx_t_17)) { - if (likely(PyList_CheckExact(__pyx_t_8))) { - if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_8)) break; + if (likely(PyList_CheckExact(__pyx_t_4))) { + if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_4)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_4); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 699, __pyx_L1_error) + __pyx_t_10 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_10); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 701, __pyx_L1_error) #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_8, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 699, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 701, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); #endif } else { - if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_4)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_4); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 699, __pyx_L1_error) + __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_10); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 701, __pyx_L1_error) #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_8, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 699, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 701, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); #endif } } else { - __pyx_t_4 = __pyx_t_17(__pyx_t_8); - if (unlikely(!__pyx_t_4)) { + __pyx_t_10 = __pyx_t_17(__pyx_t_4); + if (unlikely(!__pyx_t_10)) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 699, __pyx_L1_error) + else __PYX_ERR(0, 701, __pyx_L1_error) } break; } - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); } - __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 699, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_10); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 701, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_v_i = __pyx_t_7; - /* "MDAnalysis/lib/formats/libdcd.pyx":700 + /* "MDAnalysis/lib/formats/libdcd.pyx":702 * counter = 0 * for i in range(start, stop, step): * self.seek(i) # <<<<<<<<<<<<<< * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) * if ok != 0 and ok != -4: */ - __pyx_t_22 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_seek); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 700, __pyx_L1_error) + __pyx_t_22 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_seek); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 702, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); - __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 700, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 702, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = NULL; + __pyx_t_8 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_22))) { - __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_22); - if (likely(__pyx_t_10)) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_22); + if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22); - __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_22, function); } } - if (!__pyx_t_10) { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_22, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 700, __pyx_L1_error) + if (!__pyx_t_8) { + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_t_22, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 702, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_22)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 700, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_4); + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_10 = __Pyx_PyFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 702, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_22)) { - PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 700, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_4); + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_10 = __Pyx_PyCFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 702, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif { - __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 700, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 702, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10); __pyx_t_10 = NULL; + __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_8); __pyx_t_8 = NULL; __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_t_6); __pyx_t_6 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_22, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 700, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_22, __pyx_t_2, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 702, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } } __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":701 + /* "MDAnalysis/lib/formats/libdcd.pyx":703 * for i in range(start, stop, step): * self.seek(i) * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) # <<<<<<<<<<<<<< * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) */ - __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__46); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_20 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_20.memview)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__48); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__50); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_box), __pyx_v_counter); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_21 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(__pyx_t_4, PyBUF_WRITABLE); if (unlikely(!__pyx_t_21.memview)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_10 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__47); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_20 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_10, PyBUF_WRITABLE); if (unlikely(!__pyx_t_20.memview)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__49); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_19 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_10, PyBUF_WRITABLE); if (unlikely(!__pyx_t_19.memview)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), __pyx_tuple__51); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_10, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_box), __pyx_v_counter); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_21 = __Pyx_PyObject_to_MemoryviewSlice_dc_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T(__pyx_t_10, PyBUF_WRITABLE); if (unlikely(!__pyx_t_21.memview)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_v_ok = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_7formats_6libdcd_DCDFile *)__pyx_v_self->__pyx_vtab)->c_readframes_helper(__pyx_v_self, __pyx_t_20, __pyx_t_19, __pyx_t_18, __pyx_t_21, (__pyx_v_i == 0)); __PYX_XDEC_MEMVIEW(&__pyx_t_20, 1); __pyx_t_20.memview = NULL; @@ -10264,7 +10323,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_21.memview = NULL; __pyx_t_21.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":702 + /* "MDAnalysis/lib/formats/libdcd.pyx":704 * self.seek(i) * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) * if ok != 0 and ok != -4: # <<<<<<<<<<<<<< @@ -10282,18 +10341,18 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram } if (unlikely(__pyx_t_5)) { - /* "MDAnalysis/lib/formats/libdcd.pyx":703 + /* "MDAnalysis/lib/formats/libdcd.pyx":705 * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) # <<<<<<<<<<<<<< * copy_in_order(xyz_tmp[c_indices], xyz, hash_order, counter) * counter += 1 */ - __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_frames_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 703, __pyx_L1_error) + __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Reading_DCD_frames_failed, __pyx_n_s_format); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 705, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 703, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCD_ERRORS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 705, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 703, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_ok, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 705, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; @@ -10307,49 +10366,49 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram } } if (!__pyx_t_2) { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_22, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 703, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_t_22, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 705, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_22)) { PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 703, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 705, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_22)) { PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_6}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 703, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyCFunction_FastCall(__pyx_t_22, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 705, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GOTREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif { - __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 703, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2); __pyx_t_2 = NULL; + __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 705, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2); __pyx_t_2 = NULL; __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_6); __pyx_t_6 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_22, __pyx_t_10, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 703, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_22, __pyx_t_8, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 705, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } } __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; - __pyx_t_22 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_4); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 703, __pyx_L1_error) + __pyx_t_22 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IOError, __pyx_t_10); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 705, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_Raise(__pyx_t_22, 0, 0, 0); __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; - __PYX_ERR(0, 703, __pyx_L1_error) + __PYX_ERR(0, 705, __pyx_L1_error) - /* "MDAnalysis/lib/formats/libdcd.pyx":702 + /* "MDAnalysis/lib/formats/libdcd.pyx":704 * self.seek(i) * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) * if ok != 0 and ok != -4: # <<<<<<<<<<<<<< @@ -10358,19 +10417,19 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram */ } - /* "MDAnalysis/lib/formats/libdcd.pyx":704 + /* "MDAnalysis/lib/formats/libdcd.pyx":706 * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) * copy_in_order(xyz_tmp[c_indices], xyz, hash_order, counter) # <<<<<<<<<<<<<< * counter += 1 * */ - __pyx_t_22 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), ((PyObject *)__pyx_v_c_indices)); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 704, __pyx_L1_error) + __pyx_t_22 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_xyz_tmp), ((PyObject *)__pyx_v_c_indices)); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 706, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); - __pyx_t_23 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_22, PyBUF_WRITABLE); if (unlikely(!__pyx_t_23.memview)) __PYX_ERR(0, 704, __pyx_L1_error) + __pyx_t_23 = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(__pyx_t_22, PyBUF_WRITABLE); if (unlikely(!__pyx_t_23.memview)) __PYX_ERR(0, 706, __pyx_L1_error) __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; - __pyx_t_24 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(((PyObject *)__pyx_v_xyz), PyBUF_WRITABLE); if (unlikely(!__pyx_t_24.memview)) __PYX_ERR(0, 704, __pyx_L1_error) - __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_v_counter); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 704, __pyx_L1_error) + __pyx_t_24 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_nn___pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T(((PyObject *)__pyx_v_xyz), PyBUF_WRITABLE); if (unlikely(!__pyx_t_24.memview)) __PYX_ERR(0, 706, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_v_counter); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 706, __pyx_L1_error) __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_copy_in_order(__pyx_t_23, __pyx_t_24, __pyx_v_hash_order, __pyx_t_7); __PYX_XDEC_MEMVIEW(&__pyx_t_23, 1); __pyx_t_23.memview = NULL; @@ -10379,19 +10438,19 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram __pyx_t_24.memview = NULL; __pyx_t_24.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":705 + /* "MDAnalysis/lib/formats/libdcd.pyx":707 * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) * copy_in_order(xyz_tmp[c_indices], xyz, hash_order, counter) * counter += 1 # <<<<<<<<<<<<<< * * return DCDFrame(xyz, box) */ - __pyx_t_22 = __Pyx_PyInt_AddObjC(__pyx_v_counter, __pyx_int_1, 1, 1); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 705, __pyx_L1_error) + __pyx_t_22 = __Pyx_PyInt_AddObjC(__pyx_v_counter, __pyx_int_1, 1, 1); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 707, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); __Pyx_DECREF_SET(__pyx_v_counter, __pyx_t_22); __pyx_t_22 = 0; - /* "MDAnalysis/lib/formats/libdcd.pyx":699 + /* "MDAnalysis/lib/formats/libdcd.pyx":701 * else: * counter = 0 * for i in range(start, stop, step): # <<<<<<<<<<<<<< @@ -10399,11 +10458,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) */ } - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __pyx_L14:; - /* "MDAnalysis/lib/formats/libdcd.pyx":707 + /* "MDAnalysis/lib/formats/libdcd.pyx":709 * counter += 1 * * return DCDFrame(xyz, box) # <<<<<<<<<<<<<< @@ -10411,15 +10470,15 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram * # Helper to read current DCD frame */ __Pyx_XDECREF(__pyx_r); - __pyx_t_22 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCDFrame); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 707, __pyx_L1_error) + __pyx_t_22 = __Pyx_GetModuleGlobalName(__pyx_n_s_DCDFrame); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 709, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); - __pyx_t_4 = NULL; + __pyx_t_10 = NULL; __pyx_t_7 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_22))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_22); - if (likely(__pyx_t_4)) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_22); + if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22); - __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_22, function); __pyx_t_7 = 1; @@ -10427,42 +10486,42 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_22)) { - PyObject *__pyx_temp[3] = {__pyx_t_4, ((PyObject *)__pyx_v_xyz), ((PyObject *)__pyx_v_box)}; - __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_22, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 707, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_8); + PyObject *__pyx_temp[3] = {__pyx_t_10, ((PyObject *)__pyx_v_xyz), ((PyObject *)__pyx_v_box)}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_22, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 709, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_4); } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_22)) { - PyObject *__pyx_temp[3] = {__pyx_t_4, ((PyObject *)__pyx_v_xyz), ((PyObject *)__pyx_v_box)}; - __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_22, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 707, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_8); + PyObject *__pyx_temp[3] = {__pyx_t_10, ((PyObject *)__pyx_v_xyz), ((PyObject *)__pyx_v_box)}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_22, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 709, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_4); } else #endif { - __pyx_t_10 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 707, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - if (__pyx_t_4) { - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_4); __pyx_t_4 = NULL; + __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 709, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + if (__pyx_t_10) { + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_10); __pyx_t_10 = NULL; } __Pyx_INCREF(((PyObject *)__pyx_v_xyz)); __Pyx_GIVEREF(((PyObject *)__pyx_v_xyz)); - PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_7, ((PyObject *)__pyx_v_xyz)); + PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, ((PyObject *)__pyx_v_xyz)); __Pyx_INCREF(((PyObject *)__pyx_v_box)); __Pyx_GIVEREF(((PyObject *)__pyx_v_box)); - PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_7, ((PyObject *)__pyx_v_box)); - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_22, __pyx_t_10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 707, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, ((PyObject *)__pyx_v_box)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_22, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 709, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0; - __pyx_r = __pyx_t_8; - __pyx_t_8 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/formats/libdcd.pyx":600 + /* "MDAnalysis/lib/formats/libdcd.pyx":602 * * * def readframes(self, start=None, stop=None, step=None, order='fac', indices=None): # <<<<<<<<<<<<<< @@ -10514,7 +10573,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_34readfram return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":710 +/* "MDAnalysis/lib/formats/libdcd.pyx":712 * * # Helper to read current DCD frame * cdef int c_readframes_helper(self, FLOAT_T[::1] x, # <<<<<<<<<<<<<< @@ -10533,7 +10592,7 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_c_readframes_help Py_ssize_t __pyx_t_5; __Pyx_RefNannySetupContext("c_readframes_helper", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":715 + /* "MDAnalysis/lib/formats/libdcd.pyx":717 * cdef int ok * ok = read_dcdstep(self.fp, self.natoms, * &x[0], # <<<<<<<<<<<<<< @@ -10548,10 +10607,10 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_c_readframes_help } else if (unlikely(__pyx_t_1 >= __pyx_v_x.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); - __PYX_ERR(0, 715, __pyx_L1_error) + __PYX_ERR(0, 717, __pyx_L1_error) } - /* "MDAnalysis/lib/formats/libdcd.pyx":716 + /* "MDAnalysis/lib/formats/libdcd.pyx":718 * ok = read_dcdstep(self.fp, self.natoms, * &x[0], * &y[0], &z[0], # <<<<<<<<<<<<<< @@ -10566,7 +10625,7 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_c_readframes_help } else if (unlikely(__pyx_t_3 >= __pyx_v_y.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); - __PYX_ERR(0, 716, __pyx_L1_error) + __PYX_ERR(0, 718, __pyx_L1_error) } __pyx_t_4 = 0; __pyx_t_2 = -1; @@ -10576,10 +10635,10 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_c_readframes_help } else if (unlikely(__pyx_t_4 >= __pyx_v_z.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); - __PYX_ERR(0, 716, __pyx_L1_error) + __PYX_ERR(0, 718, __pyx_L1_error) } - /* "MDAnalysis/lib/formats/libdcd.pyx":717 + /* "MDAnalysis/lib/formats/libdcd.pyx":719 * &x[0], * &y[0], &z[0], * &unitcell[0], self.nfixed, first_frame, # <<<<<<<<<<<<<< @@ -10594,10 +10653,10 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_c_readframes_help } else if (unlikely(__pyx_t_5 >= __pyx_v_unitcell.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); - __PYX_ERR(0, 717, __pyx_L1_error) + __PYX_ERR(0, 719, __pyx_L1_error) } - /* "MDAnalysis/lib/formats/libdcd.pyx":714 + /* "MDAnalysis/lib/formats/libdcd.pyx":716 * DOUBLE_T[::1] unitcell, int first_frame): * cdef int ok * ok = read_dcdstep(self.fp, self.natoms, # <<<<<<<<<<<<<< @@ -10606,7 +10665,7 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_c_readframes_help */ __pyx_v_ok = read_dcdstep(__pyx_v_self->fp, __pyx_v_self->natoms, ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) __pyx_v_x.data) + __pyx_t_1)) ))))), ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) __pyx_v_y.data) + __pyx_t_3)) ))))), ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_FLOAT_T *) __pyx_v_z.data) + __pyx_t_4)) ))))), ((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T *)(&(*((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T *) ( /* dim=0 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_7formats_6libdcd_DOUBLE_T *) __pyx_v_unitcell.data) + __pyx_t_5)) ))))), __pyx_v_self->nfixed, __pyx_v_first_frame, __pyx_v_self->freeind, __pyx_v_self->fixedcoords, __pyx_v_self->reverse_endian, __pyx_v_self->charmm); - /* "MDAnalysis/lib/formats/libdcd.pyx":720 + /* "MDAnalysis/lib/formats/libdcd.pyx":722 * self.freeind, self.fixedcoords, * self.reverse_endian, self.charmm) * return ok # <<<<<<<<<<<<<< @@ -10616,7 +10675,7 @@ static int __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_c_readframes_help __pyx_r = __pyx_v_ok; goto __pyx_L0; - /* "MDAnalysis/lib/formats/libdcd.pyx":710 + /* "MDAnalysis/lib/formats/libdcd.pyx":712 * * # Helper to read current DCD frame * cdef int c_readframes_helper(self, FLOAT_T[::1] x, # <<<<<<<<<<<<<< @@ -10927,7 +10986,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_6libdcd_7DCDFile_12_header_ return __pyx_r; } -/* "MDAnalysis/lib/formats/libdcd.pyx":724 +/* "MDAnalysis/lib/formats/libdcd.pyx":726 * * # Helper in readframes to copy given a specific memory layout * cdef void copy_in_order(FLOAT_T[:, :] source, FLOAT_T[:, :, :] target, int order, int index): # <<<<<<<<<<<<<< @@ -10946,7 +11005,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_copy_in_order(__Pyx_memvi __Pyx_memviewslice __pyx_t_7 = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_RefNannySetupContext("copy_in_order", 0); - /* "MDAnalysis/lib/formats/libdcd.pyx":725 + /* "MDAnalysis/lib/formats/libdcd.pyx":727 * # Helper in readframes to copy given a specific memory layout * cdef void copy_in_order(FLOAT_T[:, :] source, FLOAT_T[:, :, :] target, int order, int index): * if order == 1: # 'fac': # <<<<<<<<<<<<<< @@ -10956,7 +11015,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_copy_in_order(__Pyx_memvi switch (__pyx_v_order) { case 1: - /* "MDAnalysis/lib/formats/libdcd.pyx":726 + /* "MDAnalysis/lib/formats/libdcd.pyx":728 * cdef void copy_in_order(FLOAT_T[:, :] source, FLOAT_T[:, :, :] target, int order, int index): * if order == 1: # 'fac': * target[index] = source # <<<<<<<<<<<<<< @@ -10974,7 +11033,7 @@ static void __pyx_f_10MDAnalysis_3lib_7formats_6libdcd_copy_in_order(__Pyx_memvi __pyx_tmp_idx += __pyx_tmp_shape; if (1 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __pyx_tmp_shape)) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 0)"); - __PYX_ERR(0, 726, __pyx_L1_error) + __PYX_ERR(0, 728, __pyx_L1_error) } __pyx_t_1.data += __pyx_tmp_idx * __pyx_tmp_stride; } @@ -10987,12 +11046,12 @@ __pyx_t_1.shape[1] = __pyx_v_target.shape[2]; __pyx_t_1.strides[1] = __pyx_v_target.strides[2]; __pyx_t_1.suboffsets[1] = -1; -if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_1, 2, 2, 0) < 0)) __PYX_ERR(0, 726, __pyx_L1_error) +if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_1, 2, 2, 0) < 0)) __PYX_ERR(0, 728, __pyx_L1_error) __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1); __pyx_t_1.memview = NULL; __pyx_t_1.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":725 + /* "MDAnalysis/lib/formats/libdcd.pyx":727 * # Helper in readframes to copy given a specific memory layout * cdef void copy_in_order(FLOAT_T[:, :] source, FLOAT_T[:, :, :] target, int order, int index): * if order == 1: # 'fac': # <<<<<<<<<<<<<< @@ -11001,7 +11060,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_1, 2, 2, 0) */ break; - /* "MDAnalysis/lib/formats/libdcd.pyx":727 + /* "MDAnalysis/lib/formats/libdcd.pyx":729 * if order == 1: # 'fac': * target[index] = source * elif order == 2: # 'fca': # <<<<<<<<<<<<<< @@ -11010,7 +11069,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_1, 2, 2, 0) */ case 2: - /* "MDAnalysis/lib/formats/libdcd.pyx":728 + /* "MDAnalysis/lib/formats/libdcd.pyx":730 * target[index] = source * elif order == 2: # 'fca': * target[index] = source.T # <<<<<<<<<<<<<< @@ -11019,7 +11078,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_1, 2, 2, 0) */ __pyx_t_2 = __pyx_v_source; __PYX_INC_MEMVIEW(&__pyx_t_2, 1); - if (unlikely(__pyx_memslice_transpose(&__pyx_t_2) == 0)) __PYX_ERR(0, 728, __pyx_L1_error) + if (unlikely(__pyx_memslice_transpose(&__pyx_t_2) == 0)) __PYX_ERR(0, 730, __pyx_L1_error) __pyx_t_3.data = __pyx_v_target.data; __pyx_t_3.memview = __pyx_v_target.memview; __PYX_INC_MEMVIEW(&__pyx_t_3, 0); @@ -11031,7 +11090,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_1, 2, 2, 0) __pyx_tmp_idx += __pyx_tmp_shape; if (1 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __pyx_tmp_shape)) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 0)"); - __PYX_ERR(0, 728, __pyx_L1_error) + __PYX_ERR(0, 730, __pyx_L1_error) } __pyx_t_3.data += __pyx_tmp_idx * __pyx_tmp_stride; } @@ -11044,7 +11103,7 @@ __pyx_t_3.shape[1] = __pyx_v_target.shape[2]; __pyx_t_3.strides[1] = __pyx_v_target.strides[2]; __pyx_t_3.suboffsets[1] = -1; -if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_2, __pyx_t_3, 2, 2, 0) < 0)) __PYX_ERR(0, 728, __pyx_L1_error) +if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_2, __pyx_t_3, 2, 2, 0) < 0)) __PYX_ERR(0, 730, __pyx_L1_error) __PYX_XDEC_MEMVIEW(&__pyx_t_3, 1); __pyx_t_3.memview = NULL; __pyx_t_3.data = NULL; @@ -11052,7 +11111,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_2, __pyx_t_3, 2, 2, 0) < 0)) __pyx_t_2.memview = NULL; __pyx_t_2.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":727 + /* "MDAnalysis/lib/formats/libdcd.pyx":729 * if order == 1: # 'fac': * target[index] = source * elif order == 2: # 'fca': # <<<<<<<<<<<<<< @@ -11061,7 +11120,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_2, __pyx_t_3, 2, 2, 0) < 0)) */ break; - /* "MDAnalysis/lib/formats/libdcd.pyx":729 + /* "MDAnalysis/lib/formats/libdcd.pyx":731 * elif order == 2: # 'fca': * target[index] = source.T * elif order == 3: # 'afc': # <<<<<<<<<<<<<< @@ -11070,7 +11129,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_2, __pyx_t_3, 2, 2, 0) < 0)) */ case 3: - /* "MDAnalysis/lib/formats/libdcd.pyx":730 + /* "MDAnalysis/lib/formats/libdcd.pyx":732 * target[index] = source.T * elif order == 3: # 'afc': * target[:, index] = source # <<<<<<<<<<<<<< @@ -11092,7 +11151,7 @@ __pyx_t_2.strides[0] = __pyx_v_target.strides[0]; __pyx_tmp_idx += __pyx_tmp_shape; if (1 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __pyx_tmp_shape)) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 1)"); - __PYX_ERR(0, 730, __pyx_L1_error) + __PYX_ERR(0, 732, __pyx_L1_error) } __pyx_t_2.data += __pyx_tmp_idx * __pyx_tmp_stride; } @@ -11101,12 +11160,12 @@ __pyx_t_2.shape[1] = __pyx_v_target.shape[2]; __pyx_t_2.strides[1] = __pyx_v_target.strides[2]; __pyx_t_2.suboffsets[1] = -1; -if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_2, 2, 2, 0) < 0)) __PYX_ERR(0, 730, __pyx_L1_error) +if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_2, 2, 2, 0) < 0)) __PYX_ERR(0, 732, __pyx_L1_error) __PYX_XDEC_MEMVIEW(&__pyx_t_2, 1); __pyx_t_2.memview = NULL; __pyx_t_2.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":729 + /* "MDAnalysis/lib/formats/libdcd.pyx":731 * elif order == 2: # 'fca': * target[index] = source.T * elif order == 3: # 'afc': # <<<<<<<<<<<<<< @@ -11115,7 +11174,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_2, 2, 2, 0) */ break; - /* "MDAnalysis/lib/formats/libdcd.pyx":731 + /* "MDAnalysis/lib/formats/libdcd.pyx":733 * elif order == 3: # 'afc': * target[:, index] = source * elif order == 4: # 'acf': # <<<<<<<<<<<<<< @@ -11124,7 +11183,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_2, 2, 2, 0) */ case 4: - /* "MDAnalysis/lib/formats/libdcd.pyx":732 + /* "MDAnalysis/lib/formats/libdcd.pyx":734 * target[:, index] = source * elif order == 4: # 'acf': * target[:, :, index] = source # <<<<<<<<<<<<<< @@ -11150,17 +11209,17 @@ __pyx_t_4.strides[1] = __pyx_v_target.strides[1]; __pyx_tmp_idx += __pyx_tmp_shape; if (1 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __pyx_tmp_shape)) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 2)"); - __PYX_ERR(0, 732, __pyx_L1_error) + __PYX_ERR(0, 734, __pyx_L1_error) } __pyx_t_4.data += __pyx_tmp_idx * __pyx_tmp_stride; } -if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_4, 2, 2, 0) < 0)) __PYX_ERR(0, 732, __pyx_L1_error) +if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_4, 2, 2, 0) < 0)) __PYX_ERR(0, 734, __pyx_L1_error) __PYX_XDEC_MEMVIEW(&__pyx_t_4, 1); __pyx_t_4.memview = NULL; __pyx_t_4.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":731 + /* "MDAnalysis/lib/formats/libdcd.pyx":733 * elif order == 3: # 'afc': * target[:, index] = source * elif order == 4: # 'acf': # <<<<<<<<<<<<<< @@ -11169,7 +11228,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_4, 2, 2, 0) */ break; - /* "MDAnalysis/lib/formats/libdcd.pyx":733 + /* "MDAnalysis/lib/formats/libdcd.pyx":735 * elif order == 4: # 'acf': * target[:, :, index] = source * elif order == 5: # 'caf': # <<<<<<<<<<<<<< @@ -11178,7 +11237,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_4, 2, 2, 0) */ case 5: - /* "MDAnalysis/lib/formats/libdcd.pyx":734 + /* "MDAnalysis/lib/formats/libdcd.pyx":736 * target[:, :, index] = source * elif order == 5: # 'caf': * target[:, :, index] = source.T # <<<<<<<<<<<<<< @@ -11187,7 +11246,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_v_source, __pyx_t_4, 2, 2, 0) */ __pyx_t_5 = __pyx_v_source; __PYX_INC_MEMVIEW(&__pyx_t_5, 1); - if (unlikely(__pyx_memslice_transpose(&__pyx_t_5) == 0)) __PYX_ERR(0, 734, __pyx_L1_error) + if (unlikely(__pyx_memslice_transpose(&__pyx_t_5) == 0)) __PYX_ERR(0, 736, __pyx_L1_error) __pyx_t_6.data = __pyx_v_target.data; __pyx_t_6.memview = __pyx_v_target.memview; __PYX_INC_MEMVIEW(&__pyx_t_6, 0); @@ -11207,12 +11266,12 @@ __pyx_t_6.strides[1] = __pyx_v_target.strides[1]; __pyx_tmp_idx += __pyx_tmp_shape; if (1 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __pyx_tmp_shape)) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 2)"); - __PYX_ERR(0, 734, __pyx_L1_error) + __PYX_ERR(0, 736, __pyx_L1_error) } __pyx_t_6.data += __pyx_tmp_idx * __pyx_tmp_stride; } -if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_6, 2, 2, 0) < 0)) __PYX_ERR(0, 734, __pyx_L1_error) +if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_6, 2, 2, 0) < 0)) __PYX_ERR(0, 736, __pyx_L1_error) __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL; @@ -11220,7 +11279,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_6, 2, 2, 0) < 0)) __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":733 + /* "MDAnalysis/lib/formats/libdcd.pyx":735 * elif order == 4: # 'acf': * target[:, :, index] = source * elif order == 5: # 'caf': # <<<<<<<<<<<<<< @@ -11229,7 +11288,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_6, 2, 2, 0) < 0)) */ break; - /* "MDAnalysis/lib/formats/libdcd.pyx":735 + /* "MDAnalysis/lib/formats/libdcd.pyx":737 * elif order == 5: # 'caf': * target[:, :, index] = source.T * elif order == 6: # 'cfa': # <<<<<<<<<<<<<< @@ -11237,14 +11296,14 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_6, 2, 2, 0) < 0)) */ case 6: - /* "MDAnalysis/lib/formats/libdcd.pyx":736 + /* "MDAnalysis/lib/formats/libdcd.pyx":738 * target[:, :, index] = source.T * elif order == 6: # 'cfa': * target[:, index] = source.T # <<<<<<<<<<<<<< */ __pyx_t_5 = __pyx_v_source; __PYX_INC_MEMVIEW(&__pyx_t_5, 1); - if (unlikely(__pyx_memslice_transpose(&__pyx_t_5) == 0)) __PYX_ERR(0, 736, __pyx_L1_error) + if (unlikely(__pyx_memslice_transpose(&__pyx_t_5) == 0)) __PYX_ERR(0, 738, __pyx_L1_error) __pyx_t_7.data = __pyx_v_target.data; __pyx_t_7.memview = __pyx_v_target.memview; __PYX_INC_MEMVIEW(&__pyx_t_7, 0); @@ -11260,7 +11319,7 @@ __pyx_t_7.strides[0] = __pyx_v_target.strides[0]; __pyx_tmp_idx += __pyx_tmp_shape; if (1 && (__pyx_tmp_idx < 0 || __pyx_tmp_idx >= __pyx_tmp_shape)) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 1)"); - __PYX_ERR(0, 736, __pyx_L1_error) + __PYX_ERR(0, 738, __pyx_L1_error) } __pyx_t_7.data += __pyx_tmp_idx * __pyx_tmp_stride; } @@ -11269,7 +11328,7 @@ __pyx_t_7.shape[1] = __pyx_v_target.shape[2]; __pyx_t_7.strides[1] = __pyx_v_target.strides[2]; __pyx_t_7.suboffsets[1] = -1; -if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_7, 2, 2, 0) < 0)) __PYX_ERR(0, 736, __pyx_L1_error) +if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_7, 2, 2, 0) < 0)) __PYX_ERR(0, 738, __pyx_L1_error) __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL; @@ -11277,7 +11336,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_7, 2, 2, 0) < 0)) __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL; - /* "MDAnalysis/lib/formats/libdcd.pyx":735 + /* "MDAnalysis/lib/formats/libdcd.pyx":737 * elif order == 5: # 'caf': * target[:, :, index] = source.T * elif order == 6: # 'cfa': # <<<<<<<<<<<<<< @@ -11287,7 +11346,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_7, 2, 2, 0) < 0)) default: break; } - /* "MDAnalysis/lib/formats/libdcd.pyx":724 + /* "MDAnalysis/lib/formats/libdcd.pyx":726 * * # Helper in readframes to copy given a specific memory layout * cdef void copy_in_order(FLOAT_T[:, :] source, FLOAT_T[:, :, :] target, int order, int index): # <<<<<<<<<<<<<< @@ -11310,7 +11369,7 @@ if (unlikely(__pyx_memoryview_copy_contents(__pyx_t_5, __pyx_t_7, 2, 2, 0) < 0)) __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -11358,7 +11417,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -11367,7 +11426,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -11376,7 +11435,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -11385,7 +11444,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -11399,7 +11458,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -11410,7 +11469,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -11419,20 +11478,20 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__51, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 229, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__52, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 229, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -11441,7 +11500,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -11455,7 +11514,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -11466,7 +11525,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -11475,20 +11534,20 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__52, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 233, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__53, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 233, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -11497,7 +11556,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -11506,7 +11565,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -11515,7 +11574,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -11525,7 +11584,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -11534,7 +11593,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -11543,7 +11602,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -11555,7 +11614,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -11564,7 +11623,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -11574,7 +11633,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -11584,7 +11643,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -11594,7 +11653,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -11605,7 +11664,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -11614,7 +11673,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -11623,7 +11682,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -11632,7 +11691,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -11641,7 +11700,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -11653,7 +11712,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -11666,7 +11725,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -11676,7 +11735,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -11686,7 +11745,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -11706,7 +11765,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -11723,7 +11782,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -11732,20 +11791,20 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__53, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 263, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__54, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -11754,7 +11813,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -11766,7 +11825,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -11777,7 +11836,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -11788,7 +11847,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -11799,7 +11858,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -11810,7 +11869,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -11821,7 +11880,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -11832,7 +11891,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -11843,7 +11902,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -11854,7 +11913,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -11865,7 +11924,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -11876,7 +11935,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -11887,7 +11946,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -11898,7 +11957,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -11909,7 +11968,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -11920,7 +11979,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -11931,7 +11990,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -11943,7 +12002,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -11964,7 +12023,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -11973,7 +12032,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -11983,7 +12042,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -11992,7 +12051,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -12002,7 +12061,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -12011,7 +12070,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -12020,7 +12079,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -12030,7 +12089,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -12040,7 +12099,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -12072,7 +12131,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -12096,7 +12155,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -12106,7 +12165,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -12115,7 +12174,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -12124,7 +12183,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -12134,7 +12193,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -12143,7 +12202,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -12152,7 +12211,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -12164,7 +12223,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -12178,7 +12237,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -12192,7 +12251,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -12211,7 +12270,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -12225,7 +12284,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -12239,7 +12298,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -12258,7 +12317,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -12272,7 +12331,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -12286,7 +12345,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -12305,7 +12364,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -12319,7 +12378,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -12333,7 +12392,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -12352,7 +12411,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -12366,7 +12425,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -12380,7 +12439,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -12399,7 +12458,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -12413,7 +12472,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -12423,7 +12482,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -12435,7 +12494,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -12444,7 +12503,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -12458,7 +12517,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -12473,7 +12532,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -12502,7 +12561,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -12511,7 +12570,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -12520,7 +12579,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -12543,7 +12602,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -12560,7 +12619,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -12595,7 +12654,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -12612,20 +12671,20 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__54, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 810, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__55, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 810, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -12634,7 +12693,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -12654,7 +12713,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -12671,7 +12730,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -12680,20 +12739,20 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__55, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 814, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__56, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 814, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -12702,7 +12761,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -12718,7 +12777,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -12727,7 +12786,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -12736,7 +12795,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -12747,7 +12806,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -12757,7 +12816,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -12767,7 +12826,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -12779,7 +12838,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -12789,20 +12848,20 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__56, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__57, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -12811,7 +12870,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -12829,7 +12888,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -12847,7 +12906,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -12865,7 +12924,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -12883,7 +12942,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -12901,7 +12960,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -12919,7 +12978,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -12937,7 +12996,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -12955,7 +13014,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -12973,7 +13032,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -12991,7 +13050,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -13009,7 +13068,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -13027,7 +13086,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -13045,7 +13104,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -13065,7 +13124,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -13085,7 +13144,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -13105,7 +13164,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -13123,7 +13182,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -13142,7 +13201,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -13151,7 +13210,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -13161,7 +13220,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -13174,7 +13233,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -13184,7 +13243,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -13194,7 +13253,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -13219,7 +13278,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -13234,7 +13293,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -13245,7 +13304,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -13254,7 +13313,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -13264,7 +13323,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -13274,7 +13333,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -13285,7 +13344,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -13294,7 +13353,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -13303,7 +13362,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -13315,7 +13374,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -13329,7 +13388,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -13339,7 +13398,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -13350,7 +13409,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -13359,7 +13418,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -13373,7 +13432,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -13388,7 +13447,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -13409,7 +13468,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -13425,7 +13484,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -13434,7 +13493,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -13448,7 +13507,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -13463,14 +13522,14 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__57, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1000, __pyx_L5_except_error) + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__58, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1000, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -13479,7 +13538,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -13494,7 +13553,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -13517,7 +13576,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -13538,7 +13597,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -13554,7 +13613,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -13563,7 +13622,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -13577,7 +13636,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -13592,14 +13651,14 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__58, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1006, __pyx_L5_except_error) + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__59, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1006, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -13608,7 +13667,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -13623,7 +13682,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -13646,7 +13705,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -13667,7 +13726,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -13683,7 +13742,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -13692,7 +13751,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -13706,7 +13765,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -13720,12 +13779,12 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__59, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1012, __pyx_L5_except_error) + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__60, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1012, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -13734,7 +13793,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -13749,7 +13808,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -13969,7 +14028,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ * * if itemsize <= 0: */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__60, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 132, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__61, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -14001,7 +14060,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ * * if not isinstance(format, bytes): */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__61, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 135, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__62, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -14036,7 +14095,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__62, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 138, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__63, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_5); @@ -14116,7 +14175,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ * * */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__63, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 147, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__64, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; @@ -14390,7 +14449,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ * * if self.dtype_is_object: */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__64, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 175, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__65, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 175, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_Raise(__pyx_t_10, 0, 0, 0); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; @@ -14631,7 +14690,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru * info.buf = self.data * info.len = self.len */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__65, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 191, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__66, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -15347,7 +15406,7 @@ static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __p * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__66, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__67, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -15400,7 +15459,7 @@ static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__67, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__68, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -17044,7 +17103,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit * * have_slices, index = _unellipsify(index, self.view.ndim) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__68, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 413, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__69, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 413, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -18071,7 +18130,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview * else: * if len(self.view.format) == 1: */ - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__69, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 490, __pyx_L5_except_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__70, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 490, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_Raise(__pyx_t_6, 0, 0, 0); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; @@ -18427,7 +18486,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu * * if flags & PyBUF_STRIDES: */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__70, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 515, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__71, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 515, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -18967,7 +19026,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(st * * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__71, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 565, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__72, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 565, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -19081,7 +19140,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get_ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 572, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__72, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 572, __pyx_L1_error) + __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__73, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 572, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_3; @@ -20082,7 +20141,7 @@ static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struc * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__73, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__74, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -20135,7 +20194,7 @@ static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED st * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__74, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__75, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -20486,9 +20545,9 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __Pyx_GOTREF(__pyx_t_7); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__75); - __Pyx_GIVEREF(__pyx_slice__75); - PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__75); + __Pyx_INCREF(__pyx_slice__76); + __Pyx_GIVEREF(__pyx_slice__76); + PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__76); } } __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 677, __pyx_L1_error) @@ -20521,7 +20580,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { * else: */ /*else*/ { - __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__76); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 680, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__77); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 680, __pyx_L1_error) } __pyx_L7:; @@ -20661,9 +20720,9 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __Pyx_GOTREF(__pyx_t_3); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__77); - __Pyx_GIVEREF(__pyx_slice__77); - PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__77); + __Pyx_INCREF(__pyx_slice__78); + __Pyx_GIVEREF(__pyx_slice__78); + PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__78); } } __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 691, __pyx_L1_error) @@ -20787,7 +20846,7 @@ static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __ * * */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__78, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 698, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__79, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 698, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; @@ -22950,7 +23009,7 @@ static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__79, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__80, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -23003,7 +23062,7 @@ static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUS * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__80, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__81, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -27887,7 +27946,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, {&__pyx_kp_s_Writing_DCD_header_failed, __pyx_k_Writing_DCD_header_failed, sizeof(__pyx_k_Writing_DCD_header_failed), 0, 0, 1, 0}, - {&__pyx_kp_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 0}, + {&__pyx_kp_s__5, __pyx_k__5, sizeof(__pyx_k__5), 0, 0, 1, 0}, {&__pyx_n_s_acf, __pyx_k_acf, sizeof(__pyx_k_acf), 0, 0, 1, 1}, {&__pyx_n_s_afc, __pyx_k_afc, sizeof(__pyx_k_afc), 0, 0, 1, 1}, {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, @@ -27942,6 +28001,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_indices, __pyx_k_indices, sizeof(__pyx_k_indices), 0, 0, 1, 1}, {&__pyx_n_s_int64, __pyx_k_int64, sizeof(__pyx_k_int64), 0, 0, 1, 1}, {&__pyx_n_s_is_periodic, __pyx_k_is_periodic, sizeof(__pyx_k_is_periodic), 0, 0, 1, 1}, + {&__pyx_n_s_isfile, __pyx_k_isfile, sizeof(__pyx_k_isfile), 0, 0, 1, 1}, {&__pyx_n_s_istart, __pyx_k_istart, sizeof(__pyx_k_istart), 0, 0, 1, 1}, {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, @@ -28034,9 +28094,9 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_StopIteration = __Pyx_GetBuiltinName(__pyx_n_s_StopIteration); if (!__pyx_builtin_StopIteration) __PYX_ERR(0, 245, __pyx_L1_error) __pyx_builtin_IOError = __Pyx_GetBuiltinName(__pyx_n_s_IOError); if (!__pyx_builtin_IOError) __PYX_ERR(0, 250, __pyx_L1_error) - __pyx_builtin_EOFError = __Pyx_GetBuiltinName(__pyx_n_s_EOFError); if (!__pyx_builtin_EOFError) __PYX_ERR(0, 407, __pyx_L1_error) - __pyx_builtin_UnicodeDecodeError = __Pyx_GetBuiltinName(__pyx_n_s_UnicodeDecodeError); if (!__pyx_builtin_UnicodeDecodeError) __PYX_ERR(0, 500, __pyx_L1_error) - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 529, __pyx_L1_error) + __pyx_builtin_EOFError = __Pyx_GetBuiltinName(__pyx_n_s_EOFError); if (!__pyx_builtin_EOFError) __PYX_ERR(0, 409, __pyx_L1_error) + __pyx_builtin_UnicodeDecodeError = __Pyx_GetBuiltinName(__pyx_n_s_UnicodeDecodeError); if (!__pyx_builtin_UnicodeDecodeError) __PYX_ERR(0, 502, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 531, __pyx_L1_error) __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(1, 242, __pyx_L1_error) __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 810, __pyx_L1_error) __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 1000, __pyx_L1_error) @@ -28077,475 +28137,486 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "MDAnalysis/lib/formats/libdcd.pyx":335 + /* "MDAnalysis/lib/formats/libdcd.pyx":296 + * if mode == 'r': + * if not path.isfile(self.fname): + * raise IOError("DCD file does not exist") # <<<<<<<<<<<<<< + * fio_mode = FIO_READ + * elif mode == 'w': + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_DCD_file_does_not_exist); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "MDAnalysis/lib/formats/libdcd.pyx":337 * """read header and populate internal fields""" * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * * cdef char* c_remarks */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 335, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__3); - __Pyx_GIVEREF(__pyx_tuple__3); + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 337, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); - /* "MDAnalysis/lib/formats/libdcd.pyx":365 + /* "MDAnalysis/lib/formats/libdcd.pyx":367 * try: * self.read() * self.seek(0) # <<<<<<<<<<<<<< * except IOError: * if self.n_frames != 0: */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 365, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__5); - __Pyx_GIVEREF(__pyx_tuple__5); + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 367, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); - /* "MDAnalysis/lib/formats/libdcd.pyx":368 + /* "MDAnalysis/lib/formats/libdcd.pyx":370 * except IOError: * if self.n_frames != 0: * raise IOError("DCD is corrupted") # <<<<<<<<<<<<<< * * if sys.version_info[0] < 3: */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_DCD_is_corrupted); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 368, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__6); - __Pyx_GIVEREF(__pyx_tuple__6); + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_DCD_is_corrupted); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 370, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); - /* "MDAnalysis/lib/formats/libdcd.pyx":372 + /* "MDAnalysis/lib/formats/libdcd.pyx":374 * if sys.version_info[0] < 3: * py_remarks = unicode(py_remarks, 'ascii', "ignore") * py_remarks = str(py_remarks.encode('ascii', 'ignore')) # <<<<<<<<<<<<<< * else: * if isinstance(py_remarks, bytes): */ - __pyx_tuple__7 = PyTuple_Pack(2, __pyx_n_s_ascii, __pyx_n_s_ignore); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 372, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__7); - __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_tuple__8 = PyTuple_Pack(2, __pyx_n_s_ascii, __pyx_n_s_ignore); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 374, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); - /* "MDAnalysis/lib/formats/libdcd.pyx":375 + /* "MDAnalysis/lib/formats/libdcd.pyx":377 * else: * if isinstance(py_remarks, bytes): * py_remarks = py_remarks.decode('ascii', 'ignore') # <<<<<<<<<<<<<< * * py_remarks = "".join(s for s in py_remarks if s in string.printable) */ - __pyx_tuple__8 = PyTuple_Pack(2, __pyx_n_s_ascii, __pyx_n_s_ignore); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 375, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__8); - __Pyx_GIVEREF(__pyx_tuple__8); + __pyx_tuple__9 = PyTuple_Pack(2, __pyx_n_s_ascii, __pyx_n_s_ignore); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 377, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); - /* "MDAnalysis/lib/formats/libdcd.pyx":407 + /* "MDAnalysis/lib/formats/libdcd.pyx":409 * """ * if frame >= self.n_frames: * raise EOFError('Trying to seek over max number of frames') # <<<<<<<<<<<<<< * self.reached_eof = False * */ - __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_Trying_to_seek_over_max_number_o); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__9); - __Pyx_GIVEREF(__pyx_tuple__9); + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Trying_to_seek_over_max_number_o); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 409, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); - /* "MDAnalysis/lib/formats/libdcd.pyx":486 + /* "MDAnalysis/lib/formats/libdcd.pyx":488 * """ * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if not self.mode=='w': * raise IOError("Incorrect file mode for writing.") */ - __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 486, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__10); - __Pyx_GIVEREF(__pyx_tuple__10); + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 488, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); - /* "MDAnalysis/lib/formats/libdcd.pyx":488 + /* "MDAnalysis/lib/formats/libdcd.pyx":490 * raise IOError("No file open") * if not self.mode=='w': * raise IOError("Incorrect file mode for writing.") # <<<<<<<<<<<<<< * if self.wrote_header: * raise IOError("Header already written") */ - __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_Incorrect_file_mode_for_writing); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 488, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__11); - __Pyx_GIVEREF(__pyx_tuple__11); + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Incorrect_file_mode_for_writing); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 490, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); - /* "MDAnalysis/lib/formats/libdcd.pyx":490 + /* "MDAnalysis/lib/formats/libdcd.pyx":492 * raise IOError("Incorrect file mode for writing.") * if self.wrote_header: * raise IOError("Header already written") # <<<<<<<<<<<<<< * * cdef int with_unitcell = is_periodic */ - __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Header_already_written); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 490, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__12); - __Pyx_GIVEREF(__pyx_tuple__12); + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_Header_already_written); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 492, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); - /* "MDAnalysis/lib/formats/libdcd.pyx":523 + /* "MDAnalysis/lib/formats/libdcd.pyx":525 * """ * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if self.mode != 'w': * raise IOError('File opened in mode: {}. Writing only allowed ' */ - __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 523, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__13); - __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 525, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); - /* "MDAnalysis/lib/formats/libdcd.pyx":526 + /* "MDAnalysis/lib/formats/libdcd.pyx":528 * if self.mode != 'w': * raise IOError('File opened in mode: {}. Writing only allowed ' * 'in mode "w"'.format('self.mode')) # <<<<<<<<<<<<<< * if (self.charmm & DCD_HAS_EXTRA_BLOCK): * if len(box) != 6: */ - __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_self_mode); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 526, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__14); - __Pyx_GIVEREF(__pyx_tuple__14); + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_self_mode); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 528, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); - /* "MDAnalysis/lib/formats/libdcd.pyx":532 + /* "MDAnalysis/lib/formats/libdcd.pyx":534 * else: * # use a dummy box. It won't be written anyway in readdcd. * box = np.zeros(6) # <<<<<<<<<<<<<< * * if not self.wrote_header: */ - __pyx_tuple__15 = PyTuple_Pack(1, __pyx_int_6); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 532, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__15); - __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_int_6); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 534, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); - /* "MDAnalysis/lib/formats/libdcd.pyx":535 + /* "MDAnalysis/lib/formats/libdcd.pyx":537 * * if not self.wrote_header: * raise IOError("write header first before frames can be written") # <<<<<<<<<<<<<< * xyz = np.asarray(xyz, order='F', dtype=FLOAT) * if xyz.shape != (self.natoms, 3): */ - __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_write_header_first_before_frames); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 535, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__16); - __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_write_header_first_before_frames); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 537, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); - /* "MDAnalysis/lib/formats/libdcd.pyx":541 + /* "MDAnalysis/lib/formats/libdcd.pyx":543 * * cdef DOUBLE_T[::1] c_box = np.asarray(box, order='C', dtype=DOUBLE) * cdef FLOAT_T[::1] x = xyz[:, 0] # <<<<<<<<<<<<<< * cdef FLOAT_T[::1] y = xyz[:, 1] * cdef FLOAT_T[::1] z = xyz[:, 2] */ - __pyx_slice__17 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__17)) __PYX_ERR(0, 541, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__17); - __Pyx_GIVEREF(__pyx_slice__17); - __pyx_tuple__18 = PyTuple_Pack(2, __pyx_slice__17, __pyx_int_0); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 541, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__18); - __Pyx_GIVEREF(__pyx_tuple__18); + __pyx_slice__18 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__18)) __PYX_ERR(0, 543, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__18); + __Pyx_GIVEREF(__pyx_slice__18); + __pyx_tuple__19 = PyTuple_Pack(2, __pyx_slice__18, __pyx_int_0); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(0, 543, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); - /* "MDAnalysis/lib/formats/libdcd.pyx":542 + /* "MDAnalysis/lib/formats/libdcd.pyx":544 * cdef DOUBLE_T[::1] c_box = np.asarray(box, order='C', dtype=DOUBLE) * cdef FLOAT_T[::1] x = xyz[:, 0] * cdef FLOAT_T[::1] y = xyz[:, 1] # <<<<<<<<<<<<<< * cdef FLOAT_T[::1] z = xyz[:, 2] * */ - __pyx_slice__19 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__19)) __PYX_ERR(0, 542, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__19); - __Pyx_GIVEREF(__pyx_slice__19); - __pyx_tuple__20 = PyTuple_Pack(2, __pyx_slice__19, __pyx_int_1); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 542, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__20); - __Pyx_GIVEREF(__pyx_tuple__20); + __pyx_slice__20 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__20)) __PYX_ERR(0, 544, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__20); + __Pyx_GIVEREF(__pyx_slice__20); + __pyx_tuple__21 = PyTuple_Pack(2, __pyx_slice__20, __pyx_int_1); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 544, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); - /* "MDAnalysis/lib/formats/libdcd.pyx":543 + /* "MDAnalysis/lib/formats/libdcd.pyx":545 * cdef FLOAT_T[::1] x = xyz[:, 0] * cdef FLOAT_T[::1] y = xyz[:, 1] * cdef FLOAT_T[::1] z = xyz[:, 2] # <<<<<<<<<<<<<< * * step = self.istart + self.current_frame * self.nsavc */ - __pyx_slice__21 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__21)) __PYX_ERR(0, 543, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__21); - __Pyx_GIVEREF(__pyx_slice__21); - __pyx_tuple__22 = PyTuple_Pack(2, __pyx_slice__21, __pyx_int_2); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 543, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__22); - __Pyx_GIVEREF(__pyx_tuple__22); + __pyx_slice__22 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__22)) __PYX_ERR(0, 545, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__22); + __Pyx_GIVEREF(__pyx_slice__22); + __pyx_tuple__23 = PyTuple_Pack(2, __pyx_slice__22, __pyx_int_2); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 545, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); - /* "MDAnalysis/lib/formats/libdcd.pyx":572 + /* "MDAnalysis/lib/formats/libdcd.pyx":574 * """ * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') # <<<<<<<<<<<<<< * if not self.is_open: * raise IOError("No file open") */ - __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_Reached_last_frame_in_DCD_seek_t); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__23); - __Pyx_GIVEREF(__pyx_tuple__23); + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_Reached_last_frame_in_DCD_seek_t); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); - /* "MDAnalysis/lib/formats/libdcd.pyx":574 + /* "MDAnalysis/lib/formats/libdcd.pyx":576 * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' */ - __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 574, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__24); - __Pyx_GIVEREF(__pyx_tuple__24); + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 576, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); - /* "MDAnalysis/lib/formats/libdcd.pyx":577 + /* "MDAnalysis/lib/formats/libdcd.pyx":579 * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) # <<<<<<<<<<<<<< * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") */ - __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_self_mode); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 577, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__25); - __Pyx_GIVEREF(__pyx_tuple__25); + __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_self_mode); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 579, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); - /* "MDAnalysis/lib/formats/libdcd.pyx":579 + /* "MDAnalysis/lib/formats/libdcd.pyx":581 * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") # <<<<<<<<<<<<<< * * cdef np.ndarray xyz = np.empty((self.natoms, self.ndims), dtype=FLOAT, order='F') */ - __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_opened_empty_file_No_frames_are); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 579, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__26); - __Pyx_GIVEREF(__pyx_tuple__26); + __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_opened_empty_file_No_frames_are); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 581, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); - /* "MDAnalysis/lib/formats/libdcd.pyx":582 + /* "MDAnalysis/lib/formats/libdcd.pyx":584 * * cdef np.ndarray xyz = np.empty((self.natoms, self.ndims), dtype=FLOAT, order='F') * cdef np.ndarray unitcell = np.empty(6, dtype=DOUBLE) # <<<<<<<<<<<<<< * unitcell[0] = unitcell[2] = unitcell[5] = 0.0; * unitcell[4] = unitcell[3] = unitcell[1] = 90.0; */ - __pyx_tuple__27 = PyTuple_Pack(1, __pyx_int_6); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 582, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__27); - __Pyx_GIVEREF(__pyx_tuple__27); + __pyx_tuple__28 = PyTuple_Pack(1, __pyx_int_6); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 584, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); - /* "MDAnalysis/lib/formats/libdcd.pyx":587 + /* "MDAnalysis/lib/formats/libdcd.pyx":589 * * first_frame = self.current_frame == 0 * ok = self.c_readframes_helper(xyz[:, 0], xyz[:, 1], xyz[:, 2], unitcell, first_frame) # <<<<<<<<<<<<<< * if ok != 0 and ok != -4: * raise IOError("Reading DCD header failed: {}".format(DCD_ERRORS[ok])) */ - __pyx_slice__28 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__28)) __PYX_ERR(0, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__28); - __Pyx_GIVEREF(__pyx_slice__28); - __pyx_tuple__29 = PyTuple_Pack(2, __pyx_slice__28, __pyx_int_0); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__29); - __Pyx_GIVEREF(__pyx_tuple__29); - __pyx_slice__30 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__30)) __PYX_ERR(0, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__30); - __Pyx_GIVEREF(__pyx_slice__30); - __pyx_tuple__31 = PyTuple_Pack(2, __pyx_slice__30, __pyx_int_1); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__31); - __Pyx_GIVEREF(__pyx_tuple__31); - __pyx_slice__32 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__32)) __PYX_ERR(0, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__32); - __Pyx_GIVEREF(__pyx_slice__32); - __pyx_tuple__33 = PyTuple_Pack(2, __pyx_slice__32, __pyx_int_2); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 587, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__33); - __Pyx_GIVEREF(__pyx_tuple__33); - - /* "MDAnalysis/lib/formats/libdcd.pyx":632 + __pyx_slice__29 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__29)) __PYX_ERR(0, 589, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__29); + __Pyx_GIVEREF(__pyx_slice__29); + __pyx_tuple__30 = PyTuple_Pack(2, __pyx_slice__29, __pyx_int_0); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 589, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + __pyx_slice__31 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__31)) __PYX_ERR(0, 589, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__31); + __Pyx_GIVEREF(__pyx_slice__31); + __pyx_tuple__32 = PyTuple_Pack(2, __pyx_slice__31, __pyx_int_1); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 589, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__32); + __Pyx_GIVEREF(__pyx_tuple__32); + __pyx_slice__33 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__33)) __PYX_ERR(0, 589, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__33); + __Pyx_GIVEREF(__pyx_slice__33); + __pyx_tuple__34 = PyTuple_Pack(2, __pyx_slice__33, __pyx_int_2); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 589, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__34); + __Pyx_GIVEREF(__pyx_tuple__34); + + /* "MDAnalysis/lib/formats/libdcd.pyx":634 * """ * if self.reached_eof: * raise EOFError('Reached last frame in DCD, seek to 0') # <<<<<<<<<<<<<< * if not self.is_open: * raise IOError("No file open") */ - __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s_Reached_last_frame_in_DCD_seek_t); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 632, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__34); - __Pyx_GIVEREF(__pyx_tuple__34); + __pyx_tuple__35 = PyTuple_Pack(1, __pyx_kp_s_Reached_last_frame_in_DCD_seek_t); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 634, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__35); + __Pyx_GIVEREF(__pyx_tuple__35); - /* "MDAnalysis/lib/formats/libdcd.pyx":634 + /* "MDAnalysis/lib/formats/libdcd.pyx":636 * raise EOFError('Reached last frame in DCD, seek to 0') * if not self.is_open: * raise IOError("No file open") # <<<<<<<<<<<<<< * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' */ - __pyx_tuple__35 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 634, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__35); - __Pyx_GIVEREF(__pyx_tuple__35); + __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s_No_file_open); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 636, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__36); + __Pyx_GIVEREF(__pyx_tuple__36); - /* "MDAnalysis/lib/formats/libdcd.pyx":637 + /* "MDAnalysis/lib/formats/libdcd.pyx":639 * if self.mode != 'r': * raise IOError('File opened in mode: {}. Reading only allow ' * 'in mode "r"'.format('self.mode')) # <<<<<<<<<<<<<< * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") */ - __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s_self_mode); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 637, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__36); - __Pyx_GIVEREF(__pyx_tuple__36); + __pyx_tuple__37 = PyTuple_Pack(1, __pyx_kp_s_self_mode); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 639, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__37); + __Pyx_GIVEREF(__pyx_tuple__37); - /* "MDAnalysis/lib/formats/libdcd.pyx":639 + /* "MDAnalysis/lib/formats/libdcd.pyx":641 * 'in mode "r"'.format('self.mode')) * if self.n_frames == 0: * raise IOError("opened empty file. No frames are saved") # <<<<<<<<<<<<<< * * self.seek(0) */ - __pyx_tuple__37 = PyTuple_Pack(1, __pyx_kp_s_opened_empty_file_No_frames_are); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 639, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__37); - __Pyx_GIVEREF(__pyx_tuple__37); + __pyx_tuple__38 = PyTuple_Pack(1, __pyx_kp_s_opened_empty_file_No_frames_are); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 641, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); - /* "MDAnalysis/lib/formats/libdcd.pyx":641 + /* "MDAnalysis/lib/formats/libdcd.pyx":643 * raise IOError("opened empty file. No frames are saved") * * self.seek(0) # <<<<<<<<<<<<<< * # if we only want to iterate backwards flip start and end * if start is None and stop is None and step is not None and step < 0: */ - __pyx_tuple__38 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 641, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__38); - __Pyx_GIVEREF(__pyx_tuple__38); + __pyx_tuple__39 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 643, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__39); + __Pyx_GIVEREF(__pyx_tuple__39); - /* "MDAnalysis/lib/formats/libdcd.pyx":693 + /* "MDAnalysis/lib/formats/libdcd.pyx":695 * if start == 0 and step == 1 and stop == self.n_frames: * for i in range(n): * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[i], i==0) # <<<<<<<<<<<<<< * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) */ - __pyx_slice__39 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__39)) __PYX_ERR(0, 693, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__39); - __Pyx_GIVEREF(__pyx_slice__39); - __pyx_tuple__40 = PyTuple_Pack(2, __pyx_slice__39, __pyx_int_0); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 693, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__40); - __Pyx_GIVEREF(__pyx_tuple__40); - __pyx_slice__41 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__41)) __PYX_ERR(0, 693, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__41); - __Pyx_GIVEREF(__pyx_slice__41); - __pyx_tuple__42 = PyTuple_Pack(2, __pyx_slice__41, __pyx_int_1); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 693, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__42); - __Pyx_GIVEREF(__pyx_tuple__42); - __pyx_slice__43 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__43)) __PYX_ERR(0, 693, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__43); - __Pyx_GIVEREF(__pyx_slice__43); - __pyx_tuple__44 = PyTuple_Pack(2, __pyx_slice__43, __pyx_int_2); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(0, 693, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__44); - __Pyx_GIVEREF(__pyx_tuple__44); - - /* "MDAnalysis/lib/formats/libdcd.pyx":701 + __pyx_slice__40 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__40)) __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__40); + __Pyx_GIVEREF(__pyx_slice__40); + __pyx_tuple__41 = PyTuple_Pack(2, __pyx_slice__40, __pyx_int_0); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__41); + __Pyx_GIVEREF(__pyx_tuple__41); + __pyx_slice__42 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__42)) __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__42); + __Pyx_GIVEREF(__pyx_slice__42); + __pyx_tuple__43 = PyTuple_Pack(2, __pyx_slice__42, __pyx_int_1); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__43); + __Pyx_GIVEREF(__pyx_tuple__43); + __pyx_slice__44 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__44)) __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__44); + __Pyx_GIVEREF(__pyx_slice__44); + __pyx_tuple__45 = PyTuple_Pack(2, __pyx_slice__44, __pyx_int_2); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(0, 695, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__45); + __Pyx_GIVEREF(__pyx_tuple__45); + + /* "MDAnalysis/lib/formats/libdcd.pyx":703 * for i in range(start, stop, step): * self.seek(i) * ok = self.c_readframes_helper(xyz_tmp[:, 0], xyz_tmp[:, 1], xyz_tmp[:, 2], box[counter], i==0) # <<<<<<<<<<<<<< * if ok != 0 and ok != -4: * raise IOError("Reading DCD frames failed: {}".format(DCD_ERRORS[ok])) */ - __pyx_slice__45 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__45)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__45); - __Pyx_GIVEREF(__pyx_slice__45); - __pyx_tuple__46 = PyTuple_Pack(2, __pyx_slice__45, __pyx_int_0); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__46); - __Pyx_GIVEREF(__pyx_tuple__46); - __pyx_slice__47 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__47)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__47); - __Pyx_GIVEREF(__pyx_slice__47); - __pyx_tuple__48 = PyTuple_Pack(2, __pyx_slice__47, __pyx_int_1); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__48); - __Pyx_GIVEREF(__pyx_tuple__48); - __pyx_slice__49 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__49)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__49); - __Pyx_GIVEREF(__pyx_slice__49); - __pyx_tuple__50 = PyTuple_Pack(2, __pyx_slice__49, __pyx_int_2); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(0, 701, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__50); - __Pyx_GIVEREF(__pyx_tuple__50); - - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + __pyx_slice__46 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__46)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__46); + __Pyx_GIVEREF(__pyx_slice__46); + __pyx_tuple__47 = PyTuple_Pack(2, __pyx_slice__46, __pyx_int_0); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__47); + __Pyx_GIVEREF(__pyx_tuple__47); + __pyx_slice__48 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__48)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__48); + __Pyx_GIVEREF(__pyx_slice__48); + __pyx_tuple__49 = PyTuple_Pack(2, __pyx_slice__48, __pyx_int_1); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__49); + __Pyx_GIVEREF(__pyx_tuple__49); + __pyx_slice__50 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__50)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__50); + __Pyx_GIVEREF(__pyx_slice__50); + __pyx_tuple__51 = PyTuple_Pack(2, __pyx_slice__50, __pyx_int_2); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(0, 703, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__51); + __Pyx_GIVEREF(__pyx_tuple__51); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ - __pyx_tuple__51 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(1, 229, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__51); - __Pyx_GIVEREF(__pyx_tuple__51); + __pyx_tuple__52 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__52)) __PYX_ERR(1, 229, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__52); + __Pyx_GIVEREF(__pyx_tuple__52); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ - __pyx_tuple__52 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__52)) __PYX_ERR(1, 233, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__52); - __Pyx_GIVEREF(__pyx_tuple__52); + __pyx_tuple__53 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(1, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__53); + __Pyx_GIVEREF(__pyx_tuple__53); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ - __pyx_tuple__53 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(1, 263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__53); - __Pyx_GIVEREF(__pyx_tuple__53); + __pyx_tuple__54 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__54)) __PYX_ERR(1, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__54); + __Pyx_GIVEREF(__pyx_tuple__54); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ - __pyx_tuple__54 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__54)) __PYX_ERR(1, 810, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__54); - __Pyx_GIVEREF(__pyx_tuple__54); + __pyx_tuple__55 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__55)) __PYX_ERR(1, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__55); + __Pyx_GIVEREF(__pyx_tuple__55); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ - __pyx_tuple__55 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__55)) __PYX_ERR(1, 814, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__55); - __Pyx_GIVEREF(__pyx_tuple__55); + __pyx_tuple__56 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__56)) __PYX_ERR(1, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__56); + __Pyx_GIVEREF(__pyx_tuple__56); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ - __pyx_tuple__56 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__56)) __PYX_ERR(1, 834, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__56); - __Pyx_GIVEREF(__pyx_tuple__56); + __pyx_tuple__57 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__57)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__57); + __Pyx_GIVEREF(__pyx_tuple__57); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ - __pyx_tuple__57 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__57)) __PYX_ERR(1, 1000, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__57); - __Pyx_GIVEREF(__pyx_tuple__57); + __pyx_tuple__58 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__58)) __PYX_ERR(1, 1000, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__58); + __Pyx_GIVEREF(__pyx_tuple__58); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ - __pyx_tuple__58 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__58)) __PYX_ERR(1, 1006, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__58); - __Pyx_GIVEREF(__pyx_tuple__58); + __pyx_tuple__59 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__59)) __PYX_ERR(1, 1006, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__59); + __Pyx_GIVEREF(__pyx_tuple__59); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< */ - __pyx_tuple__59 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__59)) __PYX_ERR(1, 1012, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__59); - __Pyx_GIVEREF(__pyx_tuple__59); + __pyx_tuple__60 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__60)) __PYX_ERR(1, 1012, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__60); + __Pyx_GIVEREF(__pyx_tuple__60); /* "View.MemoryView":132 * @@ -28554,9 +28625,9 @@ static int __Pyx_InitCachedConstants(void) { * * if itemsize <= 0: */ - __pyx_tuple__60 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__60)) __PYX_ERR(2, 132, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__60); - __Pyx_GIVEREF(__pyx_tuple__60); + __pyx_tuple__61 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__61)) __PYX_ERR(2, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__61); + __Pyx_GIVEREF(__pyx_tuple__61); /* "View.MemoryView":135 * @@ -28565,9 +28636,9 @@ static int __Pyx_InitCachedConstants(void) { * * if not isinstance(format, bytes): */ - __pyx_tuple__61 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__61)) __PYX_ERR(2, 135, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__61); - __Pyx_GIVEREF(__pyx_tuple__61); + __pyx_tuple__62 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__62)) __PYX_ERR(2, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__62); + __Pyx_GIVEREF(__pyx_tuple__62); /* "View.MemoryView":138 * @@ -28576,9 +28647,9 @@ static int __Pyx_InitCachedConstants(void) { * self._format = format # keep a reference to the byte string * self.format = self._format */ - __pyx_tuple__62 = PyTuple_Pack(1, __pyx_n_s_ASCII); if (unlikely(!__pyx_tuple__62)) __PYX_ERR(2, 138, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__62); - __Pyx_GIVEREF(__pyx_tuple__62); + __pyx_tuple__63 = PyTuple_Pack(1, __pyx_n_s_ASCII); if (unlikely(!__pyx_tuple__63)) __PYX_ERR(2, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__63); + __Pyx_GIVEREF(__pyx_tuple__63); /* "View.MemoryView":147 * @@ -28587,9 +28658,9 @@ static int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__63 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__63)) __PYX_ERR(2, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__63); - __Pyx_GIVEREF(__pyx_tuple__63); + __pyx_tuple__64 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__64)) __PYX_ERR(2, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__64); + __Pyx_GIVEREF(__pyx_tuple__64); /* "View.MemoryView":175 * self.data = malloc(self.len) @@ -28598,9 +28669,9 @@ static int __Pyx_InitCachedConstants(void) { * * if self.dtype_is_object: */ - __pyx_tuple__64 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__64)) __PYX_ERR(2, 175, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__64); - __Pyx_GIVEREF(__pyx_tuple__64); + __pyx_tuple__65 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__65)) __PYX_ERR(2, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__65); + __Pyx_GIVEREF(__pyx_tuple__65); /* "View.MemoryView":191 * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS @@ -28609,9 +28680,9 @@ static int __Pyx_InitCachedConstants(void) { * info.buf = self.data * info.len = self.len */ - __pyx_tuple__65 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__65)) __PYX_ERR(2, 191, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__65); - __Pyx_GIVEREF(__pyx_tuple__65); + __pyx_tuple__66 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__66)) __PYX_ERR(2, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__66); + __Pyx_GIVEREF(__pyx_tuple__66); /* "(tree fragment)":2 * def __reduce_cython__(self): @@ -28619,18 +28690,18 @@ static int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__66 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__66)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__66); - __Pyx_GIVEREF(__pyx_tuple__66); + __pyx_tuple__67 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__67)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__67); + __Pyx_GIVEREF(__pyx_tuple__67); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__67 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__67)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__67); - __Pyx_GIVEREF(__pyx_tuple__67); + __pyx_tuple__68 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__68)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__68); + __Pyx_GIVEREF(__pyx_tuple__68); /* "View.MemoryView":413 * def __setitem__(memoryview self, object index, object value): @@ -28639,9 +28710,9 @@ static int __Pyx_InitCachedConstants(void) { * * have_slices, index = _unellipsify(index, self.view.ndim) */ - __pyx_tuple__68 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__68)) __PYX_ERR(2, 413, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__68); - __Pyx_GIVEREF(__pyx_tuple__68); + __pyx_tuple__69 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__69)) __PYX_ERR(2, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__69); + __Pyx_GIVEREF(__pyx_tuple__69); /* "View.MemoryView":490 * result = struct.unpack(self.view.format, bytesitem) @@ -28650,9 +28721,9 @@ static int __Pyx_InitCachedConstants(void) { * else: * if len(self.view.format) == 1: */ - __pyx_tuple__69 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__69)) __PYX_ERR(2, 490, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__69); - __Pyx_GIVEREF(__pyx_tuple__69); + __pyx_tuple__70 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__70)) __PYX_ERR(2, 490, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__70); + __Pyx_GIVEREF(__pyx_tuple__70); /* "View.MemoryView":515 * def __getbuffer__(self, Py_buffer *info, int flags): @@ -28661,9 +28732,9 @@ static int __Pyx_InitCachedConstants(void) { * * if flags & PyBUF_STRIDES: */ - __pyx_tuple__70 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__70)) __PYX_ERR(2, 515, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__70); - __Pyx_GIVEREF(__pyx_tuple__70); + __pyx_tuple__71 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__71)) __PYX_ERR(2, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__71); + __Pyx_GIVEREF(__pyx_tuple__71); /* "View.MemoryView":565 * if self.view.strides == NULL: @@ -28672,9 +28743,9 @@ static int __Pyx_InitCachedConstants(void) { * * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) */ - __pyx_tuple__71 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__71)) __PYX_ERR(2, 565, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__71); - __Pyx_GIVEREF(__pyx_tuple__71); + __pyx_tuple__72 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__72)) __PYX_ERR(2, 565, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__72); + __Pyx_GIVEREF(__pyx_tuple__72); /* "View.MemoryView":572 * def suboffsets(self): @@ -28683,12 +28754,12 @@ static int __Pyx_InitCachedConstants(void) { * * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) */ - __pyx_tuple__72 = PyTuple_New(1); if (unlikely(!__pyx_tuple__72)) __PYX_ERR(2, 572, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__72); + __pyx_tuple__73 = PyTuple_New(1); if (unlikely(!__pyx_tuple__73)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__73); __Pyx_INCREF(__pyx_int_neg_1); __Pyx_GIVEREF(__pyx_int_neg_1); - PyTuple_SET_ITEM(__pyx_tuple__72, 0, __pyx_int_neg_1); - __Pyx_GIVEREF(__pyx_tuple__72); + PyTuple_SET_ITEM(__pyx_tuple__73, 0, __pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_tuple__73); /* "(tree fragment)":2 * def __reduce_cython__(self): @@ -28696,18 +28767,18 @@ static int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__73 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__73)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__73); - __Pyx_GIVEREF(__pyx_tuple__73); + __pyx_tuple__74 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__74)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__74); + __Pyx_GIVEREF(__pyx_tuple__74); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__74 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__74)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__74); - __Pyx_GIVEREF(__pyx_tuple__74); + __pyx_tuple__75 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__75)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__75); + __Pyx_GIVEREF(__pyx_tuple__75); /* "View.MemoryView":677 * if item is Ellipsis: @@ -28716,9 +28787,9 @@ static int __Pyx_InitCachedConstants(void) { * seen_ellipsis = True * else: */ - __pyx_slice__75 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__75)) __PYX_ERR(2, 677, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__75); - __Pyx_GIVEREF(__pyx_slice__75); + __pyx_slice__76 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__76)) __PYX_ERR(2, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__76); + __Pyx_GIVEREF(__pyx_slice__76); /* "View.MemoryView":680 * seen_ellipsis = True @@ -28727,9 +28798,9 @@ static int __Pyx_InitCachedConstants(void) { * have_slices = True * else: */ - __pyx_slice__76 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__76)) __PYX_ERR(2, 680, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__76); - __Pyx_GIVEREF(__pyx_slice__76); + __pyx_slice__77 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__77)) __PYX_ERR(2, 680, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__77); + __Pyx_GIVEREF(__pyx_slice__77); /* "View.MemoryView":691 * nslices = ndim - len(result) @@ -28738,9 +28809,9 @@ static int __Pyx_InitCachedConstants(void) { * * return have_slices or nslices, tuple(result) */ - __pyx_slice__77 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__77)) __PYX_ERR(2, 691, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__77); - __Pyx_GIVEREF(__pyx_slice__77); + __pyx_slice__78 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__78)) __PYX_ERR(2, 691, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__78); + __Pyx_GIVEREF(__pyx_slice__78); /* "View.MemoryView":698 * for suboffset in suboffsets[:ndim]: @@ -28749,9 +28820,9 @@ static int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__78 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__78)) __PYX_ERR(2, 698, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__78); - __Pyx_GIVEREF(__pyx_tuple__78); + __pyx_tuple__79 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__79)) __PYX_ERR(2, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__79); + __Pyx_GIVEREF(__pyx_tuple__79); /* "(tree fragment)":2 * def __reduce_cython__(self): @@ -28759,18 +28830,18 @@ static int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__79 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__79)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__79); - __Pyx_GIVEREF(__pyx_tuple__79); + __pyx_tuple__80 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__80)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__80); + __Pyx_GIVEREF(__pyx_tuple__80); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__80 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__80)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__80); - __Pyx_GIVEREF(__pyx_tuple__80); + __pyx_tuple__81 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__81)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__81); + __Pyx_GIVEREF(__pyx_tuple__81); /* "MDAnalysis/lib/formats/libdcd.pyx":145 * const double *unitcell, int charmm); @@ -28779,9 +28850,9 @@ static int __Pyx_InitCachedConstants(void) { * * cdef class DCDFile: */ - __pyx_tuple__81 = PyTuple_Pack(2, __pyx_n_s_DCDFrame, __pyx_kp_s_xyz_unitcell); if (unlikely(!__pyx_tuple__81)) __PYX_ERR(0, 145, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__81); - __Pyx_GIVEREF(__pyx_tuple__81); + __pyx_tuple__82 = PyTuple_Pack(2, __pyx_n_s_DCDFrame, __pyx_kp_s_xyz_unitcell); if (unlikely(!__pyx_tuple__82)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__82); + __Pyx_GIVEREF(__pyx_tuple__82); /* "View.MemoryView":285 * return self.name @@ -28790,9 +28861,9 @@ static int __Pyx_InitCachedConstants(void) { * cdef strided = Enum("") # default * cdef indirect = Enum("") */ - __pyx_tuple__82 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__82)) __PYX_ERR(2, 285, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__82); - __Pyx_GIVEREF(__pyx_tuple__82); + __pyx_tuple__83 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__83)) __PYX_ERR(2, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__83); + __Pyx_GIVEREF(__pyx_tuple__83); /* "View.MemoryView":286 * @@ -28801,9 +28872,9 @@ static int __Pyx_InitCachedConstants(void) { * cdef indirect = Enum("") * */ - __pyx_tuple__83 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__83)) __PYX_ERR(2, 286, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__83); - __Pyx_GIVEREF(__pyx_tuple__83); + __pyx_tuple__84 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__84)) __PYX_ERR(2, 286, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__84); + __Pyx_GIVEREF(__pyx_tuple__84); /* "View.MemoryView":287 * cdef generic = Enum("") @@ -28812,9 +28883,9 @@ static int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__84 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__84)) __PYX_ERR(2, 287, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__84); - __Pyx_GIVEREF(__pyx_tuple__84); + __pyx_tuple__85 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__85)) __PYX_ERR(2, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__85); + __Pyx_GIVEREF(__pyx_tuple__85); /* "View.MemoryView":290 * @@ -28823,9 +28894,9 @@ static int __Pyx_InitCachedConstants(void) { * cdef indirect_contiguous = Enum("") * */ - __pyx_tuple__85 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__85)) __PYX_ERR(2, 290, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__85); - __Pyx_GIVEREF(__pyx_tuple__85); + __pyx_tuple__86 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__86)) __PYX_ERR(2, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__86); + __Pyx_GIVEREF(__pyx_tuple__86); /* "View.MemoryView":291 * @@ -28834,19 +28905,19 @@ static int __Pyx_InitCachedConstants(void) { * * */ - __pyx_tuple__86 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__86)) __PYX_ERR(2, 291, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__86); - __Pyx_GIVEREF(__pyx_tuple__86); + __pyx_tuple__87 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__87)) __PYX_ERR(2, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__87); + __Pyx_GIVEREF(__pyx_tuple__87); /* "(tree fragment)":1 * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * if __pyx_checksum != 0xb068931: * from pickle import PickleError as __pyx_PickleError */ - __pyx_tuple__87 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__87)) __PYX_ERR(2, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__87); - __Pyx_GIVEREF(__pyx_tuple__87); - __pyx_codeobj__88 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__87, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__88)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_tuple__88 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__88)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__88); + __Pyx_GIVEREF(__pyx_tuple__88); + __pyx_codeobj__89 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__88, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__89)) __PYX_ERR(2, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -28932,13 +29003,13 @@ static int __Pyx_modinit_type_init_code(void) { if (__Pyx_SetVtable(__pyx_type_10MDAnalysis_3lib_7formats_6libdcd_DCDFile.tp_dict, __pyx_vtabptr_10MDAnalysis_3lib_7formats_6libdcd_DCDFile) < 0) __PYX_ERR(0, 147, __pyx_L1_error) if (PyObject_SetAttrString(__pyx_m, "DCDFile", (PyObject *)&__pyx_type_10MDAnalysis_3lib_7formats_6libdcd_DCDFile) < 0) __PYX_ERR(0, 147, __pyx_L1_error) __pyx_ptype_10MDAnalysis_3lib_7formats_6libdcd_DCDFile = &__pyx_type_10MDAnalysis_3lib_7formats_6libdcd_DCDFile; - if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header) < 0) __PYX_ERR(0, 332, __pyx_L1_error) + if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header) < 0) __PYX_ERR(0, 334, __pyx_L1_error) __pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header.tp_print = 0; if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header.tp_dictoffset && __pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; } __pyx_ptype_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header = &__pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct___read_header; - if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct_1_genexpr) < 0) __PYX_ERR(0, 377, __pyx_L1_error) + if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct_1_genexpr) < 0) __PYX_ERR(0, 379, __pyx_L1_error) __pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct_1_genexpr.tp_print = 0; if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct_1_genexpr.tp_dictoffset && __pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct_1_genexpr.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_10MDAnalysis_3lib_7formats_6libdcd___pyx_scope_struct_1_genexpr.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; @@ -29050,8 +29121,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -29446,7 +29517,7 @@ if (!__Pyx_RefNanny) { */ __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_namedtuple); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 145, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__81, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__82, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (PyDict_SetItem(__pyx_d, __pyx_n_s_DCDFrame, __pyx_t_1) < 0) __PYX_ERR(0, 145, __pyx_L1_error) @@ -29482,7 +29553,7 @@ if (!__Pyx_RefNanny) { * cdef strided = Enum("") # default * cdef indirect = Enum("") */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__82, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 285, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__83, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 285, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(generic); __Pyx_DECREF_SET(generic, __pyx_t_1); @@ -29496,7 +29567,7 @@ if (!__Pyx_RefNanny) { * cdef indirect = Enum("") * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__83, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 286, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__84, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 286, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(strided); __Pyx_DECREF_SET(strided, __pyx_t_1); @@ -29510,7 +29581,7 @@ if (!__Pyx_RefNanny) { * * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__84, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 287, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__85, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 287, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(indirect); __Pyx_DECREF_SET(indirect, __pyx_t_1); @@ -29524,7 +29595,7 @@ if (!__Pyx_RefNanny) { * cdef indirect_contiguous = Enum("") * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__85, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 290, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__86, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 290, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(contiguous); __Pyx_DECREF_SET(contiguous, __pyx_t_1); @@ -29538,7 +29609,7 @@ if (!__Pyx_RefNanny) { * * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__86, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 291, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__87, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 291, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(indirect_contiguous); __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_1); @@ -30511,6 +30582,9 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); @@ -30565,7 +30639,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -30580,7 +30654,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -30664,7 +30738,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -31969,7 +32043,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -32120,14 +32194,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i #ifndef offsetof @@ -504,6 +504,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -709,7 +710,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -817,7 +818,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -964,7 +965,7 @@ typedef struct { } __Pyx_BufFmt_Context; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -973,7 +974,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -982,7 +983,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -991,7 +992,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -1000,7 +1001,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -1009,7 +1010,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -1018,7 +1019,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -1027,7 +1028,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -1036,7 +1037,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -1045,7 +1046,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -1054,7 +1055,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -1063,7 +1064,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -1072,7 +1073,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -1081,7 +1082,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -1090,7 +1091,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -1099,7 +1100,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1108,7 +1109,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1117,7 +1118,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1126,7 +1127,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1135,7 +1136,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1144,7 +1145,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1195,7 +1196,7 @@ struct __pyx_MemviewEnum_obj; struct __pyx_memoryview_obj; struct __pyx_memoryviewslice_obj; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1204,7 +1205,7 @@ struct __pyx_memoryviewslice_obj; */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1213,7 +1214,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1222,7 +1223,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -10793,7 +10794,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_7formats_9libmdaxdr_7XTCFile_6write( return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -10841,7 +10842,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -10850,7 +10851,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -10859,7 +10860,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -10868,7 +10869,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -10882,7 +10883,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -10893,7 +10894,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -10902,7 +10903,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -10915,7 +10916,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -10924,7 +10925,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -10938,7 +10939,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -10949,7 +10950,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -10958,7 +10959,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -10971,7 +10972,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -10980,7 +10981,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -10989,7 +10990,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -10998,7 +10999,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -11008,7 +11009,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -11017,7 +11018,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -11026,7 +11027,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -11038,7 +11039,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -11047,7 +11048,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -11057,7 +11058,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -11067,7 +11068,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -11077,7 +11078,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -11088,7 +11089,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -11097,7 +11098,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -11106,7 +11107,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -11115,7 +11116,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -11124,7 +11125,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -11136,7 +11137,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -11149,7 +11150,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -11159,7 +11160,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -11169,7 +11170,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -11189,7 +11190,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -11206,7 +11207,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -11215,7 +11216,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -11228,7 +11229,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -11237,7 +11238,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -11249,7 +11250,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -11260,7 +11261,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -11271,7 +11272,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -11282,7 +11283,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -11293,7 +11294,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -11304,7 +11305,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -11315,7 +11316,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -11326,7 +11327,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -11337,7 +11338,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -11348,7 +11349,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -11359,7 +11360,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -11370,7 +11371,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -11381,7 +11382,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -11392,7 +11393,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -11403,7 +11404,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -11414,7 +11415,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -11426,7 +11427,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -11447,7 +11448,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -11456,7 +11457,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -11466,7 +11467,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -11475,7 +11476,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -11485,7 +11486,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -11494,7 +11495,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -11503,7 +11504,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -11513,7 +11514,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -11523,7 +11524,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -11555,7 +11556,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -11579,7 +11580,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -11589,7 +11590,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -11598,7 +11599,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -11607,7 +11608,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -11617,7 +11618,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -11626,7 +11627,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -11635,7 +11636,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -11647,7 +11648,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -11661,7 +11662,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -11675,7 +11676,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -11694,7 +11695,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -11708,7 +11709,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -11722,7 +11723,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -11741,7 +11742,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -11755,7 +11756,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -11769,7 +11770,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -11788,7 +11789,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -11802,7 +11803,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -11816,7 +11817,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -11835,7 +11836,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -11849,7 +11850,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -11863,7 +11864,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -11882,7 +11883,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -11896,7 +11897,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -11906,7 +11907,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -11918,7 +11919,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -11927,7 +11928,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -11941,7 +11942,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -11956,7 +11957,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -11985,7 +11986,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -11994,7 +11995,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -12003,7 +12004,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -12026,7 +12027,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -12043,7 +12044,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -12078,7 +12079,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -12095,7 +12096,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -12108,7 +12109,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -12117,7 +12118,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -12137,7 +12138,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -12154,7 +12155,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -12163,7 +12164,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -12176,7 +12177,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -12185,7 +12186,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -12201,7 +12202,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -12210,7 +12211,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -12219,7 +12220,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -12230,7 +12231,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -12240,7 +12241,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -12250,7 +12251,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -12262,7 +12263,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -12272,7 +12273,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -12285,7 +12286,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -12294,7 +12295,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -12312,7 +12313,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -12330,7 +12331,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -12348,7 +12349,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -12366,7 +12367,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -12384,7 +12385,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -12402,7 +12403,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -12420,7 +12421,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -12438,7 +12439,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -12456,7 +12457,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -12474,7 +12475,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -12492,7 +12493,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -12510,7 +12511,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -12528,7 +12529,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -12548,7 +12549,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -12568,7 +12569,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -12588,7 +12589,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -12606,7 +12607,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -12625,7 +12626,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -12634,7 +12635,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -12644,7 +12645,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -12657,7 +12658,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -12667,7 +12668,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -12677,7 +12678,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -12702,7 +12703,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -12717,7 +12718,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -12728,7 +12729,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -12737,7 +12738,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -12747,7 +12748,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -12757,7 +12758,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -12768,7 +12769,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -12777,7 +12778,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -12786,7 +12787,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -12798,7 +12799,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -12812,7 +12813,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -12822,7 +12823,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -12833,7 +12834,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -12842,7 +12843,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -12856,7 +12857,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -12871,7 +12872,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -12892,7 +12893,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -12908,7 +12909,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -12917,7 +12918,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -12931,7 +12932,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -12946,7 +12947,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -12962,7 +12963,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -12977,7 +12978,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -13000,7 +13001,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -13021,7 +13022,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -13037,7 +13038,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -13046,7 +13047,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -13060,7 +13061,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -13075,7 +13076,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -13091,7 +13092,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -13106,7 +13107,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -13129,7 +13130,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -13150,7 +13151,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -13166,7 +13167,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -13175,7 +13176,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -13189,7 +13190,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -13203,7 +13204,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -13217,7 +13218,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -13232,7 +13233,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -27580,7 +27581,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__12); __Pyx_GIVEREF(__pyx_tuple__12); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -27591,7 +27592,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -27602,7 +27603,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__14); __Pyx_GIVEREF(__pyx_tuple__14); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -27613,7 +27614,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__15); __Pyx_GIVEREF(__pyx_tuple__15); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -27624,7 +27625,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__16); __Pyx_GIVEREF(__pyx_tuple__16); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -27635,7 +27636,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__17); __Pyx_GIVEREF(__pyx_tuple__17); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -27646,7 +27647,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__18); __Pyx_GIVEREF(__pyx_tuple__18); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -27657,7 +27658,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__19); __Pyx_GIVEREF(__pyx_tuple__19); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -27668,7 +27669,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__20); __Pyx_GIVEREF(__pyx_tuple__20); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -28194,8 +28195,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -29658,6 +29659,9 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); @@ -29873,7 +29877,7 @@ static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -29888,7 +29892,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -29972,7 +29976,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -30363,7 +30367,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -30514,14 +30518,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (0 && PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef __cplusplus + #error "Cython files generated with the C++ option must be compiled with a C++ compiler." +#endif +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #else + #define CYTHON_INLINE inline + #endif +#endif +template +void __Pyx_call_destructor(T& x) { + x.~T(); +} +template +class __Pyx_FakeReference { + public: + __Pyx_FakeReference() : ptr(NULL) { } + __Pyx_FakeReference(const T& ref) : ptr(const_cast(&ref)) { } + T *operator->() { return ptr; } + T *operator&() { return ptr; } + operator T&() { return *ptr; } + template bool operator ==(U other) { return *ptr == other; } + template bool operator !=(U other) { return *ptr != other; } + private: + T *ptr; +}; + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; // PyThread_create_key reports success always +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif // TSS (Thread Specific Storage) API +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + + +#define __PYX_ERR(f_index, lineno, Ln_error) \ +{ \ + __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +} + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__MDAnalysis__lib__nsgrid +#define __PYX_HAVE_API__MDAnalysis__lib__nsgrid +/* Early includes */ +#include +#include "ios" +#include "new" +#include "stdexcept" +#include "typeinfo" +#include +#include +#include +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include "pythread.h" +#include +#include "pystate.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif defined(_Complex_I) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + + +static const char *__pyx_f[] = { + "MDAnalysis/lib/nsgrid.pyx", + "stringsource", + "__init__.pxd", + "type.pxd", +}; +/* MemviewSliceStruct.proto */ +struct __pyx_memoryview_obj; +typedef struct { + struct __pyx_memoryview_obj *memview; + char *data; + Py_ssize_t shape[8]; + Py_ssize_t strides[8]; + Py_ssize_t suboffsets[8]; +} __Pyx_memviewslice; +#define __Pyx_MemoryView_Len(m) (m.shape[0]) + +/* Atomics.proto */ +#include +#ifndef CYTHON_ATOMICS + #define CYTHON_ATOMICS 1 +#endif +#define __pyx_atomic_int_type int +#if CYTHON_ATOMICS && __GNUC__ >= 4 && (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL >= 2)) &&\ + !defined(__i386__) + #define __pyx_atomic_incr_aligned(value, lock) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value, lock) __sync_fetch_and_sub(value, 1) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using GNU atomics" + #endif +#elif CYTHON_ATOMICS && defined(_MSC_VER) && 0 + #include + #undef __pyx_atomic_int_type + #define __pyx_atomic_int_type LONG + #define __pyx_atomic_incr_aligned(value, lock) InterlockedIncrement(value) + #define __pyx_atomic_decr_aligned(value, lock) InterlockedDecrement(value) + #ifdef __PYX_DEBUG_ATOMICS + #pragma message ("Using MSVC atomics") + #endif +#elif CYTHON_ATOMICS && (defined(__ICC) || defined(__INTEL_COMPILER)) && 0 + #define __pyx_atomic_incr_aligned(value, lock) _InterlockedIncrement(value) + #define __pyx_atomic_decr_aligned(value, lock) _InterlockedDecrement(value) + #ifdef __PYX_DEBUG_ATOMICS + #warning "Using Intel atomics" + #endif +#else + #undef CYTHON_ATOMICS + #define CYTHON_ATOMICS 0 + #ifdef __PYX_DEBUG_ATOMICS + #warning "Not using atomics" + #endif +#endif +typedef volatile __pyx_atomic_int_type __pyx_atomic_int; +#if CYTHON_ATOMICS + #define __pyx_add_acquisition_count(memview)\ + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) +#else + #define __pyx_add_acquisition_count(memview)\ + __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) + #define __pyx_sub_acquisition_count(memview)\ + __pyx_sub_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) +#endif + +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* NoFastGil.proto */ +#define __Pyx_PyGILState_Ensure PyGILState_Ensure +#define __Pyx_PyGILState_Release PyGILState_Release +#define __Pyx_FastGIL_Remember() +#define __Pyx_FastGIL_Forget() +#define __Pyx_FastGilFuncInit() + +/* BufferFormatStructs.proto */ +#define IS_UNSIGNED(type) (((type) -1) > 0) +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_longlong __pyx_t_5numpy_long_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulonglong __pyx_t_5numpy_ulong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; + +/* "MDAnalysis/lib/nsgrid.pyx":89 + * DEF EPSILON = 1e-5 + * + * ctypedef np.int_t ns_int # <<<<<<<<<<<<<< + * ctypedef np.float32_t real + * ctypedef real rvec[DIM] + */ +typedef __pyx_t_5numpy_int_t __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int; + +/* "MDAnalysis/lib/nsgrid.pyx":90 + * + * ctypedef np.int_t ns_int + * ctypedef np.float32_t real # <<<<<<<<<<<<<< + * ctypedef real rvec[DIM] + * ctypedef ns_int ivec[DIM] + */ +typedef __pyx_t_5numpy_float32_t __pyx_t_10MDAnalysis_3lib_6nsgrid_real; +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + + +/*--- Type declarations ---*/ +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox; +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults; +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid; +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS; +struct __pyx_array_obj; +struct __pyx_MemviewEnum_obj; +struct __pyx_memoryview_obj; +struct __pyx_memoryviewslice_obj; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; +struct __pyx_t_10MDAnalysis_3lib_6nsgrid_cPBCBox_t; + +/* "MDAnalysis/lib/nsgrid.pyx":91 + * ctypedef np.int_t ns_int + * ctypedef np.float32_t real + * ctypedef real rvec[DIM] # <<<<<<<<<<<<<< + * ctypedef ns_int ivec[DIM] + * ctypedef real matrix[DIM][DIM] + */ +typedef __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_10MDAnalysis_3lib_6nsgrid_rvec[3]; + +/* "MDAnalysis/lib/nsgrid.pyx":92 + * ctypedef np.float32_t real + * ctypedef real rvec[DIM] + * ctypedef ns_int ivec[DIM] # <<<<<<<<<<<<<< + * ctypedef real matrix[DIM][DIM] + * + */ +typedef __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_10MDAnalysis_3lib_6nsgrid_ivec[3]; + +/* "MDAnalysis/lib/nsgrid.pyx":93 + * ctypedef real rvec[DIM] + * ctypedef ns_int ivec[DIM] + * ctypedef real matrix[DIM][DIM] # <<<<<<<<<<<<<< + * + * ctypedef vector[ns_int] intvec + */ +typedef __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_10MDAnalysis_3lib_6nsgrid_matrix[3][3]; + +/* "MDAnalysis/lib/nsgrid.pyx":95 + * ctypedef real matrix[DIM][DIM] + * + * ctypedef vector[ns_int] intvec # <<<<<<<<<<<<<< + * ctypedef vector[real] realvec + * + */ +typedef std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> __pyx_t_10MDAnalysis_3lib_6nsgrid_intvec; + +/* "MDAnalysis/lib/nsgrid.pyx":96 + * + * ctypedef vector[ns_int] intvec + * ctypedef vector[real] realvec # <<<<<<<<<<<<<< + * + * # Useful Functions + */ +typedef std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> __pyx_t_10MDAnalysis_3lib_6nsgrid_realvec; + +/* "MDAnalysis/lib/nsgrid.pyx":110 + * # Utility class to handle PBC # + * ############################### + * cdef struct cPBCBox_t: # <<<<<<<<<<<<<< + * matrix box + * rvec fbox_diag + */ +struct __pyx_t_10MDAnalysis_3lib_6nsgrid_cPBCBox_t { + __pyx_t_10MDAnalysis_3lib_6nsgrid_matrix box; + __pyx_t_10MDAnalysis_3lib_6nsgrid_rvec fbox_diag; + __pyx_t_10MDAnalysis_3lib_6nsgrid_rvec hbox_diag; + __pyx_t_10MDAnalysis_3lib_6nsgrid_rvec mhbox_diag; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real max_cutoff2; +}; + +/* "MDAnalysis/lib/nsgrid.pyx":119 + * + * # Class to handle PBC calculations + * cdef class PBCBox(object): # <<<<<<<<<<<<<< + * """ + * Cython implementation of + */ +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox { + PyObject_HEAD + struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_vtab; + struct __pyx_t_10MDAnalysis_3lib_6nsgrid_cPBCBox_t c_pbcbox; + int is_triclinic; + int periodic; +}; + + +/* "MDAnalysis/lib/nsgrid.pyx":310 + * ######################### + * + * cdef class NSResults(object): # <<<<<<<<<<<<<< + * """Class to store the results + * + */ +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults { + PyObject_HEAD + struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_vtab; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real cutoff; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int npairs; + __Pyx_memviewslice coords; + __Pyx_memviewslice searchcoords; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> indices_buffer; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> distances_buffer; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> pairs_buffer; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> pair_distances_buffer; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> pair_distances2_buffer; +}; + + +/* "MDAnalysis/lib/nsgrid.pyx":510 + * return list(self.distances_buffer) + * + * cdef class NSGrid(object): # <<<<<<<<<<<<<< + * """Constructs a uniform cuboidal grid for a brick-shaped box + * + */ +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid { + PyObject_HEAD + struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_vtab; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real cutoff; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int size; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int ncoords; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int ncells[3]; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int cell_offsets[3]; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real cellsize[3]; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int nbeads_per_cell; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *nbeads; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *beadids; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *cellids; + int force; +}; + + +/* "MDAnalysis/lib/nsgrid.pyx":686 + * + * + * cdef class FastNS(object): # <<<<<<<<<<<<<< + * """Grid based search between two group of atoms + * + */ +struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS { + PyObject_HEAD + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *box; + __Pyx_memviewslice coords; + __Pyx_memviewslice coords_bbox; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real cutoff; + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *grid; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int max_gridsize; + int periodic; +}; + + +/* "View.MemoryView":104 + * + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_array_obj { + PyObject_HEAD + struct __pyx_vtabstruct_array *__pyx_vtab; + char *data; + Py_ssize_t len; + char *format; + int ndim; + Py_ssize_t *_shape; + Py_ssize_t *_strides; + Py_ssize_t itemsize; + PyObject *mode; + PyObject *_format; + void (*callback_free_data)(void *); + int free_data; + int dtype_is_object; +}; + + +/* "View.MemoryView":278 + * + * @cname('__pyx_MemviewEnum') + * cdef class Enum(object): # <<<<<<<<<<<<<< + * cdef object name + * def __init__(self, name): + */ +struct __pyx_MemviewEnum_obj { + PyObject_HEAD + PyObject *name; +}; + + +/* "View.MemoryView":329 + * + * @cname('__pyx_memoryview') + * cdef class memoryview(object): # <<<<<<<<<<<<<< + * + * cdef object obj + */ +struct __pyx_memoryview_obj { + PyObject_HEAD + struct __pyx_vtabstruct_memoryview *__pyx_vtab; + PyObject *obj; + PyObject *_size; + PyObject *_array_interface; + PyThread_type_lock lock; + __pyx_atomic_int acquisition_count[2]; + __pyx_atomic_int *acquisition_count_aligned_p; + Py_buffer view; + int flags; + int dtype_is_object; + __Pyx_TypeInfo *typeinfo; +}; + + +/* "View.MemoryView":960 + * + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ +struct __pyx_memoryviewslice_obj { + struct __pyx_memoryview_obj __pyx_base; + __Pyx_memviewslice from_slice; + PyObject *from_object; + PyObject *(*to_object_func)(char *); + int (*to_dtype_func)(char *, PyObject *); +}; + + + +/* "MDAnalysis/lib/nsgrid.pyx":119 + * + * # Class to handle PBC calculations + * cdef class PBCBox(object): # <<<<<<<<<<<<<< + * """ + * Cython implementation of + */ + +struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox { + void (*fast_update)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __Pyx_memviewslice); + void (*fast_pbc_dx)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *); + __pyx_t_10MDAnalysis_3lib_6nsgrid_real (*fast_distance2)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *); + __Pyx_memviewslice (*fast_put_atoms_in_bbox)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __Pyx_memviewslice); +}; +static struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_PBCBox; + + +/* "MDAnalysis/lib/nsgrid.pyx":310 + * ######################### + * + * cdef class NSResults(object): # <<<<<<<<<<<<<< + * """Class to store the results + * + */ + +struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults { + void (*add_neighbors)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int, __pyx_t_10MDAnalysis_3lib_6nsgrid_real); + void (*create_buffers)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *); +}; +static struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSResults; + + +/* "MDAnalysis/lib/nsgrid.pyx":510 + * return list(self.distances_buffer) + * + * cdef class NSGrid(object): # <<<<<<<<<<<<<< + * """Constructs a uniform cuboidal grid for a brick-shaped box + * + */ + +struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int (*coord2cellid)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *); + int (*cellid2cellxyz)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *); + PyObject *(*fill_grid)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *, __Pyx_memviewslice); +}; +static struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSGrid; + + +/* "View.MemoryView":104 + * + * @cname("__pyx_array") + * cdef class array: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_array { + PyObject *(*get_memview)(struct __pyx_array_obj *); +}; +static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; + + +/* "View.MemoryView":329 + * + * @cname('__pyx_memoryview') + * cdef class memoryview(object): # <<<<<<<<<<<<<< + * + * cdef object obj + */ + +struct __pyx_vtabstruct_memoryview { + char *(*get_item_pointer)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*is_slice)(struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_slice_assignment)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*setitem_slice_assign_scalar)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *); + PyObject *(*setitem_indexed)(struct __pyx_memoryview_obj *, PyObject *, PyObject *); + PyObject *(*convert_item_to_object)(struct __pyx_memoryview_obj *, char *); + PyObject *(*assign_item_from_object)(struct __pyx_memoryview_obj *, char *, PyObject *); +}; +static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; + + +/* "View.MemoryView":960 + * + * @cname('__pyx_memoryviewslice') + * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< + * "Internal class for passing memoryview slices to Python" + * + */ + +struct __pyx_vtabstruct__memoryviewslice { + struct __pyx_vtabstruct_memoryview __pyx_base; +}; +static struct __pyx_vtabstruct__memoryviewslice *__pyx_vtabptr__memoryviewslice; + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* MemviewSliceInit.proto */ +#define __Pyx_BUF_MAX_NDIMS %(BUF_MAX_NDIMS)d +#define __Pyx_MEMVIEW_DIRECT 1 +#define __Pyx_MEMVIEW_PTR 2 +#define __Pyx_MEMVIEW_FULL 4 +#define __Pyx_MEMVIEW_CONTIG 8 +#define __Pyx_MEMVIEW_STRIDED 16 +#define __Pyx_MEMVIEW_FOLLOW 32 +#define __Pyx_IS_C_CONTIG 1 +#define __Pyx_IS_F_CONTIG 2 +static int __Pyx_init_memviewslice( + struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference); +static CYTHON_INLINE int __pyx_add_acquisition_count_locked( + __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); +static CYTHON_INLINE int __pyx_sub_acquisition_count_locked( + __pyx_atomic_int *acquisition_count, PyThread_type_lock lock); +#define __pyx_get_slice_count_pointer(memview) (memview->acquisition_count_aligned_p) +#define __pyx_get_slice_count(memview) (*__pyx_get_slice_count_pointer(memview)) +#define __PYX_INC_MEMVIEW(slice, have_gil) __Pyx_INC_MEMVIEW(slice, have_gil, __LINE__) +#define __PYX_XDEC_MEMVIEW(slice, have_gil) __Pyx_XDEC_MEMVIEW(slice, have_gil, __LINE__) +static CYTHON_INLINE void __Pyx_INC_MEMVIEW(__Pyx_memviewslice *, int, int); +static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *, int, int); + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* WriteUnraisableException.proto */ +static void __Pyx_WriteUnraisable(const char *name, int clineno, + int lineno, const char *filename, + int full_traceback, int nogil); + +/* GetModuleGlobalName.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* StrEquals.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +/* UnaryNegOverflows.proto */ +#define UNARY_NEG_WOULD_OVERFLOW(x)\ + (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x))) + +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *); /*proto*/ +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* decode_c_string_utf16.proto */ +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 0; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = -1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} + +/* decode_c_string.proto */ +static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +/* PyIntBinop.proto */ +#if !CYTHON_COMPILING_IN_PYPY +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* ListExtend.proto */ +static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject* none = _PyList_Extend((PyListObject*)L, v); + if (unlikely(!none)) + return -1; + Py_DECREF(none); + return 0; +#else + return PyList_SetSlice(L, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, v); +#endif +} + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* None.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyObject *dict, void *vtable); + +/* SetupReduce.proto */ +static int __Pyx_setup_reduce(PyObject* type_obj); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +/* BufferStructDeclare.proto */ +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +/* MemviewSliceIsContig.proto */ +static int __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim); + +/* OverlappingSlices.proto */ +static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize); + +/* Capsule.proto */ +static CYTHON_INLINE PyObject *__pyx_capsule_create(void *p, const char *sig); + +/* None.proto */ +#include + +/* MemviewDtypeToObject.proto */ +static CYTHON_INLINE PyObject *__pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(const char *itemp); +static CYTHON_INLINE int __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(const char *itemp, PyObject *obj); + +/* IsLittleEndian.proto */ +static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); + +/* BufferFormatCheck.proto */ +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type); + +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyObject *, int writable_flag); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_long(npy_long value); + +/* CppExceptionConversion.proto */ +#ifndef __Pyx_CppExn2PyErr +#include +#include +#include +#include +static void __Pyx_CppExn2PyErr() { + try { + if (PyErr_Occurred()) + ; // let the latest Python exn pass through and ignore the current one + else + throw; + } catch (const std::bad_alloc& exn) { + PyErr_SetString(PyExc_MemoryError, exn.what()); + } catch (const std::bad_cast& exn) { + PyErr_SetString(PyExc_TypeError, exn.what()); + } catch (const std::bad_typeid& exn) { + PyErr_SetString(PyExc_TypeError, exn.what()); + } catch (const std::domain_error& exn) { + PyErr_SetString(PyExc_ValueError, exn.what()); + } catch (const std::invalid_argument& exn) { + PyErr_SetString(PyExc_ValueError, exn.what()); + } catch (const std::ios_base::failure& exn) { + PyErr_SetString(PyExc_IOError, exn.what()); + } catch (const std::out_of_range& exn) { + PyErr_SetString(PyExc_IndexError, exn.what()); + } catch (const std::overflow_error& exn) { + PyErr_SetString(PyExc_OverflowError, exn.what()); + } catch (const std::range_error& exn) { + PyErr_SetString(PyExc_ArithmeticError, exn.what()); + } catch (const std::underflow_error& exn) { + PyErr_SetString(PyExc_ArithmeticError, exn.what()); + } catch (const std::exception& exn) { + PyErr_SetString(PyExc_RuntimeError, exn.what()); + } + catch (...) + { + PyErr_SetString(PyExc_RuntimeError, "Unknown exception"); + } +} +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +/* MemviewSliceCopyTemplate.proto */ +static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object); + +/* CIntFromPy.proto */ +static CYTHON_INLINE npy_long __Pyx_PyInt_As_npy_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CopyContentsUtility.proto */ +#define __pyx_memoryview_copy_slice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real_c(slice)\ + __pyx_memoryview_copy_new_contig(&slice, "c", 2,\ + sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_real), (PyBUF_C_CONTIGUOUS | PyBUF_FORMAT),\ + 0) + +/* CopyContentsUtility.proto */ +#define __pyx_memoryview_copy_slice_dcd__nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real_f(slice)\ + __pyx_memoryview_copy_new_contig(&slice, "fortran", 2,\ + sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_real), (PyBUF_F_CONTIGUOUS | PyBUF_FORMAT),\ + 0) + +/* CIntFromPy.proto */ +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(PyObject *, int writable_flag); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* PyIdentifierFromString.proto */ +#if !defined(__Pyx_PyIdentifier_FromString) +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) +#else + #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) +#endif +#endif + +/* ModuleImport.proto */ +static PyObject *__Pyx_ImportModule(const char *name); + +/* TypeImport.proto */ +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_update(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_box); /* proto*/ +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_pbc_dx(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_ref, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_other, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_dx); /* proto*/ +static __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_distance2(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_a, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_b); /* proto*/ +static __Pyx_memviewslice __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_put_atoms_in_bbox(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_coords); /* proto*/ +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_9NSResults_add_neighbors(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_beadid_i, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_beadid_j, __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_distance2); /* proto*/ +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_9NSResults_create_buffers(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self); /* proto*/ +static __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_coord2cellid(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_coord); /* proto*/ +static int __pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_cellid2cellxyz(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_cellid, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *__pyx_v_cellxyz); /* proto*/ +static PyObject *__pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_fill_grid(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, __Pyx_memviewslice __pyx_v_coords); /* proto*/ +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self); /* proto*/ +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto*/ +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src); /* proto*/ +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp); /* proto*/ +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value); /* proto*/ + +/* Module declarations from 'cpython.mem' */ + +/* Module declarations from 'libc.math' */ + +/* Module declarations from 'libcpp.vector' */ + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'numpy' */ + +/* Module declarations from 'numpy' */ +static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; +static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; +static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; +static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ + +/* Module declarations from 'MDAnalysis.lib.nsgrid' */ +static PyTypeObject *__pyx_ptype_10MDAnalysis_3lib_6nsgrid_PBCBox = 0; +static PyTypeObject *__pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSResults = 0; +static PyTypeObject *__pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSGrid = 0; +static PyTypeObject *__pyx_ptype_10MDAnalysis_3lib_6nsgrid_FastNS = 0; +static PyTypeObject *__pyx_array_type = 0; +static PyTypeObject *__pyx_MemviewEnum_type = 0; +static PyTypeObject *__pyx_memoryview_type = 0; +static PyTypeObject *__pyx_memoryviewslice_type = 0; +static PyObject *generic = 0; +static PyObject *strided = 0; +static PyObject *indirect = 0; +static PyObject *contiguous = 0; +static PyObject *indirect_contiguous = 0; +static int __pyx_memoryview_thread_locks_used; +static PyThread_type_lock __pyx_memoryview_thread_locks[8]; +static __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_f_10MDAnalysis_3lib_6nsgrid_rvec_norm2(__pyx_t_10MDAnalysis_3lib_6nsgrid_real *); /*proto*/ +static PyObject *__pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults__set_state(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *, PyObject *); /*proto*/ +static PyObject *__pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_FastNS__set_state(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *, PyObject *); /*proto*/ +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> &); /*proto*/ +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> &); /*proto*/ +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyObject *); /*proto*/ +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(PyObject *); /*proto*/ +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> &); /*proto*/ +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> &); /*proto*/ +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(PyObject *); /*proto*/ +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(PyObject *); /*proto*/ +static struct __pyx_array_obj *__pyx_array_new(PyObject *, Py_ssize_t, char *, char *, char *); /*proto*/ +static void *__pyx_align_pointer(void *, size_t); /*proto*/ +static PyObject *__pyx_memoryview_new(PyObject *, int, int, __Pyx_TypeInfo *); /*proto*/ +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *); /*proto*/ +static PyObject *_unellipsify(PyObject *, int); /*proto*/ +static PyObject *assert_direct_dimensions(Py_ssize_t *, int); /*proto*/ +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *, PyObject *); /*proto*/ +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int *, Py_ssize_t, Py_ssize_t, Py_ssize_t, int, int, int, int); /*proto*/ +static char *__pyx_pybuffer_index(Py_buffer *, char *, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memslice_transpose(__Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice, int, PyObject *(*)(char *), int (*)(char *, PyObject *), int); /*proto*/ +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *); /*proto*/ +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *, __Pyx_memviewslice *); /*proto*/ +static Py_ssize_t abs_py_ssize_t(Py_ssize_t); /*proto*/ +static char __pyx_get_best_slice_order(__Pyx_memviewslice *, int); /*proto*/ +static void _copy_strided_to_strided(char *, Py_ssize_t *, char *, Py_ssize_t *, Py_ssize_t *, Py_ssize_t *, int, size_t); /*proto*/ +static void copy_strided_to_strided(__Pyx_memviewslice *, __Pyx_memviewslice *, int, size_t); /*proto*/ +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *, int); /*proto*/ +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *, Py_ssize_t *, Py_ssize_t, int, char); /*proto*/ +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *, __Pyx_memviewslice *, char, int); /*proto*/ +static int __pyx_memoryview_err_extents(int, Py_ssize_t, Py_ssize_t); /*proto*/ +static int __pyx_memoryview_err_dim(PyObject *, char *, int); /*proto*/ +static int __pyx_memoryview_err(PyObject *, char *); /*proto*/ +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice, __Pyx_memviewslice, int, int, int); /*proto*/ +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *, int, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_refcount_objects_in_slice(char *, Py_ssize_t *, Py_ssize_t *, int, int); /*proto*/ +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *, int, size_t, void *, int); /*proto*/ +static void __pyx_memoryview__slice_assign_scalar(char *, Py_ssize_t *, Py_ssize_t *, int, size_t, void *); /*proto*/ +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *, PyObject *); /*proto*/ +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real = { "real", NULL, sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_real), { 0 }, 0, 'R', 0, 0 }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int = { "ns_int", NULL, sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int), { 0 }, 0, IS_UNSIGNED(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int), 0 }; +#define __Pyx_MODULE_NAME "MDAnalysis.lib.nsgrid" +extern int __pyx_module_is_main_MDAnalysis__lib__nsgrid; +int __pyx_module_is_main_MDAnalysis__lib__nsgrid = 0; + +/* Implementation of 'MDAnalysis.lib.nsgrid' */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_RuntimeError; +static PyObject *__pyx_builtin_ImportError; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_Ellipsis; +static PyObject *__pyx_builtin_id; +static PyObject *__pyx_builtin_IndexError; +static const char __pyx_k_C[] = "C"; +static const char __pyx_k_O[] = "O"; +static const char __pyx_k_c[] = "c"; +static const char __pyx_k_id[] = "id"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k_box[] = "box"; +static const char __pyx_k_int[] = "int"; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_obj[] = "obj"; +static const char __pyx_k_pbc[] = "pbc"; +static const char __pyx_k_base[] = "base"; +static const char __pyx_k_copy[] = "copy"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mode[] = "mode"; +static const char __pyx_k_name[] = "name"; +static const char __pyx_k_ndim[] = "ndim"; +static const char __pyx_k_pack[] = "pack"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_sqrt[] = "sqrt"; +static const char __pyx_k_step[] = "step"; +static const char __pyx_k_stop[] = "stop"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_ASCII[] = "ASCII"; +static const char __pyx_k_class[] = "__class__"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_empty[] = "empty"; +static const char __pyx_k_error[] = "error"; +static const char __pyx_k_flags[] = "flags"; +static const char __pyx_k_force[] = "force"; +static const char __pyx_k_int64[] = "int64"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_order[] = "order"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_shape[] = "shape"; +static const char __pyx_k_start[] = "start"; +static const char __pyx_k_astype[] = "astype"; +static const char __pyx_k_coords[] = "coords"; +static const char __pyx_k_cutoff[] = "cutoff"; +static const char __pyx_k_encode[] = "encode"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_name_2[] = "__name__"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_struct[] = "struct"; +static const char __pyx_k_unpack[] = "unpack"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_asarray[] = "asarray"; +static const char __pyx_k_float32[] = "float32"; +static const char __pyx_k_fortran[] = "fortran"; +static const char __pyx_k_memview[] = "memview"; +static const char __pyx_k_ncoords[] = "ncoords"; +static const char __pyx_k_reshape[] = "reshape"; +static const char __pyx_k_Ellipsis[] = "Ellipsis"; +static const char __pyx_k_allclose[] = "allclose"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_itemsize[] = "itemsize"; +static const char __pyx_k_max_size[] = "max_size"; +static const char __pyx_k_periodic[] = "periodic"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_IndexError[] = "IndexError"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_RuntimeError[] = "RuntimeError"; +static const char __pyx_k_max_gridsize[] = "max_gridsize"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_searchcoords[] = "searchcoords"; +static const char __pyx_k_stringsource[] = "stringsource"; +static const char __pyx_k_pyx_getbuffer[] = "__pyx_getbuffer"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_View_MemoryView[] = "View.MemoryView"; +static const char __pyx_k_allocate_buffer[] = "allocate_buffer"; +static const char __pyx_k_dtype_is_object[] = "dtype_is_object"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_pyx_unpickle_Enum[] = "__pyx_unpickle_Enum"; +static const char __pyx_k_triclinic_vectors[] = "triclinic_vectors"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_strided_and_direct[] = ""; +static const char __pyx_k_pyx_unpickle_FastNS[] = "__pyx_unpickle_FastNS"; +static const char __pyx_k_strided_and_indirect[] = ""; +static const char __pyx_k_MDAnalysis_lib_nsgrid[] = "MDAnalysis.lib.nsgrid"; +static const char __pyx_k_contiguous_and_direct[] = ""; +static const char __pyx_k_MDAnalysis_lib_mdamath[] = "MDAnalysis.lib.mdamath"; +static const char __pyx_k_MemoryView_of_r_object[] = ""; +static const char __pyx_k_pyx_unpickle_NSResults[] = "__pyx_unpickle_NSResults"; +static const char __pyx_k_Cutoff_must_be_positive[] = "Cutoff must be positive!"; +static const char __pyx_k_MemoryView_of_r_at_0x_x[] = ""; +static const char __pyx_k_contiguous_and_indirect[] = ""; +static const char __pyx_k_Cannot_index_with_type_s[] = "Cannot index with type '%s'"; +static const char __pyx_k_Invalid_shape_in_axis_d_d[] = "Invalid shape in axis %d: %d."; +static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; +static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static const char __pyx_k_Box_must_be_a_x_matrix_Got_x[] = "Box must be a {} x {} matrix. Got: {} x {})"; +static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; +static const char __pyx_k_strided_and_direct_or_indirect[] = ""; +static const char __pyx_k_Neighbor_search_library_mod_MDA[] = "\nNeighbor search library --- :mod:`MDAnalysis.lib.nsgrid`\n========================================================\n\n\nAbout the code\n--------------\n\nThis Neighbor search library is a serialized Cython version greatly\ninspired by the NS grid search implemented in\n`GROMACS `_ .\n\nGROMACS 4.x code (more precisely\n`nsgrid.c `_\nand `ns.c `_ )\nwas used as reference to write this file.\n\nGROMACS 4.x code is released under the GNU Public Licence v2.\n\nAbout the algorithm\n-------------------\n\nThe neighbor search implemented here is based on\n`cell lists `_ which allow\ncomputation of pairs [#]_ with a cost of :math:`O(N)`, instead\nof :math:`O(N^2)`. The basic algorithm is described in\nAppendix F, Page 552 of\n``Understanding Molecular Dynamics: From Algorithm to Applications`` by Frenkel and Smit.\n\nIn brief, the algorithm divides the domain into smaller subdomains called `cells`\nand distributes every particle to these cells based on their positions. Subsequently,\nany distance based query first identifies the corresponding cell position in the\ndomain followed by distance evaluations within the identified cell and\nneighboring cells only. Care must be taken to ensure that `cellsize` is\ngreater than the desired search distance, otherwise all of the neighbours might\nnot reflect in the results.\n\n\n.. [#] a pair correspond to two particles that are considered as neighbors .\n\n\n.. versionadded:: 0.19.0\n"; +static const char __pyx_k_Pickling_of_struct_members_such[] = "Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)"; +static const char __pyx_k_coords_must_have_a_shape_of_n_3[] = "coords must have a shape of (n, 3), got {}."; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_search_coords_must_have_a_shape[] = "search_coords must have a shape of (n, 3), got {}."; +static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static const char __pyx_k_Any_of_the_box_dimensions_cannot[] = "Any of the box dimensions cannot be 0"; +static const char __pyx_k_Box_does_not_correspond_to_PBC_x[] = "Box does not correspond to PBC=xyz"; +static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; +static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; +static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; +static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; +static const char __pyx_k_Could_not_allocate_memory_for_NS[] = "Could not allocate memory for NSGrid.beadids ({} bits requested)"; +static const char __pyx_k_Could_not_allocate_memory_from_N[] = "Could not allocate memory from NSGrid.nbeads ({} bits requested)"; +static const char __pyx_k_Cutoff_greater_than_maximum_cuto[] = "Cutoff greater than maximum cutoff ({:.3f}) given the PBC"; +static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; +static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static const char __pyx_k_Incompatible_checksums_s_vs_0x29[] = "Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))"; +static const char __pyx_k_Incompatible_checksums_s_vs_0xb0[] = "Incompatible checksums (%s vs 0xb068931 = (name))"; +static const char __pyx_k_Incompatible_checksums_s_vs_0xd3[] = "Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))"; +static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; +static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got %s"; +static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis %d)"; +static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; +static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension %d (got %d and %d)"; +static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_self_beadids_self_cellids_self_n[] = "self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling"; +static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; +static const char __pyx_k_Could_not_allocate_memory_from_N_2[] = "Could not allocate memory from NSGrid.cellids ({} bits requested)"; +static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_ASCII; +static PyObject *__pyx_kp_s_Any_of_the_box_dimensions_cannot; +static PyObject *__pyx_kp_s_Box_does_not_correspond_to_PBC_x; +static PyObject *__pyx_kp_s_Box_must_be_a_x_matrix_Got_x; +static PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; +static PyObject *__pyx_n_s_C; +static PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; +static PyObject *__pyx_kp_s_Cannot_assign_to_read_only_memor; +static PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; +static PyObject *__pyx_kp_s_Cannot_index_with_type_s; +static PyObject *__pyx_kp_s_Could_not_allocate_memory_for_NS; +static PyObject *__pyx_kp_s_Could_not_allocate_memory_from_N; +static PyObject *__pyx_kp_s_Could_not_allocate_memory_from_N_2; +static PyObject *__pyx_kp_s_Cutoff_greater_than_maximum_cuto; +static PyObject *__pyx_kp_s_Cutoff_must_be_positive; +static PyObject *__pyx_n_s_Ellipsis; +static PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; +static PyObject *__pyx_n_s_ImportError; +static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x29; +static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xb0; +static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xd3; +static PyObject *__pyx_n_s_IndexError; +static PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; +static PyObject *__pyx_kp_s_Invalid_mode_expected_c_or_fortr; +static PyObject *__pyx_kp_s_Invalid_shape_in_axis_d_d; +static PyObject *__pyx_n_s_MDAnalysis_lib_mdamath; +static PyObject *__pyx_n_s_MDAnalysis_lib_nsgrid; +static PyObject *__pyx_n_s_MemoryError; +static PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; +static PyObject *__pyx_kp_s_MemoryView_of_r_object; +static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; +static PyObject *__pyx_n_b_O; +static PyObject *__pyx_kp_s_Out_of_bounds_on_buffer_access_a; +static PyObject *__pyx_n_s_PickleError; +static PyObject *__pyx_kp_s_Pickling_of_struct_members_such; +static PyObject *__pyx_n_s_RuntimeError; +static PyObject *__pyx_n_s_TypeError; +static PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_n_s_View_MemoryView; +static PyObject *__pyx_n_s_allclose; +static PyObject *__pyx_n_s_allocate_buffer; +static PyObject *__pyx_n_s_asarray; +static PyObject *__pyx_n_s_astype; +static PyObject *__pyx_n_s_base; +static PyObject *__pyx_n_s_box; +static PyObject *__pyx_n_s_c; +static PyObject *__pyx_n_u_c; +static PyObject *__pyx_n_s_class; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_kp_s_contiguous_and_direct; +static PyObject *__pyx_kp_s_contiguous_and_indirect; +static PyObject *__pyx_n_s_coords; +static PyObject *__pyx_kp_s_coords_must_have_a_shape_of_n_3; +static PyObject *__pyx_n_s_copy; +static PyObject *__pyx_n_s_cutoff; +static PyObject *__pyx_n_s_dict; +static PyObject *__pyx_n_s_dtype; +static PyObject *__pyx_n_s_dtype_is_object; +static PyObject *__pyx_n_s_empty; +static PyObject *__pyx_n_s_encode; +static PyObject *__pyx_n_s_enumerate; +static PyObject *__pyx_n_s_error; +static PyObject *__pyx_n_s_flags; +static PyObject *__pyx_n_s_float32; +static PyObject *__pyx_n_s_force; +static PyObject *__pyx_n_s_format; +static PyObject *__pyx_n_s_fortran; +static PyObject *__pyx_n_u_fortran; +static PyObject *__pyx_n_s_getstate; +static PyObject *__pyx_kp_s_got_differing_extents_in_dimensi; +static PyObject *__pyx_n_s_id; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_int; +static PyObject *__pyx_n_s_int64; +static PyObject *__pyx_n_s_itemsize; +static PyObject *__pyx_kp_s_itemsize_0_for_cython_array; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_max_gridsize; +static PyObject *__pyx_n_s_max_size; +static PyObject *__pyx_n_s_memview; +static PyObject *__pyx_n_s_mode; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_name_2; +static PyObject *__pyx_n_s_ncoords; +static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; +static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; +static PyObject *__pyx_n_s_ndim; +static PyObject *__pyx_n_s_new; +static PyObject *__pyx_kp_s_no_default___reduce___due_to_non; +static PyObject *__pyx_n_s_np; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; +static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; +static PyObject *__pyx_n_s_obj; +static PyObject *__pyx_n_s_order; +static PyObject *__pyx_n_s_pack; +static PyObject *__pyx_n_s_pbc; +static PyObject *__pyx_n_s_periodic; +static PyObject *__pyx_n_s_pickle; +static PyObject *__pyx_n_s_pyx_PickleError; +static PyObject *__pyx_n_s_pyx_checksum; +static PyObject *__pyx_n_s_pyx_getbuffer; +static PyObject *__pyx_n_s_pyx_result; +static PyObject *__pyx_n_s_pyx_state; +static PyObject *__pyx_n_s_pyx_type; +static PyObject *__pyx_n_s_pyx_unpickle_Enum; +static PyObject *__pyx_n_s_pyx_unpickle_FastNS; +static PyObject *__pyx_n_s_pyx_unpickle_NSResults; +static PyObject *__pyx_n_s_pyx_vtable; +static PyObject *__pyx_n_s_range; +static PyObject *__pyx_n_s_reduce; +static PyObject *__pyx_n_s_reduce_cython; +static PyObject *__pyx_n_s_reduce_ex; +static PyObject *__pyx_n_s_reshape; +static PyObject *__pyx_kp_s_search_coords_must_have_a_shape; +static PyObject *__pyx_n_s_searchcoords; +static PyObject *__pyx_kp_s_self_beadids_self_cellids_self_n; +static PyObject *__pyx_n_s_setstate; +static PyObject *__pyx_n_s_setstate_cython; +static PyObject *__pyx_n_s_shape; +static PyObject *__pyx_n_s_size; +static PyObject *__pyx_n_s_sqrt; +static PyObject *__pyx_n_s_start; +static PyObject *__pyx_n_s_step; +static PyObject *__pyx_n_s_stop; +static PyObject *__pyx_kp_s_strided_and_direct; +static PyObject *__pyx_kp_s_strided_and_direct_or_indirect; +static PyObject *__pyx_kp_s_strided_and_indirect; +static PyObject *__pyx_kp_s_stringsource; +static PyObject *__pyx_n_s_struct; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_triclinic_vectors; +static PyObject *__pyx_kp_s_unable_to_allocate_array_data; +static PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; +static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; +static PyObject *__pyx_n_s_unpack; +static PyObject *__pyx_n_s_update; +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_box, int __pyx_v_periodic); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_2update(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_box); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_cutoff, __Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_searchcoords); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_2get_pairs(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_4get_pair_distances(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_6get_indices(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_8get_distances(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_6cutoff___get__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_10__reduce_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_12__setstate_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, PyObject *__pyx_v_ncoords, PyObject *__pyx_v_cutoff, struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_box, PyObject *__pyx_v_max_size, PyObject *__pyx_v_force); /* proto */ +static void __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_2__dealloc__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_6cutoff___get__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self, PyObject *__pyx_v_cutoff, PyObject *__pyx_v_coords, PyObject *__pyx_v_box, PyObject *__pyx_v_max_gridsize, PyObject *__pyx_v_pbc); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_2search(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self, PyObject *__pyx_v_search_coords); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_4self_search(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_6cutoff___get__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_6__reduce_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_8__setstate_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_2__pyx_unpickle_FastNS(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr); /* proto */ +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item); /* proto */ +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name); /* proto */ +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object); /* proto */ +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /* proto */ +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_PBCBox(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_NSResults(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_NSGrid(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_FastNS(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_float_0_0; +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_2; +static PyObject *__pyx_int_3; +static PyObject *__pyx_int_5000; +static PyObject *__pyx_int_43303570; +static PyObject *__pyx_int_184977713; +static PyObject *__pyx_int_221827040; +static PyObject *__pyx_int_neg_1; +static PyObject *__pyx_tuple_; +static PyObject *__pyx_slice__6; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__7; +static PyObject *__pyx_tuple__8; +static PyObject *__pyx_tuple__9; +static PyObject *__pyx_slice__35; +static PyObject *__pyx_slice__36; +static PyObject *__pyx_slice__37; +static PyObject *__pyx_tuple__10; +static PyObject *__pyx_tuple__11; +static PyObject *__pyx_tuple__12; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_tuple__14; +static PyObject *__pyx_tuple__15; +static PyObject *__pyx_tuple__16; +static PyObject *__pyx_tuple__17; +static PyObject *__pyx_tuple__18; +static PyObject *__pyx_tuple__19; +static PyObject *__pyx_tuple__20; +static PyObject *__pyx_tuple__21; +static PyObject *__pyx_tuple__22; +static PyObject *__pyx_tuple__23; +static PyObject *__pyx_tuple__24; +static PyObject *__pyx_tuple__25; +static PyObject *__pyx_tuple__26; +static PyObject *__pyx_tuple__27; +static PyObject *__pyx_tuple__28; +static PyObject *__pyx_tuple__29; +static PyObject *__pyx_tuple__30; +static PyObject *__pyx_tuple__31; +static PyObject *__pyx_tuple__32; +static PyObject *__pyx_tuple__33; +static PyObject *__pyx_tuple__34; +static PyObject *__pyx_tuple__38; +static PyObject *__pyx_tuple__39; +static PyObject *__pyx_tuple__40; +static PyObject *__pyx_tuple__41; +static PyObject *__pyx_tuple__43; +static PyObject *__pyx_tuple__45; +static PyObject *__pyx_tuple__46; +static PyObject *__pyx_tuple__47; +static PyObject *__pyx_tuple__48; +static PyObject *__pyx_tuple__49; +static PyObject *__pyx_tuple__50; +static PyObject *__pyx_codeobj__42; +static PyObject *__pyx_codeobj__44; +static PyObject *__pyx_codeobj__51; +/* Late includes */ + +/* "MDAnalysis/lib/nsgrid.pyx":99 + * + * # Useful Functions + * cdef real rvec_norm2(const rvec a) nogil: # <<<<<<<<<<<<<< + * return a[XX]*a[XX] + a[YY]*a[YY] + a[ZZ]*a[ZZ] + * + */ + +static __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_f_10MDAnalysis_3lib_6nsgrid_rvec_norm2(__pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_a) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_r; + + /* "MDAnalysis/lib/nsgrid.pyx":100 + * # Useful Functions + * cdef real rvec_norm2(const rvec a) nogil: + * return a[XX]*a[XX] + a[YY]*a[YY] + a[ZZ]*a[ZZ] # <<<<<<<<<<<<<< + * + * cdef void rvec_clear(rvec a) nogil: + */ + __pyx_r = ((((__pyx_v_a[0]) * (__pyx_v_a[0])) + ((__pyx_v_a[1]) * (__pyx_v_a[1]))) + ((__pyx_v_a[2]) * (__pyx_v_a[2]))); + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":99 + * + * # Useful Functions + * cdef real rvec_norm2(const rvec a) nogil: # <<<<<<<<<<<<<< + * return a[XX]*a[XX] + a[YY]*a[YY] + a[ZZ]*a[ZZ] + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":102 + * return a[XX]*a[XX] + a[YY]*a[YY] + a[ZZ]*a[ZZ] + * + * cdef void rvec_clear(rvec a) nogil: # <<<<<<<<<<<<<< + * a[XX] = 0.0 + * a[YY] = 0.0 + */ + +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_rvec_clear(__pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_a) { + + /* "MDAnalysis/lib/nsgrid.pyx":103 + * + * cdef void rvec_clear(rvec a) nogil: + * a[XX] = 0.0 # <<<<<<<<<<<<<< + * a[YY] = 0.0 + * a[ZZ] = 0.0 + */ + (__pyx_v_a[0]) = 0.0; + + /* "MDAnalysis/lib/nsgrid.pyx":104 + * cdef void rvec_clear(rvec a) nogil: + * a[XX] = 0.0 + * a[YY] = 0.0 # <<<<<<<<<<<<<< + * a[ZZ] = 0.0 + * + */ + (__pyx_v_a[1]) = 0.0; + + /* "MDAnalysis/lib/nsgrid.pyx":105 + * a[XX] = 0.0 + * a[YY] = 0.0 + * a[ZZ] = 0.0 # <<<<<<<<<<<<<< + * + * ############################### + */ + (__pyx_v_a[2]) = 0.0; + + /* "MDAnalysis/lib/nsgrid.pyx":102 + * return a[XX]*a[XX] + a[YY]*a[YY] + a[ZZ]*a[ZZ] + * + * cdef void rvec_clear(rvec a) nogil: # <<<<<<<<<<<<<< + * a[XX] = 0.0 + * a[YY] = 0.0 + */ + + /* function exit code */ +} + +/* "MDAnalysis/lib/nsgrid.pyx":143 + * cdef bint periodic + * + * def __init__(self, real[:, ::1] box, bint periodic): # <<<<<<<<<<<<<< + * """ + * Parameters + */ + +/* Python wrapper */ +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__[] = "\n Parameters\n ----------\n box : numpy.ndarray\n box vectors of shape ``(3, 3)`` or\n as returned by ``MDAnalysis.lib.mdamath.triclinic_vectors``\n ``dtype`` must be ``numpy.float32``\n periodic : boolean\n ``True`` for PBC-aware calculations\n ``False`` for non PBC aware calculations\n "; +#if CYTHON_COMPILING_IN_CPYTHON +struct wrapperbase __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__; +#endif +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + __Pyx_memviewslice __pyx_v_box = { 0, 0, { 0 }, { 0 }, { 0 } }; + int __pyx_v_periodic; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_box,&__pyx_n_s_periodic,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_periodic)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 143, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 143, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + } + __pyx_v_box = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_box.memview)) __PYX_ERR(0, 143, __pyx_L3_error) + __pyx_v_periodic = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_periodic == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 143, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 143, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.PBCBox.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self), __pyx_v_box, __pyx_v_periodic); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_box, int __pyx_v_periodic) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":156 + * """ + * + * self.periodic = periodic # <<<<<<<<<<<<<< + * self.update(box) + * + */ + __pyx_v_self->periodic = __pyx_v_periodic; + + /* "MDAnalysis/lib/nsgrid.pyx":157 + * + * self.periodic = periodic + * self.update(box) # <<<<<<<<<<<<<< + * + * cdef void fast_update(self, real[:, ::1] box) nogil: + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_update); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_box, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_4) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":143 + * cdef bint periodic + * + * def __init__(self, real[:, ::1] box, bint periodic): # <<<<<<<<<<<<<< + * """ + * Parameters + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.PBCBox.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_box, 1); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":159 + * self.update(box) + * + * cdef void fast_update(self, real[:, ::1] box) nogil: # <<<<<<<<<<<<<< + * """ + * Updates the internal box parameters for + */ + +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_update(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_box) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_j; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_min_hv2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_min_ss; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_tmp; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_1; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + Py_ssize_t __pyx_t_7; + Py_ssize_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + Py_ssize_t __pyx_t_11; + double __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + double __pyx_t_15; + double __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + Py_ssize_t __pyx_t_27; + Py_ssize_t __pyx_t_28; + Py_ssize_t __pyx_t_29; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_30; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_31; + Py_ssize_t __pyx_t_32; + Py_ssize_t __pyx_t_33; + + /* "MDAnalysis/lib/nsgrid.pyx":171 + * + * # Update matrix + * self.is_triclinic = False # <<<<<<<<<<<<<< + * for i in range(DIM): + * for j in range(DIM): + */ + __pyx_v_self->is_triclinic = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":172 + * # Update matrix + * self.is_triclinic = False + * for i in range(DIM): # <<<<<<<<<<<<<< + * for j in range(DIM): + * self.c_pbcbox.box[i][j] = box[i, j] + */ + for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":173 + * self.is_triclinic = False + * for i in range(DIM): + * for j in range(DIM): # <<<<<<<<<<<<<< + * self.c_pbcbox.box[i][j] = box[i, j] + * + */ + for (__pyx_t_2 = 0; __pyx_t_2 < 3; __pyx_t_2+=1) { + __pyx_v_j = __pyx_t_2; + + /* "MDAnalysis/lib/nsgrid.pyx":174 + * for i in range(DIM): + * for j in range(DIM): + * self.c_pbcbox.box[i][j] = box[i, j] # <<<<<<<<<<<<<< + * + * if i != j: + */ + __pyx_t_3 = __pyx_v_i; + __pyx_t_4 = __pyx_v_j; + if (__pyx_t_3 < 0) __pyx_t_3 += __pyx_v_box.shape[0]; + if (__pyx_t_4 < 0) __pyx_t_4 += __pyx_v_box.shape[1]; + ((__pyx_v_self->c_pbcbox.box[__pyx_v_i])[__pyx_v_j]) = (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_3 * __pyx_v_box.strides[0]) )) + __pyx_t_4)) ))); + + /* "MDAnalysis/lib/nsgrid.pyx":176 + * self.c_pbcbox.box[i][j] = box[i, j] + * + * if i != j: # <<<<<<<<<<<<<< + * if box[i, j] > EPSILON: + * self.is_triclinic = True + */ + __pyx_t_5 = ((__pyx_v_i != __pyx_v_j) != 0); + if (__pyx_t_5) { + + /* "MDAnalysis/lib/nsgrid.pyx":177 + * + * if i != j: + * if box[i, j] > EPSILON: # <<<<<<<<<<<<<< + * self.is_triclinic = True + * + */ + __pyx_t_6 = __pyx_v_i; + __pyx_t_7 = __pyx_v_j; + if (__pyx_t_6 < 0) __pyx_t_6 += __pyx_v_box.shape[0]; + if (__pyx_t_7 < 0) __pyx_t_7 += __pyx_v_box.shape[1]; + __pyx_t_5 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_6 * __pyx_v_box.strides[0]) )) + __pyx_t_7)) ))) > 1e-05) != 0); + if (__pyx_t_5) { + + /* "MDAnalysis/lib/nsgrid.pyx":178 + * if i != j: + * if box[i, j] > EPSILON: + * self.is_triclinic = True # <<<<<<<<<<<<<< + * + * # Update diagonals + */ + __pyx_v_self->is_triclinic = 1; + + /* "MDAnalysis/lib/nsgrid.pyx":177 + * + * if i != j: + * if box[i, j] > EPSILON: # <<<<<<<<<<<<<< + * self.is_triclinic = True + * + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":176 + * self.c_pbcbox.box[i][j] = box[i, j] + * + * if i != j: # <<<<<<<<<<<<<< + * if box[i, j] > EPSILON: + * self.is_triclinic = True + */ + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":181 + * + * # Update diagonals + * for i in range(DIM): # <<<<<<<<<<<<<< + * self.c_pbcbox.fbox_diag[i] = box[i, i] + * self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 + */ + for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":182 + * # Update diagonals + * for i in range(DIM): + * self.c_pbcbox.fbox_diag[i] = box[i, i] # <<<<<<<<<<<<<< + * self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 + * self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] + */ + __pyx_t_8 = __pyx_v_i; + __pyx_t_9 = __pyx_v_i; + if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_box.shape[0]; + if (__pyx_t_9 < 0) __pyx_t_9 += __pyx_v_box.shape[1]; + (__pyx_v_self->c_pbcbox.fbox_diag[__pyx_v_i]) = (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_8 * __pyx_v_box.strides[0]) )) + __pyx_t_9)) ))); + + /* "MDAnalysis/lib/nsgrid.pyx":183 + * for i in range(DIM): + * self.c_pbcbox.fbox_diag[i] = box[i, i] + * self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 # <<<<<<<<<<<<<< + * self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] + * + */ + (__pyx_v_self->c_pbcbox.hbox_diag[__pyx_v_i]) = ((__pyx_v_self->c_pbcbox.fbox_diag[__pyx_v_i]) * 0.5); + + /* "MDAnalysis/lib/nsgrid.pyx":184 + * self.c_pbcbox.fbox_diag[i] = box[i, i] + * self.c_pbcbox.hbox_diag[i] = self.c_pbcbox.fbox_diag[i] * 0.5 + * self.c_pbcbox.mhbox_diag[i] = - self.c_pbcbox.hbox_diag[i] # <<<<<<<<<<<<<< + * + * # Update maximum cutoff + */ + (__pyx_v_self->c_pbcbox.mhbox_diag[__pyx_v_i]) = (-(__pyx_v_self->c_pbcbox.hbox_diag[__pyx_v_i])); + } + + /* "MDAnalysis/lib/nsgrid.pyx":190 + * # Physical limitation of the cut-off + * # by half the length of the shortest box vector. + * min_hv2 = min(0.25 * rvec_norm2(&box[XX, XX]), 0.25 * rvec_norm2(&box[YY, XX])) # <<<<<<<<<<<<<< + * min_hv2 = min(min_hv2, 0.25 * rvec_norm2(&box[ZZ, XX])) + * + */ + __pyx_t_10 = 1; + __pyx_t_11 = 0; + if (__pyx_t_10 < 0) __pyx_t_10 += __pyx_v_box.shape[0]; + if (__pyx_t_11 < 0) __pyx_t_11 += __pyx_v_box.shape[1]; + __pyx_t_12 = (0.25 * __pyx_f_10MDAnalysis_3lib_6nsgrid_rvec_norm2((&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_10 * __pyx_v_box.strides[0]) )) + __pyx_t_11)) )))))); + __pyx_t_13 = 0; + __pyx_t_14 = 0; + if (__pyx_t_13 < 0) __pyx_t_13 += __pyx_v_box.shape[0]; + if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_box.shape[1]; + __pyx_t_15 = (0.25 * __pyx_f_10MDAnalysis_3lib_6nsgrid_rvec_norm2((&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_13 * __pyx_v_box.strides[0]) )) + __pyx_t_14)) )))))); + if (((__pyx_t_12 < __pyx_t_15) != 0)) { + __pyx_t_16 = __pyx_t_12; + } else { + __pyx_t_16 = __pyx_t_15; + } + __pyx_v_min_hv2 = __pyx_t_16; + + /* "MDAnalysis/lib/nsgrid.pyx":191 + * # by half the length of the shortest box vector. + * min_hv2 = min(0.25 * rvec_norm2(&box[XX, XX]), 0.25 * rvec_norm2(&box[YY, XX])) + * min_hv2 = min(min_hv2, 0.25 * rvec_norm2(&box[ZZ, XX])) # <<<<<<<<<<<<<< + * + * # Limitation to the smallest diagonal element due to optimizations: + */ + __pyx_t_17 = 2; + __pyx_t_18 = 0; + if (__pyx_t_17 < 0) __pyx_t_17 += __pyx_v_box.shape[0]; + if (__pyx_t_18 < 0) __pyx_t_18 += __pyx_v_box.shape[1]; + __pyx_t_16 = (0.25 * __pyx_f_10MDAnalysis_3lib_6nsgrid_rvec_norm2((&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_17 * __pyx_v_box.strides[0]) )) + __pyx_t_18)) )))))); + __pyx_t_19 = __pyx_v_min_hv2; + if (((__pyx_t_16 < __pyx_t_19) != 0)) { + __pyx_t_12 = __pyx_t_16; + } else { + __pyx_t_12 = __pyx_t_19; + } + __pyx_v_min_hv2 = __pyx_t_12; + + /* "MDAnalysis/lib/nsgrid.pyx":197 + * # in the grid search and pbc_dx is a lot faster + * # than checking all possible combinations. + * tmp = box[YY, YY] # <<<<<<<<<<<<<< + * if box[ZZ, YY] < 0: + * tmp -= box[ZZ, YY] + */ + __pyx_t_20 = 1; + __pyx_t_21 = 1; + if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_v_box.shape[0]; + if (__pyx_t_21 < 0) __pyx_t_21 += __pyx_v_box.shape[1]; + __pyx_v_tmp = (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_20 * __pyx_v_box.strides[0]) )) + __pyx_t_21)) ))); + + /* "MDAnalysis/lib/nsgrid.pyx":198 + * # than checking all possible combinations. + * tmp = box[YY, YY] + * if box[ZZ, YY] < 0: # <<<<<<<<<<<<<< + * tmp -= box[ZZ, YY] + * else: + */ + __pyx_t_22 = 2; + __pyx_t_23 = 1; + if (__pyx_t_22 < 0) __pyx_t_22 += __pyx_v_box.shape[0]; + if (__pyx_t_23 < 0) __pyx_t_23 += __pyx_v_box.shape[1]; + __pyx_t_5 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_22 * __pyx_v_box.strides[0]) )) + __pyx_t_23)) ))) < 0.0) != 0); + if (__pyx_t_5) { + + /* "MDAnalysis/lib/nsgrid.pyx":199 + * tmp = box[YY, YY] + * if box[ZZ, YY] < 0: + * tmp -= box[ZZ, YY] # <<<<<<<<<<<<<< + * else: + * tmp += box[ZZ, YY] + */ + __pyx_t_24 = 2; + __pyx_t_25 = 1; + if (__pyx_t_24 < 0) __pyx_t_24 += __pyx_v_box.shape[0]; + if (__pyx_t_25 < 0) __pyx_t_25 += __pyx_v_box.shape[1]; + __pyx_v_tmp = (__pyx_v_tmp - (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_24 * __pyx_v_box.strides[0]) )) + __pyx_t_25)) )))); + + /* "MDAnalysis/lib/nsgrid.pyx":198 + * # than checking all possible combinations. + * tmp = box[YY, YY] + * if box[ZZ, YY] < 0: # <<<<<<<<<<<<<< + * tmp -= box[ZZ, YY] + * else: + */ + goto __pyx_L11; + } + + /* "MDAnalysis/lib/nsgrid.pyx":201 + * tmp -= box[ZZ, YY] + * else: + * tmp += box[ZZ, YY] # <<<<<<<<<<<<<< + * + * min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) + */ + /*else*/ { + __pyx_t_26 = 2; + __pyx_t_27 = 1; + if (__pyx_t_26 < 0) __pyx_t_26 += __pyx_v_box.shape[0]; + if (__pyx_t_27 < 0) __pyx_t_27 += __pyx_v_box.shape[1]; + __pyx_v_tmp = (__pyx_v_tmp + (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_26 * __pyx_v_box.strides[0]) )) + __pyx_t_27)) )))); + } + __pyx_L11:; + + /* "MDAnalysis/lib/nsgrid.pyx":203 + * tmp += box[ZZ, YY] + * + * min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) # <<<<<<<<<<<<<< + * self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) + * + */ + __pyx_t_28 = 2; + __pyx_t_29 = 2; + if (__pyx_t_28 < 0) __pyx_t_28 += __pyx_v_box.shape[0]; + if (__pyx_t_29 < 0) __pyx_t_29 += __pyx_v_box.shape[1]; + __pyx_t_19 = (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_28 * __pyx_v_box.strides[0]) )) + __pyx_t_29)) ))); + __pyx_t_30 = __pyx_v_tmp; + if (((__pyx_t_19 < __pyx_t_30) != 0)) { + __pyx_t_31 = __pyx_t_19; + } else { + __pyx_t_31 = __pyx_t_30; + } + __pyx_t_19 = __pyx_t_31; + __pyx_t_32 = 0; + __pyx_t_33 = 0; + if (__pyx_t_32 < 0) __pyx_t_32 += __pyx_v_box.shape[0]; + if (__pyx_t_33 < 0) __pyx_t_33 += __pyx_v_box.shape[1]; + __pyx_t_31 = (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_32 * __pyx_v_box.strides[0]) )) + __pyx_t_33)) ))); + if (((__pyx_t_19 < __pyx_t_31) != 0)) { + __pyx_t_30 = __pyx_t_19; + } else { + __pyx_t_30 = __pyx_t_31; + } + __pyx_v_min_ss = __pyx_t_30; + + /* "MDAnalysis/lib/nsgrid.pyx":204 + * + * min_ss = min(box[XX, XX], min(tmp, box[ZZ, ZZ])) + * self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) # <<<<<<<<<<<<<< + * + * def update(self, real[:, ::1] box): + */ + __pyx_t_30 = (__pyx_v_min_ss * __pyx_v_min_ss); + __pyx_t_19 = __pyx_v_min_hv2; + if (((__pyx_t_30 < __pyx_t_19) != 0)) { + __pyx_t_31 = __pyx_t_30; + } else { + __pyx_t_31 = __pyx_t_19; + } + __pyx_v_self->c_pbcbox.max_cutoff2 = __pyx_t_31; + + /* "MDAnalysis/lib/nsgrid.pyx":159 + * self.update(box) + * + * cdef void fast_update(self, real[:, ::1] box) nogil: # <<<<<<<<<<<<<< + * """ + * Updates the internal box parameters for + */ + + /* function exit code */ +} + +/* "MDAnalysis/lib/nsgrid.pyx":206 + * self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) + * + * def update(self, real[:, ::1] box): # <<<<<<<<<<<<<< + * """ + * Updates internal MD box representation and parameters used for calculations. + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_3update(PyObject *__pyx_v_self, PyObject *__pyx_arg_box); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox_2update[] = "PBCBox.update(self, __Pyx_memviewslice box)\n\n Updates internal MD box representation and parameters used for calculations.\n\n Parameters\n ----------\n box : numpy.ndarray\n Describes the MD box vectors as returned by\n :func:`MDAnalysis.lib.mdamath.triclinic_vectors`.\n `dtype` must be :class:`numpy.float32`\n\n Note\n ----\n Call to this method is only needed when the MD box is changed\n as it always called when class is instantiated.\n\n "; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_3update(PyObject *__pyx_v_self, PyObject *__pyx_arg_box) { + __Pyx_memviewslice __pyx_v_box = { 0, 0, { 0 }, { 0 }, { 0 } }; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("update (wrapper)", 0); + assert(__pyx_arg_box); { + __pyx_v_box = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_arg_box, PyBUF_WRITABLE); if (unlikely(!__pyx_v_box.memview)) __PYX_ERR(0, 206, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.PBCBox.update", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_2update(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self), __pyx_v_box); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_2update(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_box) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + Py_ssize_t __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + __Pyx_RefNannySetupContext("update", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":224 + * """ + * + * if box.shape[0] != DIM or box.shape[1] != DIM: # <<<<<<<<<<<<<< + * raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( + * DIM, DIM, box.shape[0], box.shape[1])) + */ + __pyx_t_2 = (((__pyx_v_box.shape[0]) != 3) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (((__pyx_v_box.shape[1]) != 3) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "MDAnalysis/lib/nsgrid.pyx":225 + * + * if box.shape[0] != DIM or box.shape[1] != DIM: + * raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( # <<<<<<<<<<<<<< + * DIM, DIM, box.shape[0], box.shape[1])) + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Box_must_be_a_x_matrix_Got_x, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 225, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + + /* "MDAnalysis/lib/nsgrid.pyx":226 + * if box.shape[0] != DIM or box.shape[1] != DIM: + * raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( + * DIM, DIM, box.shape[0], box.shape[1])) # <<<<<<<<<<<<<< + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + * raise ValueError("Box does not correspond to PBC=xyz") + */ + __pyx_t_5 = PyInt_FromSsize_t((__pyx_v_box.shape[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyInt_FromSsize_t((__pyx_v_box.shape[1])); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[5] = {__pyx_t_7, __pyx_int_3, __pyx_int_3, __pyx_t_5, __pyx_t_6}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_8, 4+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[5] = {__pyx_t_7, __pyx_int_3, __pyx_int_3, __pyx_t_5, __pyx_t_6}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_8, 4+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(4+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 225, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_7) { + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; + } + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_int_3); + __Pyx_INCREF(__pyx_int_3); + __Pyx_GIVEREF(__pyx_int_3); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_int_3); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_9, 2+__pyx_t_8, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 3+__pyx_t_8, __pyx_t_6); + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":225 + * + * if box.shape[0] != DIM or box.shape[1] != DIM: + * raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( # <<<<<<<<<<<<<< + * DIM, DIM, box.shape[0], box.shape[1])) + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + */ + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 225, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(0, 225, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":224 + * """ + * + * if box.shape[0] != DIM or box.shape[1] != DIM: # <<<<<<<<<<<<<< + * raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( + * DIM, DIM, box.shape[0], box.shape[1])) + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":227 + * raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( + * DIM, DIM, box.shape[0], box.shape[1])) + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): # <<<<<<<<<<<<<< + * raise ValueError("Box does not correspond to PBC=xyz") + * self.fast_update(box) + */ + __pyx_t_10 = 0; + __pyx_t_11 = 0; + if (__pyx_t_10 < 0) __pyx_t_10 += __pyx_v_box.shape[0]; + if (__pyx_t_11 < 0) __pyx_t_11 += __pyx_v_box.shape[1]; + __pyx_t_2 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_10 * __pyx_v_box.strides[0]) )) + __pyx_t_11)) ))) == 0.0) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_12 = 1; + __pyx_t_13 = 1; + if (__pyx_t_12 < 0) __pyx_t_12 += __pyx_v_box.shape[0]; + if (__pyx_t_13 < 0) __pyx_t_13 += __pyx_v_box.shape[1]; + __pyx_t_2 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_12 * __pyx_v_box.strides[0]) )) + __pyx_t_13)) ))) == 0.0) != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_14 = 2; + __pyx_t_15 = 2; + if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_box.shape[0]; + if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_box.shape[1]; + __pyx_t_2 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_box.data + __pyx_t_14 * __pyx_v_box.strides[0]) )) + __pyx_t_15)) ))) == 0.0) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L7_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "MDAnalysis/lib/nsgrid.pyx":228 + * DIM, DIM, box.shape[0], box.shape[1])) + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + * raise ValueError("Box does not correspond to PBC=xyz") # <<<<<<<<<<<<<< + * self.fast_update(box) + * + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(0, 228, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":227 + * raise ValueError("Box must be a {} x {} matrix. Got: {} x {})".format( + * DIM, DIM, box.shape[0], box.shape[1])) + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): # <<<<<<<<<<<<<< + * raise ValueError("Box does not correspond to PBC=xyz") + * self.fast_update(box) + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":229 + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + * raise ValueError("Box does not correspond to PBC=xyz") + * self.fast_update(box) # <<<<<<<<<<<<<< + * + * cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: + */ + ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self->__pyx_vtab)->fast_update(__pyx_v_self, __pyx_v_box); + + /* "MDAnalysis/lib/nsgrid.pyx":206 + * self.c_pbcbox.max_cutoff2 = min(min_hv2, min_ss * min_ss) + * + * def update(self, real[:, ::1] box): # <<<<<<<<<<<<<< + * """ + * Updates internal MD box representation and parameters used for calculations. + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.PBCBox.update", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_box, 1); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":231 + * self.fast_update(box) + * + * cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: # <<<<<<<<<<<<<< + * """Dislacement between two points for both + * PBC and non-PBC conditions + */ + +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_pbc_dx(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_ref, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_other, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_dx) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_j; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_1; + int __pyx_t_2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_3; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_4; + + /* "MDAnalysis/lib/nsgrid.pyx":244 + * cdef ns_int i, j + * + * for i in range(DIM): # <<<<<<<<<<<<<< + * dx[i] = other[i] - ref[i] + * + */ + for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":245 + * + * for i in range(DIM): + * dx[i] = other[i] - ref[i] # <<<<<<<<<<<<<< + * + * if self.periodic: + */ + (__pyx_v_dx[__pyx_v_i]) = ((__pyx_v_other[__pyx_v_i]) - (__pyx_v_ref[__pyx_v_i])); + } + + /* "MDAnalysis/lib/nsgrid.pyx":247 + * dx[i] = other[i] - ref[i] + * + * if self.periodic: # <<<<<<<<<<<<<< + * for i in range(DIM-1, -1, -1): + * while dx[i] > self.c_pbcbox.hbox_diag[i]: + */ + __pyx_t_2 = (__pyx_v_self->periodic != 0); + if (__pyx_t_2) { + + /* "MDAnalysis/lib/nsgrid.pyx":248 + * + * if self.periodic: + * for i in range(DIM-1, -1, -1): # <<<<<<<<<<<<<< + * while dx[i] > self.c_pbcbox.hbox_diag[i]: + * for j in range(i, -1, -1): + */ + for (__pyx_t_1 = 2; __pyx_t_1 > -1L; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":249 + * if self.periodic: + * for i in range(DIM-1, -1, -1): + * while dx[i] > self.c_pbcbox.hbox_diag[i]: # <<<<<<<<<<<<<< + * for j in range(i, -1, -1): + * dx[j] -= self.c_pbcbox.box[i][j] + */ + while (1) { + __pyx_t_2 = (((__pyx_v_dx[__pyx_v_i]) > (__pyx_v_self->c_pbcbox.hbox_diag[__pyx_v_i])) != 0); + if (!__pyx_t_2) break; + + /* "MDAnalysis/lib/nsgrid.pyx":250 + * for i in range(DIM-1, -1, -1): + * while dx[i] > self.c_pbcbox.hbox_diag[i]: + * for j in range(i, -1, -1): # <<<<<<<<<<<<<< + * dx[j] -= self.c_pbcbox.box[i][j] + * + */ + for (__pyx_t_3 = __pyx_v_i; __pyx_t_3 > -1L; __pyx_t_3-=1) { + __pyx_v_j = __pyx_t_3; + + /* "MDAnalysis/lib/nsgrid.pyx":251 + * while dx[i] > self.c_pbcbox.hbox_diag[i]: + * for j in range(i, -1, -1): + * dx[j] -= self.c_pbcbox.box[i][j] # <<<<<<<<<<<<<< + * + * while dx[i] <= self.c_pbcbox.mhbox_diag[i]: + */ + __pyx_t_4 = __pyx_v_j; + (__pyx_v_dx[__pyx_t_4]) = ((__pyx_v_dx[__pyx_t_4]) - ((__pyx_v_self->c_pbcbox.box[__pyx_v_i])[__pyx_v_j])); + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":253 + * dx[j] -= self.c_pbcbox.box[i][j] + * + * while dx[i] <= self.c_pbcbox.mhbox_diag[i]: # <<<<<<<<<<<<<< + * for j in range(i, -1, -1): + * dx[j] += self.c_pbcbox.box[i][j] + */ + while (1) { + __pyx_t_2 = (((__pyx_v_dx[__pyx_v_i]) <= (__pyx_v_self->c_pbcbox.mhbox_diag[__pyx_v_i])) != 0); + if (!__pyx_t_2) break; + + /* "MDAnalysis/lib/nsgrid.pyx":254 + * + * while dx[i] <= self.c_pbcbox.mhbox_diag[i]: + * for j in range(i, -1, -1): # <<<<<<<<<<<<<< + * dx[j] += self.c_pbcbox.box[i][j] + * + */ + for (__pyx_t_3 = __pyx_v_i; __pyx_t_3 > -1L; __pyx_t_3-=1) { + __pyx_v_j = __pyx_t_3; + + /* "MDAnalysis/lib/nsgrid.pyx":255 + * while dx[i] <= self.c_pbcbox.mhbox_diag[i]: + * for j in range(i, -1, -1): + * dx[j] += self.c_pbcbox.box[i][j] # <<<<<<<<<<<<<< + * + * cdef real fast_distance2(self, rvec a, rvec b) nogil: + */ + __pyx_t_4 = __pyx_v_j; + (__pyx_v_dx[__pyx_t_4]) = ((__pyx_v_dx[__pyx_t_4]) + ((__pyx_v_self->c_pbcbox.box[__pyx_v_i])[__pyx_v_j])); + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":247 + * dx[i] = other[i] - ref[i] + * + * if self.periodic: # <<<<<<<<<<<<<< + * for i in range(DIM-1, -1, -1): + * while dx[i] > self.c_pbcbox.hbox_diag[i]: + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":231 + * self.fast_update(box) + * + * cdef void fast_pbc_dx(self, rvec ref, rvec other, rvec dx) nogil: # <<<<<<<<<<<<<< + * """Dislacement between two points for both + * PBC and non-PBC conditions + */ + + /* function exit code */ +} + +/* "MDAnalysis/lib/nsgrid.pyx":257 + * dx[j] += self.c_pbcbox.box[i][j] + * + * cdef real fast_distance2(self, rvec a, rvec b) nogil: # <<<<<<<<<<<<<< + * """Distance calculation between two points + * for both PBC and non-PBC aware calculations + */ + +static __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_distance2(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_a, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_b) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_rvec __pyx_v_dx; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_r; + + /* "MDAnalysis/lib/nsgrid.pyx":267 + * + * cdef rvec dx + * self.fast_pbc_dx(a, b, dx) # <<<<<<<<<<<<<< + * return rvec_norm2(dx) + * + */ + ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self->__pyx_vtab)->fast_pbc_dx(__pyx_v_self, __pyx_v_a, __pyx_v_b, __pyx_v_dx); + + /* "MDAnalysis/lib/nsgrid.pyx":268 + * cdef rvec dx + * self.fast_pbc_dx(a, b, dx) + * return rvec_norm2(dx) # <<<<<<<<<<<<<< + * + * cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:, ::1] coords) nogil: + */ + __pyx_r = __pyx_f_10MDAnalysis_3lib_6nsgrid_rvec_norm2(__pyx_v_dx); + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":257 + * dx[j] += self.c_pbcbox.box[i][j] + * + * cdef real fast_distance2(self, rvec a, rvec b) nogil: # <<<<<<<<<<<<<< + * """Distance calculation between two points + * for both PBC and non-PBC aware calculations + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":270 + * return rvec_norm2(dx) + * + * cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:, ::1] coords) nogil: # <<<<<<<<<<<<<< + * """Shifts all ``coords`` to an orthogonal brick shaped box + * + */ + +static __Pyx_memviewslice __pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_put_atoms_in_bbox(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, __Pyx_memviewslice __pyx_v_coords) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_m; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_d; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_natoms; + __Pyx_memviewslice __pyx_v_bbox_coords = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1 = { 0, 0, { 0 }, { 0 }, { 0 } }; + int __pyx_t_2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_3; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_4; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_5; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_6; + Py_ssize_t __pyx_t_7; + Py_ssize_t __pyx_t_8; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_9; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_10; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + Py_ssize_t __pyx_t_21; + Py_ssize_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("fast_put_atoms_in_bbox", 0); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + + /* "MDAnalysis/lib/nsgrid.pyx":271 + * + * cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:, ::1] coords) nogil: + * """Shifts all ``coords`` to an orthogonal brick shaped box # <<<<<<<<<<<<<< + * + * All the coordinates are brought into an orthogonal + */ + /*try:*/ { + + /* "MDAnalysis/lib/nsgrid.pyx":282 + * cdef real[:, ::1] bbox_coords + * + * natoms = coords.shape[0] # <<<<<<<<<<<<<< + * with gil: + * bbox_coords = coords.copy() + */ + __pyx_v_natoms = (__pyx_v_coords.shape[0]); + + /* "MDAnalysis/lib/nsgrid.pyx":283 + * + * natoms = coords.shape[0] + * with gil: # <<<<<<<<<<<<<< + * bbox_coords = coords.copy() + * + */ + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + /*try:*/ { + + /* "MDAnalysis/lib/nsgrid.pyx":284 + * natoms = coords.shape[0] + * with gil: + * bbox_coords = coords.copy() # <<<<<<<<<<<<<< + * + * if self.periodic: + */ + __pyx_t_1 = __pyx_memoryview_copy_slice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real_c(__pyx_v_coords); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 284, __pyx_L7_error) + __pyx_v_bbox_coords = __pyx_t_1; + __pyx_t_1.memview = NULL; + __pyx_t_1.data = NULL; + } + + /* "MDAnalysis/lib/nsgrid.pyx":283 + * + * natoms = coords.shape[0] + * with gil: # <<<<<<<<<<<<<< + * bbox_coords = coords.copy() + * + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + goto __pyx_L8; + } + __pyx_L7_error: { + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + goto __pyx_L4_error; + } + __pyx_L8:; + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":286 + * bbox_coords = coords.copy() + * + * if self.periodic: # <<<<<<<<<<<<<< + * if self.is_triclinic: + * for i in range(natoms): + */ + __pyx_t_2 = (__pyx_v_self->periodic != 0); + if (__pyx_t_2) { + + /* "MDAnalysis/lib/nsgrid.pyx":287 + * + * if self.periodic: + * if self.is_triclinic: # <<<<<<<<<<<<<< + * for i in range(natoms): + * for m in range(DIM - 1, -1, -1): + */ + __pyx_t_2 = (__pyx_v_self->is_triclinic != 0); + if (__pyx_t_2) { + + /* "MDAnalysis/lib/nsgrid.pyx":288 + * if self.periodic: + * if self.is_triclinic: + * for i in range(natoms): # <<<<<<<<<<<<<< + * for m in range(DIM - 1, -1, -1): + * while bbox_coords[i, m] < 0: + */ + __pyx_t_3 = __pyx_v_natoms; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "MDAnalysis/lib/nsgrid.pyx":289 + * if self.is_triclinic: + * for i in range(natoms): + * for m in range(DIM - 1, -1, -1): # <<<<<<<<<<<<<< + * while bbox_coords[i, m] < 0: + * for d in range(m+1): + */ + for (__pyx_t_6 = 2; __pyx_t_6 > -1L; __pyx_t_6-=1) { + __pyx_v_m = __pyx_t_6; + + /* "MDAnalysis/lib/nsgrid.pyx":290 + * for i in range(natoms): + * for m in range(DIM - 1, -1, -1): + * while bbox_coords[i, m] < 0: # <<<<<<<<<<<<<< + * for d in range(m+1): + * bbox_coords[i, d] += self.c_pbcbox.box[m][d] + */ + while (1) { + __pyx_t_7 = __pyx_v_i; + __pyx_t_8 = __pyx_v_m; + if (__pyx_t_7 < 0) __pyx_t_7 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_bbox_coords.shape[1]; + __pyx_t_2 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_7 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_8)) ))) < 0.0) != 0); + if (!__pyx_t_2) break; + + /* "MDAnalysis/lib/nsgrid.pyx":291 + * for m in range(DIM - 1, -1, -1): + * while bbox_coords[i, m] < 0: + * for d in range(m+1): # <<<<<<<<<<<<<< + * bbox_coords[i, d] += self.c_pbcbox.box[m][d] + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + */ + __pyx_t_9 = (__pyx_v_m + 1); + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_d = __pyx_t_11; + + /* "MDAnalysis/lib/nsgrid.pyx":292 + * while bbox_coords[i, m] < 0: + * for d in range(m+1): + * bbox_coords[i, d] += self.c_pbcbox.box[m][d] # <<<<<<<<<<<<<< + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + * for d in range(m+1): + */ + __pyx_t_12 = __pyx_v_i; + __pyx_t_13 = __pyx_v_d; + if (__pyx_t_12 < 0) __pyx_t_12 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_13 < 0) __pyx_t_13 += __pyx_v_bbox_coords.shape[1]; + *((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_12 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_13)) )) += ((__pyx_v_self->c_pbcbox.box[__pyx_v_m])[__pyx_v_d]); + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":293 + * for d in range(m+1): + * bbox_coords[i, d] += self.c_pbcbox.box[m][d] + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * for d in range(m+1): + * bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + */ + while (1) { + __pyx_t_14 = __pyx_v_i; + __pyx_t_15 = __pyx_v_m; + if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_bbox_coords.shape[1]; + __pyx_t_2 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_14 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_15)) ))) >= ((__pyx_v_self->c_pbcbox.box[__pyx_v_m])[__pyx_v_m])) != 0); + if (!__pyx_t_2) break; + + /* "MDAnalysis/lib/nsgrid.pyx":294 + * bbox_coords[i, d] += self.c_pbcbox.box[m][d] + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + * for d in range(m+1): # <<<<<<<<<<<<<< + * bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + * else: + */ + __pyx_t_9 = (__pyx_v_m + 1); + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_d = __pyx_t_11; + + /* "MDAnalysis/lib/nsgrid.pyx":295 + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + * for d in range(m+1): + * bbox_coords[i, d] -= self.c_pbcbox.box[m][d] # <<<<<<<<<<<<<< + * else: + * for i in range(natoms): + */ + __pyx_t_16 = __pyx_v_i; + __pyx_t_17 = __pyx_v_d; + if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_17 < 0) __pyx_t_17 += __pyx_v_bbox_coords.shape[1]; + *((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_16 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_17)) )) -= ((__pyx_v_self->c_pbcbox.box[__pyx_v_m])[__pyx_v_d]); + } + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":287 + * + * if self.periodic: + * if self.is_triclinic: # <<<<<<<<<<<<<< + * for i in range(natoms): + * for m in range(DIM - 1, -1, -1): + */ + goto __pyx_L10; + } + + /* "MDAnalysis/lib/nsgrid.pyx":297 + * bbox_coords[i, d] -= self.c_pbcbox.box[m][d] + * else: + * for i in range(natoms): # <<<<<<<<<<<<<< + * for m in range(DIM): + * while bbox_coords[i, m] < 0: + */ + /*else*/ { + __pyx_t_3 = __pyx_v_natoms; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "MDAnalysis/lib/nsgrid.pyx":298 + * else: + * for i in range(natoms): + * for m in range(DIM): # <<<<<<<<<<<<<< + * while bbox_coords[i, m] < 0: + * bbox_coords[i, m] += self.c_pbcbox.box[m][m] + */ + for (__pyx_t_6 = 0; __pyx_t_6 < 3; __pyx_t_6+=1) { + __pyx_v_m = __pyx_t_6; + + /* "MDAnalysis/lib/nsgrid.pyx":299 + * for i in range(natoms): + * for m in range(DIM): + * while bbox_coords[i, m] < 0: # <<<<<<<<<<<<<< + * bbox_coords[i, m] += self.c_pbcbox.box[m][m] + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + */ + while (1) { + __pyx_t_18 = __pyx_v_i; + __pyx_t_19 = __pyx_v_m; + if (__pyx_t_18 < 0) __pyx_t_18 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_19 < 0) __pyx_t_19 += __pyx_v_bbox_coords.shape[1]; + __pyx_t_2 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_18 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_19)) ))) < 0.0) != 0); + if (!__pyx_t_2) break; + + /* "MDAnalysis/lib/nsgrid.pyx":300 + * for m in range(DIM): + * while bbox_coords[i, m] < 0: + * bbox_coords[i, m] += self.c_pbcbox.box[m][m] # <<<<<<<<<<<<<< + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + * bbox_coords[i, m] -= self.c_pbcbox.box[m][m] + */ + __pyx_t_20 = __pyx_v_i; + __pyx_t_21 = __pyx_v_m; + if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_21 < 0) __pyx_t_21 += __pyx_v_bbox_coords.shape[1]; + *((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_20 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_21)) )) += ((__pyx_v_self->c_pbcbox.box[__pyx_v_m])[__pyx_v_m]); + } + + /* "MDAnalysis/lib/nsgrid.pyx":301 + * while bbox_coords[i, m] < 0: + * bbox_coords[i, m] += self.c_pbcbox.box[m][m] + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * bbox_coords[i, m] -= self.c_pbcbox.box[m][m] + * + */ + while (1) { + __pyx_t_22 = __pyx_v_i; + __pyx_t_23 = __pyx_v_m; + if (__pyx_t_22 < 0) __pyx_t_22 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_23 < 0) __pyx_t_23 += __pyx_v_bbox_coords.shape[1]; + __pyx_t_2 = (((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_22 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_23)) ))) >= ((__pyx_v_self->c_pbcbox.box[__pyx_v_m])[__pyx_v_m])) != 0); + if (!__pyx_t_2) break; + + /* "MDAnalysis/lib/nsgrid.pyx":302 + * bbox_coords[i, m] += self.c_pbcbox.box[m][m] + * while bbox_coords[i, m] >= self.c_pbcbox.box[m][m]: + * bbox_coords[i, m] -= self.c_pbcbox.box[m][m] # <<<<<<<<<<<<<< + * + * return bbox_coords + */ + __pyx_t_24 = __pyx_v_i; + __pyx_t_25 = __pyx_v_m; + if (__pyx_t_24 < 0) __pyx_t_24 += __pyx_v_bbox_coords.shape[0]; + if (__pyx_t_25 < 0) __pyx_t_25 += __pyx_v_bbox_coords.shape[1]; + *((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_bbox_coords.data + __pyx_t_24 * __pyx_v_bbox_coords.strides[0]) )) + __pyx_t_25)) )) -= ((__pyx_v_self->c_pbcbox.box[__pyx_v_m])[__pyx_v_m]); + } + } + } + } + __pyx_L10:; + + /* "MDAnalysis/lib/nsgrid.pyx":286 + * bbox_coords = coords.copy() + * + * if self.periodic: # <<<<<<<<<<<<<< + * if self.is_triclinic: + * for i in range(natoms): + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":304 + * bbox_coords[i, m] -= self.c_pbcbox.box[m][m] + * + * return bbox_coords # <<<<<<<<<<<<<< + * + * ######################### + */ + __PYX_INC_MEMVIEW(&__pyx_v_bbox_coords, 1); + __pyx_r = __pyx_v_bbox_coords; + goto __pyx_L3_return; + } + + /* "MDAnalysis/lib/nsgrid.pyx":271 + * + * cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:, ::1] coords) nogil: + * """Shifts all ``coords`` to an orthogonal brick shaped box # <<<<<<<<<<<<<< + * + * All the coordinates are brought into an orthogonal + */ + /*finally:*/ { + __pyx_L3_return: { + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + goto __pyx_L0; + } + __pyx_L4_error: { + #ifdef WITH_THREAD + __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + goto __pyx_L1_error; + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":270 + * return rvec_norm2(dx) + * + * cdef real[:, ::1]fast_put_atoms_in_bbox(self, real[:, ::1] coords) nogil: # <<<<<<<<<<<<<< + * """Shifts all ``coords`` to an orthogonal brick shaped box + * + */ + + /* function exit code */ + __Pyx_pretend_to_initialize(&__pyx_r); + goto __pyx_L0; + __pyx_L1_error:; + __PYX_XDEC_MEMVIEW(&__pyx_t_1, 0); + __pyx_r.data = NULL; + __pyx_r.memview = NULL; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.PBCBox.fast_put_atoms_in_bbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + + goto __pyx_L2; + __pyx_L0:; + if (unlikely(!__pyx_r.memview)) { + PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized"); + } + __pyx_L2:; + __PYX_XDEC_MEMVIEW(&__pyx_v_bbox_coords, 0); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox_4__reduce_cython__[] = "PBCBox.__reduce_cython__(self)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_4__reduce_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.PBCBox.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox_6__setstate_cython__[] = "PBCBox.__setstate_cython__(self, __pyx_state)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_6__setstate_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6PBCBox_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.PBCBox.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":331 + * cdef vector[real] pair_distances2_buffer + * + * def __init__(self, real cutoff, real[:, ::1]coords, real[:, ::1]searchcoords): # <<<<<<<<<<<<<< + * """ + * Parameters + */ + +/* Python wrapper */ +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults___init__[] = "\n Parameters\n ----------\n cutoff : float\n Specified cutoff distance\n coords : numpy.ndarray\n Array with coordinates of atoms of shape ``(N, 3)`` for\n ``N`` particles. ``dtype`` must be ``numpy.float32``\n searchcoords : numpy.ndarray\n Array with query coordinates. Shape must be ``(M, 3)``\n for ``M`` queries. ``dtype`` must be ``numpy.float32``\n "; +#if CYTHON_COMPILING_IN_CPYTHON +struct wrapperbase __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_9NSResults___init__; +#endif +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_cutoff; + __Pyx_memviewslice __pyx_v_coords = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_searchcoords = { 0, 0, { 0 }, { 0 }, { 0 } }; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_cutoff,&__pyx_n_s_coords,&__pyx_n_s_searchcoords,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_cutoff)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 1); __PYX_ERR(0, 331, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_searchcoords)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, 2); __PYX_ERR(0, 331, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 331, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v_cutoff = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_cutoff == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 331, __pyx_L3_error) + __pyx_v_coords = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_coords.memview)) __PYX_ERR(0, 331, __pyx_L3_error) + __pyx_v_searchcoords = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_searchcoords.memview)) __PYX_ERR(0, 331, __pyx_L3_error) + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 331, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults___init__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self), __pyx_v_cutoff, __pyx_v_coords, __pyx_v_searchcoords); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_cutoff, __Pyx_memviewslice __pyx_v_coords, __Pyx_memviewslice __pyx_v_searchcoords) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":345 + * """ + * + * self.cutoff = cutoff # <<<<<<<<<<<<<< + * self.coords = coords + * self.searchcoords = searchcoords + */ + __pyx_v_self->cutoff = __pyx_v_cutoff; + + /* "MDAnalysis/lib/nsgrid.pyx":346 + * + * self.cutoff = cutoff + * self.coords = coords # <<<<<<<<<<<<<< + * self.searchcoords = searchcoords + * + */ + __PYX_XDEC_MEMVIEW(&__pyx_v_self->coords, 0); + __PYX_INC_MEMVIEW(&__pyx_v_coords, 0); + __pyx_v_self->coords = __pyx_v_coords; + + /* "MDAnalysis/lib/nsgrid.pyx":347 + * self.cutoff = cutoff + * self.coords = coords + * self.searchcoords = searchcoords # <<<<<<<<<<<<<< + * + * self.npairs = 0 + */ + __PYX_XDEC_MEMVIEW(&__pyx_v_self->searchcoords, 0); + __PYX_INC_MEMVIEW(&__pyx_v_searchcoords, 0); + __pyx_v_self->searchcoords = __pyx_v_searchcoords; + + /* "MDAnalysis/lib/nsgrid.pyx":349 + * self.searchcoords = searchcoords + * + * self.npairs = 0 # <<<<<<<<<<<<<< + * + * cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: + */ + __pyx_v_self->npairs = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":331 + * cdef vector[real] pair_distances2_buffer + * + * def __init__(self, real cutoff, real[:, ::1]coords, real[:, ::1]searchcoords): # <<<<<<<<<<<<<< + * """ + * Parameters + */ + + /* function exit code */ + __pyx_r = 0; + __PYX_XDEC_MEMVIEW(&__pyx_v_coords, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_searchcoords, 1); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":351 + * self.npairs = 0 + * + * cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: # <<<<<<<<<<<<<< + * """Internal function to add pairs and distances to buffers + * + */ + +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_9NSResults_add_neighbors(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_beadid_i, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_beadid_j, __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_distance2) { + + /* "MDAnalysis/lib/nsgrid.pyx":361 + * """ + * + * self.pairs_buffer.push_back(beadid_i) # <<<<<<<<<<<<<< + * self.pairs_buffer.push_back(beadid_j) + * self.pair_distances2_buffer.push_back(distance2) + */ + try { + __pyx_v_self->pairs_buffer.push_back(__pyx_v_beadid_i); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 361, __pyx_L1_error) + } + + /* "MDAnalysis/lib/nsgrid.pyx":362 + * + * self.pairs_buffer.push_back(beadid_i) + * self.pairs_buffer.push_back(beadid_j) # <<<<<<<<<<<<<< + * self.pair_distances2_buffer.push_back(distance2) + * self.npairs += 1 + */ + try { + __pyx_v_self->pairs_buffer.push_back(__pyx_v_beadid_j); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 362, __pyx_L1_error) + } + + /* "MDAnalysis/lib/nsgrid.pyx":363 + * self.pairs_buffer.push_back(beadid_i) + * self.pairs_buffer.push_back(beadid_j) + * self.pair_distances2_buffer.push_back(distance2) # <<<<<<<<<<<<<< + * self.npairs += 1 + * + */ + try { + __pyx_v_self->pair_distances2_buffer.push_back(__pyx_v_distance2); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 363, __pyx_L1_error) + } + + /* "MDAnalysis/lib/nsgrid.pyx":364 + * self.pairs_buffer.push_back(beadid_j) + * self.pair_distances2_buffer.push_back(distance2) + * self.npairs += 1 # <<<<<<<<<<<<<< + * + * def get_pairs(self): + */ + __pyx_v_self->npairs = (__pyx_v_self->npairs + 1); + + /* "MDAnalysis/lib/nsgrid.pyx":351 + * self.npairs = 0 + * + * cdef void add_neighbors(self, ns_int beadid_i, ns_int beadid_j, real distance2) nogil: # <<<<<<<<<<<<<< + * """Internal function to add pairs and distances to buffers + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_WriteUnraisable("MDAnalysis.lib.nsgrid.NSResults.add_neighbors", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 1); + __pyx_L0:; +} + +/* "MDAnalysis/lib/nsgrid.pyx":366 + * self.npairs += 1 + * + * def get_pairs(self): # <<<<<<<<<<<<<< + * """Returns all the pairs within the desired cutoff distance + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_3get_pairs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_2get_pairs[] = "NSResults.get_pairs(self)\nReturns all the pairs within the desired cutoff distance\n\n Returns an array of shape ``(N, 2)``, where N is the number of pairs\n between ``reference`` and ``configuration`` within the specified distance.\n For every pair ``(i, j)``, ``reference[i]`` and ``configuration[j]`` are\n atom positions such that ``reference`` is the position of query\n atoms while ``configuration`` coontains the position of group of\n atoms used to search against the query atoms.\n\n Returns\n -------\n pairs : numpy.ndarray\n pairs of atom indices of neighbors from query\n and initial atom coordinates of shape ``(N, 2)``\n "; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_3get_pairs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_pairs (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_2get_pairs(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_2get_pairs(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __Pyx_RefNannySetupContext("get_pairs", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":383 + * """ + * + * return np.asarray(self.pairs_buffer, dtype=np.int64).reshape(self.npairs, 2) # <<<<<<<<<<<<<< + * + * def get_pair_distances(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(__pyx_v_self->pairs_buffer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_reshape); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyInt_From_npy_long(__pyx_v_self->npairs); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_4 = NULL; + __pyx_t_7 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_7 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_6, __pyx_int_2}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_6, __pyx_int_2}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_3 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = NULL; + } + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_3, 0+__pyx_t_7, __pyx_t_6); + __Pyx_INCREF(__pyx_int_2); + __Pyx_GIVEREF(__pyx_int_2); + PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_7, __pyx_int_2); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":366 + * self.npairs += 1 + * + * def get_pairs(self): # <<<<<<<<<<<<<< + * """Returns all the pairs within the desired cutoff distance + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.get_pairs", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":385 + * return np.asarray(self.pairs_buffer, dtype=np.int64).reshape(self.npairs, 2) + * + * def get_pair_distances(self): # <<<<<<<<<<<<<< + * """Returns all the distances corresponding to each pair of neighbors + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_5get_pair_distances(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_4get_pair_distances[] = "NSResults.get_pair_distances(self)\nReturns all the distances corresponding to each pair of neighbors\n\n Returns an array of shape ``N`` where N is the number of pairs\n among the query atoms and initial atoms within a specified distance.\n Every element ``[i]`` corresponds to the distance between\n ``pairs[i, 0]`` and ``pairs[i, 1]``, where pairs is the array\n obtained from ``get_pairs()``\n\n Returns\n -------\n distances : numpy.ndarray\n distances between pairs of query and initial\n atom coordinates of shape ``N``\n\n See Also\n --------\n MDAnalysis.lib.nsgrid.NSResults.get_pairs\n\n "; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_5get_pair_distances(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_pair_distances (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_4get_pair_distances(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_4get_pair_distances(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> __pyx_t_6; + __Pyx_RefNannySetupContext("get_pair_distances", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":406 + * """ + * + * self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) # <<<<<<<<<<<<<< + * return np.asarray(self.pair_distances_buffer) + * + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_sqrt); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_v_self->pair_distances2_buffer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + if (!__pyx_t_4) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_2}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_2}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL; + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 406, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_self->pair_distances_buffer = __pyx_t_6; + + /* "MDAnalysis/lib/nsgrid.pyx":407 + * + * self.pair_distances_buffer = np.sqrt(self.pair_distances2_buffer) + * return np.asarray(self.pair_distances_buffer) # <<<<<<<<<<<<<< + * + * cdef void create_buffers(self) nogil: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_asarray); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_v_self->pair_distances_buffer); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + } + } + if (!__pyx_t_2) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_3}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 407, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":385 + * return np.asarray(self.pairs_buffer, dtype=np.int64).reshape(self.npairs, 2) + * + * def get_pair_distances(self): # <<<<<<<<<<<<<< + * """Returns all the distances corresponding to each pair of neighbors + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.get_pair_distances", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":409 + * return np.asarray(self.pair_distances_buffer) + * + * cdef void create_buffers(self) nogil: # <<<<<<<<<<<<<< + * """ + * Creates buffers to get individual neighbour list and distances + */ + +static void __pyx_f_10MDAnalysis_3lib_6nsgrid_9NSResults_create_buffers(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_beadid_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_beadid_j; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_nsearch; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_dist2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_dist; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> __pyx_t_1; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> __pyx_t_2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_3; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_4; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_5; + __pyx_t_10MDAnalysis_3lib_6nsgrid_intvec __pyx_t_6; + __pyx_t_10MDAnalysis_3lib_6nsgrid_realvec __pyx_t_7; + + /* "MDAnalysis/lib/nsgrid.pyx":420 + * cdef real dist2, dist + * + * nsearch = self.searchcoords.shape[0] # <<<<<<<<<<<<<< + * + * self.indices_buffer = vector[intvec]() + */ + __pyx_v_nsearch = (__pyx_v_self->searchcoords.shape[0]); + + /* "MDAnalysis/lib/nsgrid.pyx":422 + * nsearch = self.searchcoords.shape[0] + * + * self.indices_buffer = vector[intvec]() # <<<<<<<<<<<<<< + * self.distances_buffer = vector[realvec]() + * + */ + try { + __pyx_t_1 = std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> (); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 422, __pyx_L1_error) + } + __pyx_v_self->indices_buffer = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":423 + * + * self.indices_buffer = vector[intvec]() + * self.distances_buffer = vector[realvec]() # <<<<<<<<<<<<<< + * + * # initialize rows corresponding to search + */ + try { + __pyx_t_2 = std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> (); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 423, __pyx_L1_error) + } + __pyx_v_self->distances_buffer = __pyx_t_2; + + /* "MDAnalysis/lib/nsgrid.pyx":426 + * + * # initialize rows corresponding to search + * for i in range(nsearch): # <<<<<<<<<<<<<< + * self.indices_buffer.push_back(intvec()) + * self.distances_buffer.push_back(realvec()) + */ + __pyx_t_3 = __pyx_v_nsearch; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "MDAnalysis/lib/nsgrid.pyx":427 + * # initialize rows corresponding to search + * for i in range(nsearch): + * self.indices_buffer.push_back(intvec()) # <<<<<<<<<<<<<< + * self.distances_buffer.push_back(realvec()) + * + */ + try { + __pyx_t_6 = __pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 427, __pyx_L1_error) + } + try { + __pyx_v_self->indices_buffer.push_back(__pyx_t_6); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 427, __pyx_L1_error) + } + + /* "MDAnalysis/lib/nsgrid.pyx":428 + * for i in range(nsearch): + * self.indices_buffer.push_back(intvec()) + * self.distances_buffer.push_back(realvec()) # <<<<<<<<<<<<<< + * + * for i in range(0, 2*self.npairs, 2): + */ + try { + __pyx_t_7 = __pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 428, __pyx_L1_error) + } + try { + __pyx_v_self->distances_buffer.push_back(__pyx_t_7); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 428, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":430 + * self.distances_buffer.push_back(realvec()) + * + * for i in range(0, 2*self.npairs, 2): # <<<<<<<<<<<<<< + * beadid_i = self.pairs_buffer[i] + * beadid_j = self.pairs_buffer[i + 1] + */ + __pyx_t_3 = (2 * __pyx_v_self->npairs); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=2) { + __pyx_v_i = __pyx_t_5; + + /* "MDAnalysis/lib/nsgrid.pyx":431 + * + * for i in range(0, 2*self.npairs, 2): + * beadid_i = self.pairs_buffer[i] # <<<<<<<<<<<<<< + * beadid_j = self.pairs_buffer[i + 1] + * + */ + __pyx_v_beadid_i = (__pyx_v_self->pairs_buffer[__pyx_v_i]); + + /* "MDAnalysis/lib/nsgrid.pyx":432 + * for i in range(0, 2*self.npairs, 2): + * beadid_i = self.pairs_buffer[i] + * beadid_j = self.pairs_buffer[i + 1] # <<<<<<<<<<<<<< + * + * dist2 = self.pair_distances2_buffer[i//2] + */ + __pyx_v_beadid_j = (__pyx_v_self->pairs_buffer[(__pyx_v_i + 1)]); + + /* "MDAnalysis/lib/nsgrid.pyx":434 + * beadid_j = self.pairs_buffer[i + 1] + * + * dist2 = self.pair_distances2_buffer[i//2] # <<<<<<<<<<<<<< + * + * self.indices_buffer[beadid_i].push_back(beadid_j) + */ + __pyx_v_dist2 = (__pyx_v_self->pair_distances2_buffer[(__pyx_v_i / 2)]); + + /* "MDAnalysis/lib/nsgrid.pyx":436 + * dist2 = self.pair_distances2_buffer[i//2] + * + * self.indices_buffer[beadid_i].push_back(beadid_j) # <<<<<<<<<<<<<< + * + * dist = sqrt(dist2) + */ + try { + (__pyx_v_self->indices_buffer[__pyx_v_beadid_i]).push_back(__pyx_v_beadid_j); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 436, __pyx_L1_error) + } + + /* "MDAnalysis/lib/nsgrid.pyx":438 + * self.indices_buffer[beadid_i].push_back(beadid_j) + * + * dist = sqrt(dist2) # <<<<<<<<<<<<<< + * + * self.distances_buffer[beadid_i].push_back(dist) + */ + __pyx_v_dist = sqrt(__pyx_v_dist2); + + /* "MDAnalysis/lib/nsgrid.pyx":440 + * dist = sqrt(dist2) + * + * self.distances_buffer[beadid_i].push_back(dist) # <<<<<<<<<<<<<< + * + * def get_indices(self): + */ + try { + (__pyx_v_self->distances_buffer[__pyx_v_beadid_i]).push_back(__pyx_v_dist); + } catch(...) { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_CppExn2PyErr(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + __PYX_ERR(0, 440, __pyx_L1_error) + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":409 + * return np.asarray(self.pair_distances_buffer) + * + * cdef void create_buffers(self) nogil: # <<<<<<<<<<<<<< + * """ + * Creates buffers to get individual neighbour list and distances + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_WriteUnraisable("MDAnalysis.lib.nsgrid.NSResults.create_buffers", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 1); + __pyx_L0:; +} + +/* "MDAnalysis/lib/nsgrid.pyx":442 + * self.distances_buffer[beadid_i].push_back(dist) + * + * def get_indices(self): # <<<<<<<<<<<<<< + * """Individual neighbours of query atom + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_7get_indices(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_6get_indices[] = "NSResults.get_indices(self)\nIndividual neighbours of query atom\n\n For every queried atom ``i``, an array of all its neighbors\n indices can be obtained from ``get_indices()[i]``\n\n Returns\n -------\n indices : list\n Indices of neighboring atoms.\n Every element i.e. ``indices[i]`` will be a list of\n size ``m`` where m is the number of neighbours of\n query atom[i].\n\n .. code-block:: python\n\n results = NSResults()\n indices = results.get_indices()\n\n ``indices[i]`` will output a list of neighboring\n atoms of ``atom[i]`` from query atoms ``atom``.\n ``indices[i][j]`` will give the atom-id of initial coordinates\n such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]``\n\n "; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_7get_indices(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_indices (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_6get_indices(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_6get_indices(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_indices", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":468 + * """ + * + * if self.indices_buffer.empty(): # <<<<<<<<<<<<<< + * self.create_buffers() + * return list(self.indices_buffer) + */ + __pyx_t_1 = (__pyx_v_self->indices_buffer.empty() != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":469 + * + * if self.indices_buffer.empty(): + * self.create_buffers() # <<<<<<<<<<<<<< + * return list(self.indices_buffer) + * + */ + ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self->__pyx_vtab)->create_buffers(__pyx_v_self); + + /* "MDAnalysis/lib/nsgrid.pyx":468 + * """ + * + * if self.indices_buffer.empty(): # <<<<<<<<<<<<<< + * self.create_buffers() + * return list(self.indices_buffer) + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":470 + * if self.indices_buffer.empty(): + * self.create_buffers() + * return list(self.indices_buffer) # <<<<<<<<<<<<<< + * + * def get_distances(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(__pyx_v_self->indices_buffer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 470, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_List(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 470, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":442 + * self.distances_buffer[beadid_i].push_back(dist) + * + * def get_indices(self): # <<<<<<<<<<<<<< + * """Individual neighbours of query atom + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.get_indices", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":472 + * return list(self.indices_buffer) + * + * def get_distances(self): # <<<<<<<<<<<<<< + * """Distance corresponding to individual neighbors of query atom + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_9get_distances(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_8get_distances[] = "NSResults.get_distances(self)\nDistance corresponding to individual neighbors of query atom\n\n For every queried atom ``i``, a list of all the distances\n from its neighboring atoms can be obtained from ``get_distances()[i]``.\n Every ``distance[i][j]`` will correspond\n to the distance between atoms ``atom[i]`` from the query\n atoms and ``atom[indices[j]]`` from the initialized\n set of coordinates, where ``indices`` can be obtained\n by ``get_indices()``\n\n Returns\n -------\n distances : np.ndarray\n Every element i.e. ``distances[i]`` will be an array of\n shape ``m`` where m is the number of neighbours of\n query atom[i].\n\n .. code-block:: python\n\n results = NSResults()\n distances = results.get_distances()\n\n\n atoms of ``atom[i]`` and query atoms ``atom``.\n ``indices[i][j]`` will give the atom-id of initial coordinates\n such that ``initial_atom[indices[i][j]]`` is a neighbor of ``atom[i]``\n\n See Also\n --------\n MDAnalysis.lib.nsgrid.NSResults.get_indices\n\n "; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_9get_distances(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_distances (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_8get_distances(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_8get_distances(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_distances", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":506 + * """ + * + * if self.distances_buffer.empty(): # <<<<<<<<<<<<<< + * self.create_buffers() + * return list(self.distances_buffer) + */ + __pyx_t_1 = (__pyx_v_self->distances_buffer.empty() != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":507 + * + * if self.distances_buffer.empty(): + * self.create_buffers() # <<<<<<<<<<<<<< + * return list(self.distances_buffer) + * + */ + ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self->__pyx_vtab)->create_buffers(__pyx_v_self); + + /* "MDAnalysis/lib/nsgrid.pyx":506 + * """ + * + * if self.distances_buffer.empty(): # <<<<<<<<<<<<<< + * self.create_buffers() + * return list(self.distances_buffer) + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":508 + * if self.distances_buffer.empty(): + * self.create_buffers() + * return list(self.distances_buffer) # <<<<<<<<<<<<<< + * + * cdef class NSGrid(object): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(__pyx_v_self->distances_buffer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PySequence_List(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 508, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":472 + * return list(self.indices_buffer) + * + * def get_distances(self): # <<<<<<<<<<<<<< + * """Distance corresponding to individual neighbors of query atom + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.get_distances", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":319 + * """ + * + * cdef readonly real cutoff # <<<<<<<<<<<<<< + * cdef ns_int npairs + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_6cutoff_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_6cutoff_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_6cutoff___get__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_6cutoff___get__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 319, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.cutoff.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.coords, self.cutoff, self.distances_buffer, self.indices_buffer, self.npairs, self.pair_distances2_buffer, self.pair_distances_buffer, self.pairs_buffer, self.searchcoords) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_10__reduce_cython__[] = "NSResults.__reduce_cython__(self)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_10__reduce_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_10__reduce_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self) { + int __pyx_v_use_setstate; + PyObject *__pyx_v_state = NULL; + PyObject *__pyx_v__dict = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + int __pyx_t_12; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * cdef bint use_setstate + * state = (self.coords, self.cutoff, self.distances_buffer, self.indices_buffer, self.npairs, self.pair_distances2_buffer, self.pair_distances_buffer, self.pairs_buffer, self.searchcoords) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_self->coords, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(__pyx_v_self->distances_buffer); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(__pyx_v_self->indices_buffer); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyInt_From_npy_long(__pyx_v_self->npairs); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_v_self->pair_distances2_buffer); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_v_self->pair_distances_buffer); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(__pyx_v_self->pairs_buffer); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = __pyx_memoryview_fromslice(__pyx_v_self->searchcoords, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = PyTuple_New(9); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_10, 4, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_10, 5, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_10, 6, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_10, 7, __pyx_t_8); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_10, 8, __pyx_t_9); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_8 = 0; + __pyx_t_9 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_10); + __pyx_t_10 = 0; + + /* "(tree fragment)":4 + * cdef bint use_setstate + * state = (self.coords, self.cutoff, self.distances_buffer, self.indices_buffer, self.npairs, self.pair_distances2_buffer, self.pair_distances_buffer, self.pairs_buffer, self.searchcoords) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_10 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_v__dict = __pyx_t_10; + __pyx_t_10 = 0; + + /* "(tree fragment)":5 + * state = (self.coords, self.cutoff, self.distances_buffer, self.indices_buffer, self.npairs, self.pair_distances2_buffer, self.pair_distances_buffer, self.pairs_buffer, self.searchcoords) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_11 = (__pyx_v__dict != Py_None); + __pyx_t_12 = (__pyx_t_11 != 0); + if (__pyx_t_12) { + + /* "(tree fragment)":6 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v__dict); + __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_10); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_9)); + __pyx_t_9 = 0; + + /* "(tree fragment)":7 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = False + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":5 + * state = (self.coords, self.cutoff, self.distances_buffer, self.indices_buffer, self.npairs, self.pair_distances2_buffer, self.pair_distances_buffer, self.pairs_buffer, self.searchcoords) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":9 + * use_setstate = True + * else: + * use_setstate = False # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, None), state + */ + /*else*/ { + __pyx_v_use_setstate = 0; + } + __pyx_L3:; + + /* "(tree fragment)":10 + * else: + * use_setstate = False + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, None), state + * else: + */ + __pyx_t_12 = (__pyx_v_use_setstate != 0); + if (__pyx_t_12) { + + /* "(tree fragment)":11 + * use_setstate = False + * if use_setstate: + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, state) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_NSResults); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_43303570); + __Pyx_GIVEREF(__pyx_int_43303570); + PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_int_43303570); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_10, 2, Py_None); + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_9); + __Pyx_GIVEREF(__pyx_t_10); + PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_v_state); + __pyx_t_9 = 0; + __pyx_t_10 = 0; + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L0; + + /* "(tree fragment)":10 + * else: + * use_setstate = False + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, None), state + * else: + */ + } + + /* "(tree fragment)":13 + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, None), state + * else: + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_NSResults__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_NSResults); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_43303570); + __Pyx_GIVEREF(__pyx_int_43303570); + PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_int_43303570); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_v_state); + __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8); + __Pyx_GIVEREF(__pyx_t_10); + PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_10); + __pyx_t_8 = 0; + __pyx_t_10 = 0; + __pyx_r = __pyx_t_9; + __pyx_t_9 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.coords, self.cutoff, self.distances_buffer, self.indices_buffer, self.npairs, self.pair_distances2_buffer, self.pair_distances_buffer, self.pairs_buffer, self.searchcoords) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":14 + * else: + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_NSResults__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_12__setstate_cython__[] = "NSResults.__setstate_cython__(self, __pyx_state)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_12__setstate_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_9NSResults_12__setstate_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":15 + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_NSResults__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 15, __pyx_L1_error) + __pyx_t_1 = __pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":14 + * else: + * return __pyx_unpickle_NSResults, (type(self), 0x294c292, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_NSResults__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSResults.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":549 + * cdef bint force # To negate the effects of optimized cutoff + * + * def __init__(self, ncoords, cutoff, PBCBox box, max_size, force=False): # <<<<<<<<<<<<<< + * """ + * Parameters + */ + +/* Python wrapper */ +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__[] = "\n Parameters\n ----------\n ncoords : int\n Number of coordinates to fill inside the brick shaped box\n cutoff : float\n Desired cutoff radius\n box : PBCBox\n Instance of :class:`PBCBox`\n max_size : int\n Maximum total number of cells\n force : boolean\n Optimizes cutoff if set to ``False`` [False]\n "; +#if CYTHON_COMPILING_IN_CPYTHON +struct wrapperbase __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__; +#endif +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_ncoords = 0; + PyObject *__pyx_v_cutoff = 0; + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_box = 0; + PyObject *__pyx_v_max_size = 0; + PyObject *__pyx_v_force = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_ncoords,&__pyx_n_s_cutoff,&__pyx_n_s_box,&__pyx_n_s_max_size,&__pyx_n_s_force,0}; + PyObject* values[5] = {0,0,0,0,0}; + values[4] = ((PyObject *)Py_False); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ncoords)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_cutoff)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 4, 5, 1); __PYX_ERR(0, 549, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 4, 5, 2); __PYX_ERR(0, 549, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_size)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 4, 5, 3); __PYX_ERR(0, 549, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_force); + if (value) { values[4] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 549, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_ncoords = values[0]; + __pyx_v_cutoff = values[1]; + __pyx_v_box = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)values[2]); + __pyx_v_max_size = values[3]; + __pyx_v_force = values[4]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 549, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSGrid.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_box), __pyx_ptype_10MDAnalysis_3lib_6nsgrid_PBCBox, 1, "box", 0))) __PYX_ERR(0, 549, __pyx_L1_error) + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self), __pyx_v_ncoords, __pyx_v_cutoff, __pyx_v_box, __pyx_v_max_size, __pyx_v_force); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, PyObject *__pyx_v_ncoords, PyObject *__pyx_v_cutoff, struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *__pyx_v_box, PyObject *__pyx_v_max_size, PyObject *__pyx_v_force) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_size; + CYTHON_UNUSED __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_nbeadspercell; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_bbox_vol; + int __pyx_r; + __Pyx_RefNannyDeclarations + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_1; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_10; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_11; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":570 + * cdef real bbox_vol + * + * self.ncoords = ncoords # <<<<<<<<<<<<<< + * + * # Calculate best cutoff + */ + __pyx_t_1 = __Pyx_PyInt_As_npy_long(__pyx_v_ncoords); if (unlikely((__pyx_t_1 == ((npy_long)-1)) && PyErr_Occurred())) __PYX_ERR(0, 570, __pyx_L1_error) + __pyx_v_self->ncoords = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":573 + * + * # Calculate best cutoff + * self.cutoff = cutoff # <<<<<<<<<<<<<< + * if not force: + * bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + */ + __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_v_cutoff); if (unlikely((__pyx_t_2 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 573, __pyx_L1_error) + __pyx_v_self->cutoff = __pyx_t_2; + + /* "MDAnalysis/lib/nsgrid.pyx":574 + * # Calculate best cutoff + * self.cutoff = cutoff + * if not force: # <<<<<<<<<<<<<< + * bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + * size = bbox_vol/cutoff**3 + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_force); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 574, __pyx_L1_error) + __pyx_t_4 = ((!__pyx_t_3) != 0); + if (__pyx_t_4) { + + /* "MDAnalysis/lib/nsgrid.pyx":575 + * self.cutoff = cutoff + * if not force: + * bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] # <<<<<<<<<<<<<< + * size = bbox_vol/cutoff**3 + * nbeadspercell = ncoords/size + */ + __pyx_v_bbox_vol = ((((__pyx_v_box->c_pbcbox.box[0])[0]) * ((__pyx_v_box->c_pbcbox.box[1])[1])) * ((__pyx_v_box->c_pbcbox.box[1])[1])); + + /* "MDAnalysis/lib/nsgrid.pyx":576 + * if not force: + * bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + * size = bbox_vol/cutoff**3 # <<<<<<<<<<<<<< + * nbeadspercell = ncoords/size + * while bbox_vol/self.cutoff**3 > max_size: + */ + __pyx_t_5 = PyFloat_FromDouble(__pyx_v_bbox_vol); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 576, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyNumber_Power(__pyx_v_cutoff, __pyx_int_3, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 576, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyNumber_Divide(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 576, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyInt_As_npy_long(__pyx_t_7); if (unlikely((__pyx_t_1 == ((npy_long)-1)) && PyErr_Occurred())) __PYX_ERR(0, 576, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_size = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":577 + * bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + * size = bbox_vol/cutoff**3 + * nbeadspercell = ncoords/size # <<<<<<<<<<<<<< + * while bbox_vol/self.cutoff**3 > max_size: + * self.cutoff *= 1.2 + */ + __pyx_t_7 = __Pyx_PyInt_From_npy_long(__pyx_v_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyNumber_Divide(__pyx_v_ncoords, __pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_1 = __Pyx_PyInt_As_npy_long(__pyx_t_6); if (unlikely((__pyx_t_1 == ((npy_long)-1)) && PyErr_Occurred())) __PYX_ERR(0, 577, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_nbeadspercell = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":578 + * size = bbox_vol/cutoff**3 + * nbeadspercell = ncoords/size + * while bbox_vol/self.cutoff**3 > max_size: # <<<<<<<<<<<<<< + * self.cutoff *= 1.2 + * + */ + while (1) { + __pyx_t_6 = PyFloat_FromDouble((__pyx_v_bbox_vol / powf(__pyx_v_self->cutoff, 3.0))); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 578, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_v_max_size, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 578, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 578, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (!__pyx_t_4) break; + + /* "MDAnalysis/lib/nsgrid.pyx":579 + * nbeadspercell = ncoords/size + * while bbox_vol/self.cutoff**3 > max_size: + * self.cutoff *= 1.2 # <<<<<<<<<<<<<< + * + * for i in range(DIM): + */ + __pyx_v_self->cutoff = (__pyx_v_self->cutoff * 1.2); + } + + /* "MDAnalysis/lib/nsgrid.pyx":574 + * # Calculate best cutoff + * self.cutoff = cutoff + * if not force: # <<<<<<<<<<<<<< + * bbox_vol = box.c_pbcbox.box[XX][XX] * box.c_pbcbox.box[YY][YY] * box.c_pbcbox.box[YY][YY] + * size = bbox_vol/cutoff**3 + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":581 + * self.cutoff *= 1.2 + * + * for i in range(DIM): # <<<<<<<<<<<<<< + * self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) + * self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] + */ + for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":582 + * + * for i in range(DIM): + * self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) # <<<<<<<<<<<<<< + * self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] + * self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] + */ + (__pyx_v_self->ncells[__pyx_v_i]) = ((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)(((__pyx_v_box->c_pbcbox.box[__pyx_v_i])[__pyx_v_i]) / __pyx_v_self->cutoff)); + + /* "MDAnalysis/lib/nsgrid.pyx":583 + * for i in range(DIM): + * self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) + * self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] # <<<<<<<<<<<<<< + * self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] + * + */ + (__pyx_v_self->cellsize[__pyx_v_i]) = (((__pyx_v_box->c_pbcbox.box[__pyx_v_i])[__pyx_v_i]) / (__pyx_v_self->ncells[__pyx_v_i])); + } + + /* "MDAnalysis/lib/nsgrid.pyx":584 + * self.ncells[i] = (box.c_pbcbox.box[i][i] / self.cutoff) + * self.cellsize[i] = box.c_pbcbox.box[i][i] / self.ncells[i] + * self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] # <<<<<<<<<<<<<< + * + * self.cell_offsets[XX] = 0 + */ + __pyx_v_self->size = (((__pyx_v_self->ncells[0]) * (__pyx_v_self->ncells[1])) * (__pyx_v_self->ncells[2])); + + /* "MDAnalysis/lib/nsgrid.pyx":586 + * self.size = self.ncells[XX] * self.ncells[YY] * self.ncells[ZZ] + * + * self.cell_offsets[XX] = 0 # <<<<<<<<<<<<<< + * self.cell_offsets[YY] = self.ncells[XX] + * self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] + */ + (__pyx_v_self->cell_offsets[0]) = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":587 + * + * self.cell_offsets[XX] = 0 + * self.cell_offsets[YY] = self.ncells[XX] # <<<<<<<<<<<<<< + * self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] + * + */ + (__pyx_v_self->cell_offsets[1]) = (__pyx_v_self->ncells[0]); + + /* "MDAnalysis/lib/nsgrid.pyx":588 + * self.cell_offsets[XX] = 0 + * self.cell_offsets[YY] = self.ncells[XX] + * self.cell_offsets[ZZ] = self.ncells[XX] * self.ncells[YY] # <<<<<<<<<<<<<< + * + * # Allocate memory + */ + (__pyx_v_self->cell_offsets[2]) = ((__pyx_v_self->ncells[0]) * (__pyx_v_self->ncells[1])); + + /* "MDAnalysis/lib/nsgrid.pyx":592 + * # Allocate memory + * # Number of beads in every cell + * self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) # <<<<<<<<<<<<<< + * if not self.nbeads: + * raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) + */ + __pyx_v_self->nbeads = ((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *)PyMem_Malloc(((sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)) * __pyx_v_self->size))); + + /* "MDAnalysis/lib/nsgrid.pyx":593 + * # Number of beads in every cell + * self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) + * if not self.nbeads: # <<<<<<<<<<<<<< + * raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) + * self.beadids = NULL + */ + __pyx_t_4 = ((!(__pyx_v_self->nbeads != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "MDAnalysis/lib/nsgrid.pyx":594 + * self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) + * if not self.nbeads: + * raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) # <<<<<<<<<<<<<< + * self.beadids = NULL + * # Cellindex of every bead + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Could_not_allocate_memory_from_N, __pyx_n_s_format); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyInt_FromSize_t(((sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)) * __pyx_v_self->size)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + } + } + if (!__pyx_t_8) { + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_5}; + __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_5}; + __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8); __pyx_t_8 = NULL; + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_builtin_MemoryError, __pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 594, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":593 + * # Number of beads in every cell + * self.nbeads = PyMem_Malloc(sizeof(ns_int) * self.size) + * if not self.nbeads: # <<<<<<<<<<<<<< + * raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) + * self.beadids = NULL + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":595 + * if not self.nbeads: + * raise MemoryError("Could not allocate memory from NSGrid.nbeads ({} bits requested)".format(sizeof(ns_int) * self.size)) + * self.beadids = NULL # <<<<<<<<<<<<<< + * # Cellindex of every bead + * self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) + */ + __pyx_v_self->beadids = NULL; + + /* "MDAnalysis/lib/nsgrid.pyx":597 + * self.beadids = NULL + * # Cellindex of every bead + * self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) # <<<<<<<<<<<<<< + * if not self.cellids: + * raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) + */ + __pyx_v_self->cellids = ((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *)PyMem_Malloc(((sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)) * __pyx_v_self->ncoords))); + + /* "MDAnalysis/lib/nsgrid.pyx":598 + * # Cellindex of every bead + * self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) + * if not self.cellids: # <<<<<<<<<<<<<< + * raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) + * self.nbeads_per_cell = 0 + */ + __pyx_t_4 = ((!(__pyx_v_self->cellids != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "MDAnalysis/lib/nsgrid.pyx":599 + * self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) + * if not self.cellids: + * raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) # <<<<<<<<<<<<<< + * self.nbeads_per_cell = 0 + * + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Could_not_allocate_memory_from_N_2, __pyx_n_s_format); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = __Pyx_PyInt_FromSize_t(((sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)) * __pyx_v_self->ncoords)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (!__pyx_t_5) { + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_9); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_6); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_9}; + __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_9}; + __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + { + __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_MemoryError, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 599, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_Raise(__pyx_t_7, 0, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __PYX_ERR(0, 599, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":598 + * # Cellindex of every bead + * self.cellids = PyMem_Malloc(sizeof(ns_int) * self.ncoords) + * if not self.cellids: # <<<<<<<<<<<<<< + * raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) + * self.nbeads_per_cell = 0 + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":600 + * if not self.cellids: + * raise MemoryError("Could not allocate memory from NSGrid.cellids ({} bits requested)".format(sizeof(ns_int) * self.ncoords)) + * self.nbeads_per_cell = 0 # <<<<<<<<<<<<<< + * + * for i in range(self.size): + */ + __pyx_v_self->nbeads_per_cell = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":602 + * self.nbeads_per_cell = 0 + * + * for i in range(self.size): # <<<<<<<<<<<<<< + * self.nbeads[i] = 0 + * + */ + __pyx_t_1 = __pyx_v_self->size; + __pyx_t_10 = __pyx_t_1; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "MDAnalysis/lib/nsgrid.pyx":603 + * + * for i in range(self.size): + * self.nbeads[i] = 0 # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + (__pyx_v_self->nbeads[__pyx_v_i]) = 0; + } + + /* "MDAnalysis/lib/nsgrid.pyx":549 + * cdef bint force # To negate the effects of optimized cutoff + * + * def __init__(self, ncoords, cutoff, PBCBox box, max_size, force=False): # <<<<<<<<<<<<<< + * """ + * Parameters + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSGrid.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":605 + * self.nbeads[i] = 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * PyMem_Free(self.nbeads) + * PyMem_Free(self.beadids) + */ + +/* Python wrapper */ +static void __pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_3__dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_2__dealloc__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_2__dealloc__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":606 + * + * def __dealloc__(self): + * PyMem_Free(self.nbeads) # <<<<<<<<<<<<<< + * PyMem_Free(self.beadids) + * PyMem_Free(self.cellids) + */ + PyMem_Free(__pyx_v_self->nbeads); + + /* "MDAnalysis/lib/nsgrid.pyx":607 + * def __dealloc__(self): + * PyMem_Free(self.nbeads) + * PyMem_Free(self.beadids) # <<<<<<<<<<<<<< + * PyMem_Free(self.cellids) + * + */ + PyMem_Free(__pyx_v_self->beadids); + + /* "MDAnalysis/lib/nsgrid.pyx":608 + * PyMem_Free(self.nbeads) + * PyMem_Free(self.beadids) + * PyMem_Free(self.cellids) # <<<<<<<<<<<<<< + * + * cdef ns_int coord2cellid(self, rvec coord) nogil: + */ + PyMem_Free(__pyx_v_self->cellids); + + /* "MDAnalysis/lib/nsgrid.pyx":605 + * self.nbeads[i] = 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * PyMem_Free(self.nbeads) + * PyMem_Free(self.beadids) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "MDAnalysis/lib/nsgrid.pyx":610 + * PyMem_Free(self.cellids) + * + * cdef ns_int coord2cellid(self, rvec coord) nogil: # <<<<<<<<<<<<<< + * """Finds the cell-id for the given coordinate inside the brick shaped box + * + */ + +static __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_coord2cellid(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *__pyx_v_coord) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_r; + + /* "MDAnalysis/lib/nsgrid.pyx":619 + * """ + * return (coord[ZZ] / self.cellsize[ZZ]) * (self.cell_offsets[ZZ]) +\ + * (coord[YY] / self.cellsize[YY]) * self.cell_offsets[YY] + \ # <<<<<<<<<<<<<< + * (coord[XX] / self.cellsize[XX]) + * + */ + __pyx_r = (((((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)((__pyx_v_coord[2]) / (__pyx_v_self->cellsize[2]))) * (__pyx_v_self->cell_offsets[2])) + (((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)((__pyx_v_coord[1]) / (__pyx_v_self->cellsize[1]))) * (__pyx_v_self->cell_offsets[1]))) + ((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)((__pyx_v_coord[0]) / (__pyx_v_self->cellsize[0])))); + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":610 + * PyMem_Free(self.cellids) + * + * cdef ns_int coord2cellid(self, rvec coord) nogil: # <<<<<<<<<<<<<< + * """Finds the cell-id for the given coordinate inside the brick shaped box + * + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":622 + * (coord[XX] / self.cellsize[XX]) + * + * cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: # <<<<<<<<<<<<<< + * """Finds actual cell position `(x, y, z)` from a cell-id + * """ + */ + +static int __pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_cellid2cellxyz(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_cellid, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *__pyx_v_cellxyz) { + int __pyx_r; + int __pyx_t_1; + + /* "MDAnalysis/lib/nsgrid.pyx":626 + * """ + * + * if cellid < 0: # <<<<<<<<<<<<<< + * return False + * if cellid >= self.size: + */ + __pyx_t_1 = ((__pyx_v_cellid < 0) != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":627 + * + * if cellid < 0: + * return False # <<<<<<<<<<<<<< + * if cellid >= self.size: + * return False + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":626 + * """ + * + * if cellid < 0: # <<<<<<<<<<<<<< + * return False + * if cellid >= self.size: + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":628 + * if cellid < 0: + * return False + * if cellid >= self.size: # <<<<<<<<<<<<<< + * return False + * + */ + __pyx_t_1 = ((__pyx_v_cellid >= __pyx_v_self->size) != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":629 + * return False + * if cellid >= self.size: + * return False # <<<<<<<<<<<<<< + * + * cellxyz[ZZ] = (cellid / self.cell_offsets[ZZ]) + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":628 + * if cellid < 0: + * return False + * if cellid >= self.size: # <<<<<<<<<<<<<< + * return False + * + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":631 + * return False + * + * cellxyz[ZZ] = (cellid / self.cell_offsets[ZZ]) # <<<<<<<<<<<<<< + * cellid -= cellxyz[ZZ] * self.cell_offsets[ZZ] + * + */ + (__pyx_v_cellxyz[2]) = ((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)(__pyx_v_cellid / (__pyx_v_self->cell_offsets[2]))); + + /* "MDAnalysis/lib/nsgrid.pyx":632 + * + * cellxyz[ZZ] = (cellid / self.cell_offsets[ZZ]) + * cellid -= cellxyz[ZZ] * self.cell_offsets[ZZ] # <<<<<<<<<<<<<< + * + * cellxyz[YY] = (cellid / self.cell_offsets[YY]) + */ + __pyx_v_cellid = (__pyx_v_cellid - ((__pyx_v_cellxyz[2]) * (__pyx_v_self->cell_offsets[2]))); + + /* "MDAnalysis/lib/nsgrid.pyx":634 + * cellid -= cellxyz[ZZ] * self.cell_offsets[ZZ] + * + * cellxyz[YY] = (cellid / self.cell_offsets[YY]) # <<<<<<<<<<<<<< + * cellxyz[XX] = cellid - cellxyz[YY] * self.cell_offsets[YY] + * + */ + (__pyx_v_cellxyz[1]) = ((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)(__pyx_v_cellid / (__pyx_v_self->cell_offsets[1]))); + + /* "MDAnalysis/lib/nsgrid.pyx":635 + * + * cellxyz[YY] = (cellid / self.cell_offsets[YY]) + * cellxyz[XX] = cellid - cellxyz[YY] * self.cell_offsets[YY] # <<<<<<<<<<<<<< + * + * return True + */ + (__pyx_v_cellxyz[0]) = (__pyx_v_cellid - ((__pyx_v_cellxyz[1]) * (__pyx_v_self->cell_offsets[1]))); + + /* "MDAnalysis/lib/nsgrid.pyx":637 + * cellxyz[XX] = cellid - cellxyz[YY] * self.cell_offsets[YY] + * + * return True # <<<<<<<<<<<<<< + * + * cdef fill_grid(self, real[:, ::1] coords): + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":622 + * (coord[XX] / self.cellsize[XX]) + * + * cdef bint cellid2cellxyz(self, ns_int cellid, ivec cellxyz) nogil: # <<<<<<<<<<<<<< + * """Finds actual cell position `(x, y, z)` from a cell-id + * """ + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":639 + * return True + * + * cdef fill_grid(self, real[:, ::1] coords): # <<<<<<<<<<<<<< + * """Sorts atoms into cells based on their position in the brick shaped box + * + */ + +static PyObject *__pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_fill_grid(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, __Pyx_memviewslice __pyx_v_coords) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_cellindex; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_ncoords; + __Pyx_memviewslice __pyx_v_beadcounts = { 0, 0, { 0 }, { 0 }, { 0 } }; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_memviewslice __pyx_t_6 = { 0, 0, { 0 }, { 0 }, { 0 } }; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_7; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_8; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_9; + Py_ssize_t __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_13; + int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + __Pyx_RefNannySetupContext("fill_grid", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":652 + * """ + * + * cdef ns_int i, cellindex = -1 # <<<<<<<<<<<<<< + * cdef ns_int ncoords = coords.shape[0] + * cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) + */ + __pyx_v_cellindex = -1L; + + /* "MDAnalysis/lib/nsgrid.pyx":653 + * + * cdef ns_int i, cellindex = -1 + * cdef ns_int ncoords = coords.shape[0] # <<<<<<<<<<<<<< + * cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) + * + */ + __pyx_v_ncoords = (__pyx_v_coords.shape[0]); + + /* "MDAnalysis/lib/nsgrid.pyx":654 + * cdef ns_int i, cellindex = -1 + * cdef ns_int ncoords = coords.shape[0] + * cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) # <<<<<<<<<<<<<< + * + * with nogil: + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_npy_long(__pyx_v_self->size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 654, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_beadcounts = __pyx_t_6; + __pyx_t_6.memview = NULL; + __pyx_t_6.data = NULL; + + /* "MDAnalysis/lib/nsgrid.pyx":656 + * cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) + * + * with nogil: # <<<<<<<<<<<<<< + * # Initialize buffers + * for i in range(self.size): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "MDAnalysis/lib/nsgrid.pyx":658 + * with nogil: + * # Initialize buffers + * for i in range(self.size): # <<<<<<<<<<<<<< + * beadcounts[i] = 0 + * + */ + __pyx_t_7 = __pyx_v_self->size; + __pyx_t_8 = __pyx_t_7; + for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { + __pyx_v_i = __pyx_t_9; + + /* "MDAnalysis/lib/nsgrid.pyx":659 + * # Initialize buffers + * for i in range(self.size): + * beadcounts[i] = 0 # <<<<<<<<<<<<<< + * + * # First loop: find cellindex for each bead + */ + __pyx_t_10 = __pyx_v_i; + if (__pyx_t_10 < 0) __pyx_t_10 += __pyx_v_beadcounts.shape[0]; + *((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *) ( /* dim=0 */ (__pyx_v_beadcounts.data + __pyx_t_10 * __pyx_v_beadcounts.strides[0]) )) = 0; + } + + /* "MDAnalysis/lib/nsgrid.pyx":662 + * + * # First loop: find cellindex for each bead + * for i in range(ncoords): # <<<<<<<<<<<<<< + * cellindex = self.coord2cellid(&coords[i, 0]) + * + */ + __pyx_t_7 = __pyx_v_ncoords; + __pyx_t_8 = __pyx_t_7; + for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { + __pyx_v_i = __pyx_t_9; + + /* "MDAnalysis/lib/nsgrid.pyx":663 + * # First loop: find cellindex for each bead + * for i in range(ncoords): + * cellindex = self.coord2cellid(&coords[i, 0]) # <<<<<<<<<<<<<< + * + * self.nbeads[cellindex] += 1 + */ + __pyx_t_11 = __pyx_v_i; + __pyx_t_12 = 0; + if (__pyx_t_11 < 0) __pyx_t_11 += __pyx_v_coords.shape[0]; + if (__pyx_t_12 < 0) __pyx_t_12 += __pyx_v_coords.shape[1]; + __pyx_v_cellindex = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self->__pyx_vtab)->coord2cellid(__pyx_v_self, (&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_coords.data + __pyx_t_11 * __pyx_v_coords.strides[0]) )) + __pyx_t_12)) ))))); + + /* "MDAnalysis/lib/nsgrid.pyx":665 + * cellindex = self.coord2cellid(&coords[i, 0]) + * + * self.nbeads[cellindex] += 1 # <<<<<<<<<<<<<< + * self.cellids[i] = cellindex + * + */ + __pyx_t_13 = __pyx_v_cellindex; + (__pyx_v_self->nbeads[__pyx_t_13]) = ((__pyx_v_self->nbeads[__pyx_t_13]) + 1); + + /* "MDAnalysis/lib/nsgrid.pyx":666 + * + * self.nbeads[cellindex] += 1 + * self.cellids[i] = cellindex # <<<<<<<<<<<<<< + * + * if self.nbeads[cellindex] > self.nbeads_per_cell: + */ + (__pyx_v_self->cellids[__pyx_v_i]) = __pyx_v_cellindex; + + /* "MDAnalysis/lib/nsgrid.pyx":668 + * self.cellids[i] = cellindex + * + * if self.nbeads[cellindex] > self.nbeads_per_cell: # <<<<<<<<<<<<<< + * self.nbeads_per_cell = self.nbeads[cellindex] + * + */ + __pyx_t_14 = (((__pyx_v_self->nbeads[__pyx_v_cellindex]) > __pyx_v_self->nbeads_per_cell) != 0); + if (__pyx_t_14) { + + /* "MDAnalysis/lib/nsgrid.pyx":669 + * + * if self.nbeads[cellindex] > self.nbeads_per_cell: + * self.nbeads_per_cell = self.nbeads[cellindex] # <<<<<<<<<<<<<< + * + * # Allocate memory + */ + __pyx_v_self->nbeads_per_cell = (__pyx_v_self->nbeads[__pyx_v_cellindex]); + + /* "MDAnalysis/lib/nsgrid.pyx":668 + * self.cellids[i] = cellindex + * + * if self.nbeads[cellindex] > self.nbeads_per_cell: # <<<<<<<<<<<<<< + * self.nbeads_per_cell = self.nbeads[cellindex] + * + */ + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":656 + * cdef ns_int[:] beadcounts = np.empty(self.size, dtype=np.int) + * + * with nogil: # <<<<<<<<<<<<<< + * # Initialize buffers + * for i in range(self.size): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":672 + * + * # Allocate memory + * self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) # np.empty((self.size, nbeads_max), dtype=np.int) # <<<<<<<<<<<<<< + * if not self.beadids: + * raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + */ + __pyx_v_self->beadids = ((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *)PyMem_Malloc((((sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)) * __pyx_v_self->size) * __pyx_v_self->nbeads_per_cell))); + + /* "MDAnalysis/lib/nsgrid.pyx":673 + * # Allocate memory + * self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) # np.empty((self.size, nbeads_max), dtype=np.int) + * if not self.beadids: # <<<<<<<<<<<<<< + * raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + * + */ + __pyx_t_14 = ((!(__pyx_v_self->beadids != 0)) != 0); + if (unlikely(__pyx_t_14)) { + + /* "MDAnalysis/lib/nsgrid.pyx":674 + * self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) # np.empty((self.size, nbeads_max), dtype=np.int) + * if not self.beadids: + * raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) # <<<<<<<<<<<<<< + * + * with nogil: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Could_not_allocate_memory_for_NS, __pyx_n_s_format); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_FromSize_t((((sizeof(__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)) * __pyx_v_self->size) * __pyx_v_self->nbeads_per_cell)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_2) { + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_5); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_3}; + __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_3}; + __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_MemoryError, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 674, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":673 + * # Allocate memory + * self.beadids = PyMem_Malloc(sizeof(ns_int) * self.size * self.nbeads_per_cell) # np.empty((self.size, nbeads_max), dtype=np.int) + * if not self.beadids: # <<<<<<<<<<<<<< + * raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + * + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":676 + * raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + * + * with nogil: # <<<<<<<<<<<<<< + * # Second loop: fill grid + * for i in range(ncoords): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "MDAnalysis/lib/nsgrid.pyx":678 + * with nogil: + * # Second loop: fill grid + * for i in range(ncoords): # <<<<<<<<<<<<<< + * + * # Add bead to grid cell + */ + __pyx_t_7 = __pyx_v_ncoords; + __pyx_t_8 = __pyx_t_7; + for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { + __pyx_v_i = __pyx_t_9; + + /* "MDAnalysis/lib/nsgrid.pyx":681 + * + * # Add bead to grid cell + * cellindex = self.cellids[i] # <<<<<<<<<<<<<< + * self.beadids[cellindex * self.nbeads_per_cell + beadcounts[cellindex]] = i + * beadcounts[cellindex] += 1 + */ + __pyx_v_cellindex = (__pyx_v_self->cellids[__pyx_v_i]); + + /* "MDAnalysis/lib/nsgrid.pyx":682 + * # Add bead to grid cell + * cellindex = self.cellids[i] + * self.beadids[cellindex * self.nbeads_per_cell + beadcounts[cellindex]] = i # <<<<<<<<<<<<<< + * beadcounts[cellindex] += 1 + * + */ + __pyx_t_15 = __pyx_v_cellindex; + if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_beadcounts.shape[0]; + (__pyx_v_self->beadids[((__pyx_v_cellindex * __pyx_v_self->nbeads_per_cell) + (*((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *) ( /* dim=0 */ (__pyx_v_beadcounts.data + __pyx_t_15 * __pyx_v_beadcounts.strides[0]) ))))]) = __pyx_v_i; + + /* "MDAnalysis/lib/nsgrid.pyx":683 + * cellindex = self.cellids[i] + * self.beadids[cellindex * self.nbeads_per_cell + beadcounts[cellindex]] = i + * beadcounts[cellindex] += 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_16 = __pyx_v_cellindex; + if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_v_beadcounts.shape[0]; + *((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *) ( /* dim=0 */ (__pyx_v_beadcounts.data + __pyx_t_16 * __pyx_v_beadcounts.strides[0]) )) += 1; + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":676 + * raise MemoryError("Could not allocate memory for NSGrid.beadids ({} bits requested)".format(sizeof(ns_int) * self.size * self.nbeads_per_cell)) + * + * with nogil: # <<<<<<<<<<<<<< + * # Second loop: fill grid + * for i in range(ncoords): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L14; + } + __pyx_L14:; + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":639 + * return True + * + * cdef fill_grid(self, real[:, ::1] coords): # <<<<<<<<<<<<<< + * """Sorts atoms into cells based on their position in the brick shaped box + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSGrid.fill_grid", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __PYX_XDEC_MEMVIEW(&__pyx_v_beadcounts, 1); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":537 + * """ + * + * cdef readonly real cutoff # cutoff # <<<<<<<<<<<<<< + * cdef ns_int size # total cells + * cdef ns_int ncoords # number of coordinates + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_6cutoff_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_6cutoff_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_6cutoff___get__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_6cutoff___get__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 537, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSGrid.cutoff.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6NSGrid_4__reduce_cython__[] = "NSGrid.__reduce_cython__(self)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_4__reduce_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSGrid.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6NSGrid_6__setstate_cython__[] = "NSGrid.__setstate_cython__(self, __pyx_state)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_6__setstate_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6NSGrid_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.NSGrid.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":704 + * cdef bint periodic + * + * def __init__(self, cutoff, coords, box, max_gridsize=5000, pbc=True): # <<<<<<<<<<<<<< + * """ + * Initialize the grid and sort the coordinates in respective + */ + +/* Python wrapper */ +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS___init__[] = "\n Initialize the grid and sort the coordinates in respective\n cells by shifting the coordinates in a brick shaped box.\n The brick shaped box is defined by :class:`PBCBox`\n and cuboidal grid is initialize by :class:`NSGrid`.\n If box is supplied, periodic shifts along box vectors are used\n to contain all the coordinates inside the brick shaped box.\n If box is not supplied, the range of coordinates i.e.\n ``[xmax, ymax, zmax] - [xmin, ymin, zmin]`` should be used\n to construct a pseudo box. Subsequently, the origin should also be\n shifted to ``[xmin, ymin, zmin]``. These arguments must be provided\n to the function.\n\n Parameters\n ----------\n cutoff : float\n Desired cutoff distance\n coords : numpy.ndarray\n atom coordinates of shape ``(N, 3)`` for ``N`` atoms.\n ``dtype=numpy.float32``. For Non-PBC calculations,\n all the coords must be within the bounding box specified\n by ``box``\n box : numpy.ndarray\n Box dimension of shape (6, ). The dimensions must be\n provided in the same format as returned\n by :attr:`MDAnalysis.coordinates.base.Timestep.dimensions`:\n ``[lx, ly, lz, alpha, beta, gamma]``. For non-PBC\n evaluations, provide an orthogonal bounding box\n (dtype = numpy.float32)\n max_gridsize : int\n maximum number of cells in the grid. This parameter\n can be tuned for superior performance.\n pbc : boolean\n Handle to switch periodic boundary conditions on/off [True]\n\n Note\n ----\n * ``pbc=False`` Only works for orthogonal boxes.\n * Care must be taken such that all particles are inside\n the bounding box as defined by the box argument for non-PBC\n calculations.\n * In case of Non-PBC calculations, a bounding box mu""st be provided\n to encompass all the coordinates as well as the search coordinates.\n The dimension should be similar to ``box`` argument but for\n an orthogonal box. For instance, one valid set of argument\n for ``box`` for the case of no PBC could be\n ``[10, 10, 10, 90, 90, 90]``\n * Following operations are advisable for non-PBC calculations\n\n ..code-block:: python\n\n lmax = all_coords.max(axis=0)\n lmin = all_coords.min(axis=0)\n pseudobox[:3] = 1.1*(lmax - lmin)\n pseudobox[3:] = 90.\n shift = all_coords.copy()\n shift -= lmin\n gridsearch = FastNS(max_cutoff, shift, box=pseudobox, pbc=False)\n\n "; +#if CYTHON_COMPILING_IN_CPYTHON +struct wrapperbase __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6FastNS___init__; +#endif +static int __pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_cutoff = 0; + PyObject *__pyx_v_coords = 0; + PyObject *__pyx_v_box = 0; + PyObject *__pyx_v_max_gridsize = 0; + PyObject *__pyx_v_pbc = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_cutoff,&__pyx_n_s_coords,&__pyx_n_s_box,&__pyx_n_s_max_gridsize,&__pyx_n_s_pbc,0}; + PyObject* values[5] = {0,0,0,0,0}; + values[3] = ((PyObject *)__pyx_int_5000); + values[4] = ((PyObject *)Py_True); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_cutoff)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 5, 1); __PYX_ERR(0, 704, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_box)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 5, 2); __PYX_ERR(0, 704, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_gridsize); + if (value) { values[3] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pbc); + if (value) { values[4] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 704, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_cutoff = values[0]; + __pyx_v_coords = values[1]; + __pyx_v_box = values[2]; + __pyx_v_max_gridsize = values[3]; + __pyx_v_pbc = values[4]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 704, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.FastNS.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS___init__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)__pyx_v_self), __pyx_v_cutoff, __pyx_v_coords, __pyx_v_box, __pyx_v_max_gridsize, __pyx_v_pbc); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS___init__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self, PyObject *__pyx_v_cutoff, PyObject *__pyx_v_coords, PyObject *__pyx_v_box, PyObject *__pyx_v_max_gridsize, PyObject *__pyx_v_pbc) { + PyObject *__pyx_v_triclinic_vectors = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + __Pyx_memviewslice __pyx_t_9 = { 0, 0, { 0 }, { 0 }, { 0 } }; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_10; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_11; + __Pyx_RefNannySetupContext("__init__", 0); + __Pyx_INCREF(__pyx_v_box); + + /* "MDAnalysis/lib/nsgrid.pyx":766 + * """ + * + * from MDAnalysis.lib.mdamath import triclinic_vectors # <<<<<<<<<<<<<< + * + * if (coords.ndim != 2 or coords.shape[1] != 3): + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_triclinic_vectors); + __Pyx_GIVEREF(__pyx_n_s_triclinic_vectors); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_triclinic_vectors); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_MDAnalysis_lib_mdamath, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_triclinic_vectors); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 766, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_triclinic_vectors = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":768 + * from MDAnalysis.lib.mdamath import triclinic_vectors + * + * if (coords.ndim != 2 or coords.shape[1] != 3): # <<<<<<<<<<<<<< + * raise ValueError("coords must have a shape of (n, 3), got {}." + * "".format(coords.shape)) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_coords, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_2, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 768, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 768, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_coords, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 768, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_3, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 768, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 768, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_3)) { + + /* "MDAnalysis/lib/nsgrid.pyx":770 + * if (coords.ndim != 2 or coords.shape[1] != 3): + * raise ValueError("coords must have a shape of (n, 3), got {}." + * "".format(coords.shape)) # <<<<<<<<<<<<<< + * + * if np.allclose(box[:3], 0.0): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_coords_must_have_a_shape_of_n_3, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 770, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_coords, __pyx_n_s_shape); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 770, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_6) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 770, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 770, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 770, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + { + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 770, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 770, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":769 + * + * if (coords.ndim != 2 or coords.shape[1] != 3): + * raise ValueError("coords must have a shape of (n, 3), got {}." # <<<<<<<<<<<<<< + * "".format(coords.shape)) + * + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 769, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 769, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":768 + * from MDAnalysis.lib.mdamath import triclinic_vectors + * + * if (coords.ndim != 2 or coords.shape[1] != 3): # <<<<<<<<<<<<<< + * raise ValueError("coords must have a shape of (n, 3), got {}." + * "".format(coords.shape)) + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":772 + * "".format(coords.shape)) + * + * if np.allclose(box[:3], 0.0): # <<<<<<<<<<<<<< + * raise ValueError("Any of the box dimensions cannot be 0") + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_allclose); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_box, 0, 3, NULL, NULL, &__pyx_slice__6, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_float_0_0}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_float_0_0}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_5) { + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + } + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_8, __pyx_t_1); + __Pyx_INCREF(__pyx_float_0_0); + __Pyx_GIVEREF(__pyx_float_0_0); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_8, __pyx_float_0_0); + __pyx_t_1 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(__pyx_t_3)) { + + /* "MDAnalysis/lib/nsgrid.pyx":773 + * + * if np.allclose(box[:3], 0.0): + * raise ValueError("Any of the box dimensions cannot be 0") # <<<<<<<<<<<<<< + * + * self.periodic = pbc + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 773, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 773, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":772 + * "".format(coords.shape)) + * + * if np.allclose(box[:3], 0.0): # <<<<<<<<<<<<<< + * raise ValueError("Any of the box dimensions cannot be 0") + * + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":775 + * raise ValueError("Any of the box dimensions cannot be 0") + * + * self.periodic = pbc # <<<<<<<<<<<<<< + * self.coords = coords.astype(np.float32, order='C', copy=True) + * + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_pbc); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 775, __pyx_L1_error) + __pyx_v_self->periodic = __pyx_t_3; + + /* "MDAnalysis/lib/nsgrid.pyx":776 + * + * self.periodic = pbc + * self.coords = coords.astype(np.float32, order='C', copy=True) # <<<<<<<<<<<<<< + * + * if box.shape != (3, 3): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_coords, __pyx_n_s_astype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_float32); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 776, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_copy, Py_True) < 0) __PYX_ERR(0, 776, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 776, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_XDEC_MEMVIEW(&__pyx_v_self->coords, 0); + __pyx_v_self->coords = __pyx_t_9; + __pyx_t_9.memview = NULL; + __pyx_t_9.data = NULL; + + /* "MDAnalysis/lib/nsgrid.pyx":778 + * self.coords = coords.astype(np.float32, order='C', copy=True) + * + * if box.shape != (3, 3): # <<<<<<<<<<<<<< + * box = triclinic_vectors(box) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_box, __pyx_n_s_shape); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 778, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = PyObject_RichCompare(__pyx_t_1, __pyx_tuple__8, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 778, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 778, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_3) { + + /* "MDAnalysis/lib/nsgrid.pyx":779 + * + * if box.shape != (3, 3): + * box = triclinic_vectors(box) # <<<<<<<<<<<<<< + * + * self.box = PBCBox(box, self.periodic) + */ + __Pyx_INCREF(__pyx_v_triclinic_vectors); + __pyx_t_1 = __pyx_v_triclinic_vectors; __pyx_t_7 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_7) { + __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_box); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_v_box}; + __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 779, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_6); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { + PyObject *__pyx_temp[2] = {__pyx_t_7, __pyx_v_box}; + __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 779, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_6); + } else + #endif + { + __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7); __pyx_t_7 = NULL; + __Pyx_INCREF(__pyx_v_box); + __Pyx_GIVEREF(__pyx_v_box); + PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_v_box); + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_box, __pyx_t_6); + __pyx_t_6 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":778 + * self.coords = coords.astype(np.float32, order='C', copy=True) + * + * if box.shape != (3, 3): # <<<<<<<<<<<<<< + * box = triclinic_vectors(box) + * + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":781 + * box = triclinic_vectors(box) + * + * self.box = PBCBox(box, self.periodic) # <<<<<<<<<<<<<< + * + * if cutoff < 0: + */ + __pyx_t_6 = __Pyx_PyBool_FromLong(__pyx_v_self->periodic); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 781, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 781, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_box); + __Pyx_GIVEREF(__pyx_v_box); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_box); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10MDAnalysis_3lib_6nsgrid_PBCBox), __pyx_t_1, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 781, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_GIVEREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_v_self->box); + __Pyx_DECREF(((PyObject *)__pyx_v_self->box)); + __pyx_v_self->box = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_t_6); + __pyx_t_6 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":783 + * self.box = PBCBox(box, self.periodic) + * + * if cutoff < 0: # <<<<<<<<<<<<<< + * raise ValueError("Cutoff must be positive!") + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: + */ + __pyx_t_6 = PyObject_RichCompare(__pyx_v_cutoff, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 783, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 783, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_t_3)) { + + /* "MDAnalysis/lib/nsgrid.pyx":784 + * + * if cutoff < 0: + * raise ValueError("Cutoff must be positive!") # <<<<<<<<<<<<<< + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: + * raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") + */ + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 784, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(0, 784, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":783 + * self.box = PBCBox(box, self.periodic) + * + * if cutoff < 0: # <<<<<<<<<<<<<< + * raise ValueError("Cutoff must be positive!") + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":785 + * if cutoff < 0: + * raise ValueError("Cutoff must be positive!") + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: # <<<<<<<<<<<<<< + * raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") + * + */ + __pyx_t_6 = PyNumber_Multiply(__pyx_v_cutoff, __pyx_v_cutoff); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 785, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->box->c_pbcbox.max_cutoff2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 785, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 785, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 785, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(__pyx_t_3)) { + + /* "MDAnalysis/lib/nsgrid.pyx":786 + * raise ValueError("Cutoff must be positive!") + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: + * raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") # <<<<<<<<<<<<<< + * + * self.coords_bbox = self.box.fast_put_atoms_in_bbox(self.coords) + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 786, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":785 + * if cutoff < 0: + * raise ValueError("Cutoff must be positive!") + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: # <<<<<<<<<<<<<< + * raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") + * + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":788 + * raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") + * + * self.coords_bbox = self.box.fast_put_atoms_in_bbox(self.coords) # <<<<<<<<<<<<<< + * + * self.cutoff = cutoff + */ + __pyx_t_9 = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self->box->__pyx_vtab)->fast_put_atoms_in_bbox(__pyx_v_self->box, __pyx_v_self->coords); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 788, __pyx_L1_error) + __PYX_XDEC_MEMVIEW(&__pyx_v_self->coords_bbox, 0); + __pyx_v_self->coords_bbox = __pyx_t_9; + __pyx_t_9.memview = NULL; + __pyx_t_9.data = NULL; + + /* "MDAnalysis/lib/nsgrid.pyx":790 + * self.coords_bbox = self.box.fast_put_atoms_in_bbox(self.coords) + * + * self.cutoff = cutoff # <<<<<<<<<<<<<< + * self.max_gridsize = max_gridsize + * # Note that self.cutoff might be different from self.grid.cutoff + */ + __pyx_t_10 = __pyx_PyFloat_AsFloat(__pyx_v_cutoff); if (unlikely((__pyx_t_10 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 790, __pyx_L1_error) + __pyx_v_self->cutoff = __pyx_t_10; + + /* "MDAnalysis/lib/nsgrid.pyx":791 + * + * self.cutoff = cutoff + * self.max_gridsize = max_gridsize # <<<<<<<<<<<<<< + * # Note that self.cutoff might be different from self.grid.cutoff + * # due to optimization + */ + __pyx_t_11 = __Pyx_PyInt_As_npy_long(__pyx_v_max_gridsize); if (unlikely((__pyx_t_11 == ((npy_long)-1)) && PyErr_Occurred())) __PYX_ERR(0, 791, __pyx_L1_error) + __pyx_v_self->max_gridsize = __pyx_t_11; + + /* "MDAnalysis/lib/nsgrid.pyx":794 + * # Note that self.cutoff might be different from self.grid.cutoff + * # due to optimization + * self.grid = NSGrid(self.coords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) # <<<<<<<<<<<<<< + * + * self.grid.fill_grid(self.coords_bbox) + */ + __pyx_t_2 = PyInt_FromSsize_t((__pyx_v_self->coords_bbox.shape[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 794, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 794, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyInt_From_npy_long(__pyx_v_self->max_gridsize); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 794, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 794, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1); + __Pyx_INCREF(((PyObject *)__pyx_v_self->box)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self->box)); + PyTuple_SET_ITEM(__pyx_t_7, 2, ((PyObject *)__pyx_v_self->box)); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_6); + __pyx_t_2 = 0; + __pyx_t_1 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSGrid), __pyx_t_7, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 794, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GIVEREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_v_self->grid); + __Pyx_DECREF(((PyObject *)__pyx_v_self->grid)); + __pyx_v_self->grid = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_t_6); + __pyx_t_6 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":796 + * self.grid = NSGrid(self.coords_bbox.shape[0], self.cutoff, self.box, self.max_gridsize) + * + * self.grid.fill_grid(self.coords_bbox) # <<<<<<<<<<<<<< + * + * def search(self, search_coords): + */ + __pyx_t_6 = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self->grid->__pyx_vtab)->fill_grid(__pyx_v_self->grid, __pyx_v_self->coords_bbox); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 796, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":704 + * cdef bint periodic + * + * def __init__(self, cutoff, coords, box, max_gridsize=5000, pbc=True): # <<<<<<<<<<<<<< + * """ + * Initialize the grid and sort the coordinates in respective + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.FastNS.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_triclinic_vectors); + __Pyx_XDECREF(__pyx_v_box); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":798 + * self.grid.fill_grid(self.coords_bbox) + * + * def search(self, search_coords): # <<<<<<<<<<<<<< + * """Search a group of atoms against initialized coordinates + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_3search(PyObject *__pyx_v_self, PyObject *__pyx_v_search_coords); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_2search[] = "FastNS.search(self, search_coords)\nSearch a group of atoms against initialized coordinates\n\n Creates a new grid with the query atoms and searches\n against the initialized coordinates. The search is exclusive\n i.e. only the pairs ``(i, j)`` such that ``atom[i]`` from query atoms\n and ``atom[j]`` from the initialized set of coordinates is stored as\n neighbors.\n\n PBC-aware/non PBC-aware calculations are automatically enabled during\n the instantiation of :class:FastNS.\n\n Parameters\n ----------\n search_coords : numpy.ndarray\n Query coordinates of shape ``(N, 3)`` where\n ``N`` is the number of queries\n\n Returns\n -------\n results : NSResults object\n The object from :class:NSResults\n contains ``get_indices``, ``get_distances``.\n ``get_pairs``, ``get_pair_distances``\n\n Note\n ----\n For non-PBC aware calculations, the current implementation doesn't work\n if any of the query coordinates is beyond the range specified in\n ``box`` in :func:`MDAnalysis.lib.nsgrid.FastNS`.\n\n See Also\n --------\n MDAnalysis.lib.nsgrid.NSResults\n\n "; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_3search(PyObject *__pyx_v_self, PyObject *__pyx_v_search_coords) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("search (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_2search(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)__pyx_v_self), ((PyObject *)__pyx_v_search_coords)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_2search(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self, PyObject *__pyx_v_search_coords) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_j; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_size_search; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_d; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_m; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_current_beadid; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_bid; + CYTHON_UNUSED __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_cellindex; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_cellindex_probe; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_xi; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_yi; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_zi; + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_results = 0; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_d2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_rvec __pyx_v_probe; + __Pyx_memviewslice __pyx_v_searchcoords = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_memviewslice __pyx_v_searchcoords_bbox = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *__pyx_v_searchgrid = 0; + int __pyx_v_check; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_cutoff2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_npairs; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + __Pyx_memviewslice __pyx_t_8 = { 0, 0, { 0 }, { 0 }, { 0 } }; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_9; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_10; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_11; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_12; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_13; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + Py_ssize_t __pyx_t_17; + Py_ssize_t __pyx_t_18; + Py_ssize_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_21; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_22; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_23; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_24; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_25; + Py_ssize_t __pyx_t_26; + Py_ssize_t __pyx_t_27; + Py_ssize_t __pyx_t_28; + Py_ssize_t __pyx_t_29; + __Pyx_RefNannySetupContext("search", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":851 + * cdef bint check + * + * cdef real cutoff2 = self.cutoff * self.cutoff # <<<<<<<<<<<<<< + * cdef ns_int npairs = 0 + * + */ + __pyx_v_cutoff2 = (__pyx_v_self->cutoff * __pyx_v_self->cutoff); + + /* "MDAnalysis/lib/nsgrid.pyx":852 + * + * cdef real cutoff2 = self.cutoff * self.cutoff + * cdef ns_int npairs = 0 # <<<<<<<<<<<<<< + * + * if (search_coords.ndim != 2 or search_coords.shape[1] != 3): + */ + __pyx_v_npairs = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":854 + * cdef ns_int npairs = 0 + * + * if (search_coords.ndim != 2 or search_coords.shape[1] != 3): # <<<<<<<<<<<<<< + * raise ValueError("search_coords must have a shape of (n, 3), got " + * "{}.".format(search_coords.shape)) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_search_coords, __pyx_n_s_ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 854, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_int_2, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 854, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 854, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (!__pyx_t_4) { + } else { + __pyx_t_1 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_search_coords, __pyx_n_s_shape); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 854, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 854, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_int_3, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 854, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 854, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = __pyx_t_4; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "MDAnalysis/lib/nsgrid.pyx":856 + * if (search_coords.ndim != 2 or search_coords.shape[1] != 3): + * raise ValueError("search_coords must have a shape of (n, 3), got " + * "{}.".format(search_coords.shape)) # <<<<<<<<<<<<<< + * + * # Generate another grid to search + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_search_coords_must_have_a_shape, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 856, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_search_coords, __pyx_n_s_shape); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 856, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_6) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 856, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 856, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 856, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + { + __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 856, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 856, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":855 + * + * if (search_coords.ndim != 2 or search_coords.shape[1] != 3): + * raise ValueError("search_coords must have a shape of (n, 3), got " # <<<<<<<<<<<<<< + * "{}.".format(search_coords.shape)) + * + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 855, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(0, 855, __pyx_L1_error) + + /* "MDAnalysis/lib/nsgrid.pyx":854 + * cdef ns_int npairs = 0 + * + * if (search_coords.ndim != 2 or search_coords.shape[1] != 3): # <<<<<<<<<<<<<< + * raise ValueError("search_coords must have a shape of (n, 3), got " + * "{}.".format(search_coords.shape)) + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":859 + * + * # Generate another grid to search + * searchcoords = search_coords.astype(np.float32, order='C', copy=False) # <<<<<<<<<<<<<< + * searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) + * searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_search_coords, __pyx_n_s_astype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 859, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 859, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_float32); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 859, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 859, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7); + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 859, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_order, __pyx_n_s_C) < 0) __PYX_ERR(0, 859, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_copy, Py_False) < 0) __PYX_ERR(0, 859, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 859, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 859, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_searchcoords = __pyx_t_8; + __pyx_t_8.memview = NULL; + __pyx_t_8.data = NULL; + + /* "MDAnalysis/lib/nsgrid.pyx":860 + * # Generate another grid to search + * searchcoords = search_coords.astype(np.float32, order='C', copy=False) + * searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) # <<<<<<<<<<<<<< + * searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) + * searchgrid.fill_grid(searchcoords_bbox) + */ + __pyx_t_8 = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self->box->__pyx_vtab)->fast_put_atoms_in_bbox(__pyx_v_self->box, __pyx_v_searchcoords); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 860, __pyx_L1_error) + __pyx_v_searchcoords_bbox = __pyx_t_8; + __pyx_t_8.memview = NULL; + __pyx_t_8.data = NULL; + + /* "MDAnalysis/lib/nsgrid.pyx":861 + * searchcoords = search_coords.astype(np.float32, order='C', copy=False) + * searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) + * searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) # <<<<<<<<<<<<<< + * searchgrid.fill_grid(searchcoords_bbox) + * + */ + __pyx_t_5 = PyInt_FromSsize_t((__pyx_v_searchcoords_bbox.shape[0])); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 861, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = PyFloat_FromDouble(__pyx_v_self->grid->cutoff); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 861, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyInt_From_npy_long(__pyx_v_self->max_gridsize); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 861, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 861, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_7); + __Pyx_INCREF(((PyObject *)__pyx_v_self->box)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self->box)); + PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->box)); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_3); + __pyx_t_5 = 0; + __pyx_t_7 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 861, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_force, Py_True) < 0) __PYX_ERR(0, 861, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSGrid), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 861, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_searchgrid = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_t_7); + __pyx_t_7 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":862 + * searchcoords_bbox = self.box.fast_put_atoms_in_bbox(searchcoords) + * searchgrid = NSGrid(searchcoords_bbox.shape[0], self.grid.cutoff, self.box, self.max_gridsize, force=True) + * searchgrid.fill_grid(searchcoords_bbox) # <<<<<<<<<<<<<< + * + * size_search = searchcoords.shape[0] + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_searchgrid->__pyx_vtab)->fill_grid(__pyx_v_searchgrid, __pyx_v_searchcoords_bbox); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 862, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":864 + * searchgrid.fill_grid(searchcoords_bbox) + * + * size_search = searchcoords.shape[0] # <<<<<<<<<<<<<< + * + * results = NSResults(self.cutoff, self.coords, searchcoords) + */ + __pyx_v_size_search = (__pyx_v_searchcoords.shape[0]); + + /* "MDAnalysis/lib/nsgrid.pyx":866 + * size_search = searchcoords.shape[0] + * + * results = NSResults(self.cutoff, self.coords, searchcoords) # <<<<<<<<<<<<<< + * + * with nogil: + */ + __pyx_t_7 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 866, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_self->coords, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 866, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_searchcoords, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 866, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 866, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_2); + __pyx_t_7 = 0; + __pyx_t_3 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSResults), __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 866, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_results = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":868 + * results = NSResults(self.cutoff, self.coords, searchcoords) + * + * with nogil: # <<<<<<<<<<<<<< + * for i in range(size_search): + * # Start with first search coordinate + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "MDAnalysis/lib/nsgrid.pyx":869 + * + * with nogil: + * for i in range(size_search): # <<<<<<<<<<<<<< + * # Start with first search coordinate + * current_beadid = i + */ + __pyx_t_9 = __pyx_v_size_search; + __pyx_t_10 = __pyx_t_9; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "MDAnalysis/lib/nsgrid.pyx":871 + * for i in range(size_search): + * # Start with first search coordinate + * current_beadid = i # <<<<<<<<<<<<<< + * # find the cellindex of the coordinate + * cellindex = searchgrid.cellids[current_beadid] + */ + __pyx_v_current_beadid = __pyx_v_i; + + /* "MDAnalysis/lib/nsgrid.pyx":873 + * current_beadid = i + * # find the cellindex of the coordinate + * cellindex = searchgrid.cellids[current_beadid] # <<<<<<<<<<<<<< + * for xi in range(DIM): + * for yi in range(DIM): + */ + __pyx_v_cellindex = (__pyx_v_searchgrid->cellids[__pyx_v_current_beadid]); + + /* "MDAnalysis/lib/nsgrid.pyx":874 + * # find the cellindex of the coordinate + * cellindex = searchgrid.cellids[current_beadid] + * for xi in range(DIM): # <<<<<<<<<<<<<< + * for yi in range(DIM): + * for zi in range(DIM): + */ + for (__pyx_t_12 = 0; __pyx_t_12 < 3; __pyx_t_12+=1) { + __pyx_v_xi = __pyx_t_12; + + /* "MDAnalysis/lib/nsgrid.pyx":875 + * cellindex = searchgrid.cellids[current_beadid] + * for xi in range(DIM): + * for yi in range(DIM): # <<<<<<<<<<<<<< + * for zi in range(DIM): + * check = True + */ + for (__pyx_t_13 = 0; __pyx_t_13 < 3; __pyx_t_13+=1) { + __pyx_v_yi = __pyx_t_13; + + /* "MDAnalysis/lib/nsgrid.pyx":876 + * for xi in range(DIM): + * for yi in range(DIM): + * for zi in range(DIM): # <<<<<<<<<<<<<< + * check = True + * #Probe the search coordinates in a brick shaped box + */ + for (__pyx_t_14 = 0; __pyx_t_14 < 3; __pyx_t_14+=1) { + __pyx_v_zi = __pyx_t_14; + + /* "MDAnalysis/lib/nsgrid.pyx":877 + * for yi in range(DIM): + * for zi in range(DIM): + * check = True # <<<<<<<<<<<<<< + * #Probe the search coordinates in a brick shaped box + * probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] + */ + __pyx_v_check = 1; + + /* "MDAnalysis/lib/nsgrid.pyx":879 + * check = True + * #Probe the search coordinates in a brick shaped box + * probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] # <<<<<<<<<<<<<< + * probe[YY] = searchcoords_bbox[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] + * probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] + */ + __pyx_t_15 = __pyx_v_current_beadid; + __pyx_t_16 = 0; + if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_searchcoords_bbox.shape[0]; + if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_v_searchcoords_bbox.shape[1]; + (__pyx_v_probe[0]) = ((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_searchcoords_bbox.data + __pyx_t_15 * __pyx_v_searchcoords_bbox.strides[0]) )) + __pyx_t_16)) ))) + ((__pyx_v_xi - 1) * (__pyx_v_searchgrid->cellsize[0]))); + + /* "MDAnalysis/lib/nsgrid.pyx":880 + * #Probe the search coordinates in a brick shaped box + * probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] + * probe[YY] = searchcoords_bbox[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] # <<<<<<<<<<<<<< + * probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] + * # Make sure the probe coordinates is inside the brick-shaped box + */ + __pyx_t_17 = __pyx_v_current_beadid; + __pyx_t_18 = 1; + if (__pyx_t_17 < 0) __pyx_t_17 += __pyx_v_searchcoords_bbox.shape[0]; + if (__pyx_t_18 < 0) __pyx_t_18 += __pyx_v_searchcoords_bbox.shape[1]; + (__pyx_v_probe[1]) = ((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_searchcoords_bbox.data + __pyx_t_17 * __pyx_v_searchcoords_bbox.strides[0]) )) + __pyx_t_18)) ))) + ((__pyx_v_yi - 1) * (__pyx_v_searchgrid->cellsize[1]))); + + /* "MDAnalysis/lib/nsgrid.pyx":881 + * probe[XX] = searchcoords_bbox[current_beadid, XX] + (xi - 1) * searchgrid.cellsize[XX] + * probe[YY] = searchcoords_bbox[current_beadid, YY] + (yi - 1) * searchgrid.cellsize[YY] + * probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] # <<<<<<<<<<<<<< + * # Make sure the probe coordinates is inside the brick-shaped box + * if self.periodic: + */ + __pyx_t_19 = __pyx_v_current_beadid; + __pyx_t_20 = 2; + if (__pyx_t_19 < 0) __pyx_t_19 += __pyx_v_searchcoords_bbox.shape[0]; + if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_v_searchcoords_bbox.shape[1]; + (__pyx_v_probe[2]) = ((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_searchcoords_bbox.data + __pyx_t_19 * __pyx_v_searchcoords_bbox.strides[0]) )) + __pyx_t_20)) ))) + ((__pyx_v_zi - 1) * (__pyx_v_searchgrid->cellsize[2]))); + + /* "MDAnalysis/lib/nsgrid.pyx":883 + * probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] + * # Make sure the probe coordinates is inside the brick-shaped box + * if self.periodic: # <<<<<<<<<<<<<< + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: + */ + __pyx_t_1 = (__pyx_v_self->periodic != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":884 + * # Make sure the probe coordinates is inside the brick-shaped box + * if self.periodic: + * for m in range(DIM - 1, -1, -1): # <<<<<<<<<<<<<< + * while probe[m] < 0: + * for d in range(m+1): + */ + for (__pyx_t_21 = 2; __pyx_t_21 > -1L; __pyx_t_21-=1) { + __pyx_v_m = __pyx_t_21; + + /* "MDAnalysis/lib/nsgrid.pyx":885 + * if self.periodic: + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: # <<<<<<<<<<<<<< + * for d in range(m+1): + * probe[d] += self.box.c_pbcbox.box[m][d] + */ + while (1) { + __pyx_t_1 = (((__pyx_v_probe[__pyx_v_m]) < 0.0) != 0); + if (!__pyx_t_1) break; + + /* "MDAnalysis/lib/nsgrid.pyx":886 + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: + * for d in range(m+1): # <<<<<<<<<<<<<< + * probe[d] += self.box.c_pbcbox.box[m][d] + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + */ + __pyx_t_22 = (__pyx_v_m + 1); + __pyx_t_23 = __pyx_t_22; + for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) { + __pyx_v_d = __pyx_t_24; + + /* "MDAnalysis/lib/nsgrid.pyx":887 + * while probe[m] < 0: + * for d in range(m+1): + * probe[d] += self.box.c_pbcbox.box[m][d] # <<<<<<<<<<<<<< + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + * for d in range(m+1): + */ + __pyx_t_25 = __pyx_v_d; + (__pyx_v_probe[__pyx_t_25]) = ((__pyx_v_probe[__pyx_t_25]) + ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_d])); + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":888 + * for d in range(m+1): + * probe[d] += self.box.c_pbcbox.box[m][d] + * while probe[m] >= self.box.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * for d in range(m+1): + * probe[d] -= self.box.c_pbcbox.box[m][d] + */ + while (1) { + __pyx_t_1 = (((__pyx_v_probe[__pyx_v_m]) >= ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_m])) != 0); + if (!__pyx_t_1) break; + + /* "MDAnalysis/lib/nsgrid.pyx":889 + * probe[d] += self.box.c_pbcbox.box[m][d] + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + * for d in range(m+1): # <<<<<<<<<<<<<< + * probe[d] -= self.box.c_pbcbox.box[m][d] + * else: + */ + __pyx_t_22 = (__pyx_v_m + 1); + __pyx_t_23 = __pyx_t_22; + for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) { + __pyx_v_d = __pyx_t_24; + + /* "MDAnalysis/lib/nsgrid.pyx":890 + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + * for d in range(m+1): + * probe[d] -= self.box.c_pbcbox.box[m][d] # <<<<<<<<<<<<<< + * else: + * for m in range(DIM -1, -1, -1): + */ + __pyx_t_25 = __pyx_v_d; + (__pyx_v_probe[__pyx_t_25]) = ((__pyx_v_probe[__pyx_t_25]) - ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_d])); + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":883 + * probe[ZZ] = searchcoords_bbox[current_beadid, ZZ] + (zi - 1) * searchgrid.cellsize[ZZ] + * # Make sure the probe coordinates is inside the brick-shaped box + * if self.periodic: # <<<<<<<<<<<<<< + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: + */ + goto __pyx_L17; + } + + /* "MDAnalysis/lib/nsgrid.pyx":892 + * probe[d] -= self.box.c_pbcbox.box[m][d] + * else: + * for m in range(DIM -1, -1, -1): # <<<<<<<<<<<<<< + * if probe[m] < 0: + * check = False + */ + /*else*/ { + for (__pyx_t_21 = 2; __pyx_t_21 > -1L; __pyx_t_21-=1) { + __pyx_v_m = __pyx_t_21; + + /* "MDAnalysis/lib/nsgrid.pyx":893 + * else: + * for m in range(DIM -1, -1, -1): + * if probe[m] < 0: # <<<<<<<<<<<<<< + * check = False + * break + */ + __pyx_t_1 = (((__pyx_v_probe[__pyx_v_m]) < 0.0) != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":894 + * for m in range(DIM -1, -1, -1): + * if probe[m] < 0: + * check = False # <<<<<<<<<<<<<< + * break + * if probe[m] > self.box.c_pbcbox.box[m][m]: + */ + __pyx_v_check = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":895 + * if probe[m] < 0: + * check = False + * break # <<<<<<<<<<<<<< + * if probe[m] > self.box.c_pbcbox.box[m][m]: + * check = False + */ + goto __pyx_L29_break; + + /* "MDAnalysis/lib/nsgrid.pyx":893 + * else: + * for m in range(DIM -1, -1, -1): + * if probe[m] < 0: # <<<<<<<<<<<<<< + * check = False + * break + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":896 + * check = False + * break + * if probe[m] > self.box.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * check = False + * break + */ + __pyx_t_1 = (((__pyx_v_probe[__pyx_v_m]) > ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_m])) != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":897 + * break + * if probe[m] > self.box.c_pbcbox.box[m][m]: + * check = False # <<<<<<<<<<<<<< + * break + * if not check: + */ + __pyx_v_check = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":898 + * if probe[m] > self.box.c_pbcbox.box[m][m]: + * check = False + * break # <<<<<<<<<<<<<< + * if not check: + * continue + */ + goto __pyx_L29_break; + + /* "MDAnalysis/lib/nsgrid.pyx":896 + * check = False + * break + * if probe[m] > self.box.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * check = False + * break + */ + } + } + __pyx_L29_break:; + } + __pyx_L17:; + + /* "MDAnalysis/lib/nsgrid.pyx":899 + * check = False + * break + * if not check: # <<<<<<<<<<<<<< + * continue + * # Get the cell index corresponding to the probe + */ + __pyx_t_1 = ((!(__pyx_v_check != 0)) != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":900 + * break + * if not check: + * continue # <<<<<<<<<<<<<< + * # Get the cell index corresponding to the probe + * cellindex_probe = self.grid.coord2cellid(probe) + */ + goto __pyx_L15_continue; + + /* "MDAnalysis/lib/nsgrid.pyx":899 + * check = False + * break + * if not check: # <<<<<<<<<<<<<< + * continue + * # Get the cell index corresponding to the probe + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":902 + * continue + * # Get the cell index corresponding to the probe + * cellindex_probe = self.grid.coord2cellid(probe) # <<<<<<<<<<<<<< + * # for this cellindex search in grid + * for j in range(self.grid.nbeads[cellindex_probe]): + */ + __pyx_v_cellindex_probe = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self->grid->__pyx_vtab)->coord2cellid(__pyx_v_self->grid, __pyx_v_probe); + + /* "MDAnalysis/lib/nsgrid.pyx":904 + * cellindex_probe = self.grid.coord2cellid(probe) + * # for this cellindex search in grid + * for j in range(self.grid.nbeads[cellindex_probe]): # <<<<<<<<<<<<<< + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + * # find distance between search coords[i] and coords[bid] + */ + __pyx_t_21 = (__pyx_v_self->grid->nbeads[__pyx_v_cellindex_probe]); + __pyx_t_22 = __pyx_t_21; + for (__pyx_t_23 = 0; __pyx_t_23 < __pyx_t_22; __pyx_t_23+=1) { + __pyx_v_j = __pyx_t_23; + + /* "MDAnalysis/lib/nsgrid.pyx":905 + * # for this cellindex search in grid + * for j in range(self.grid.nbeads[cellindex_probe]): + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] # <<<<<<<<<<<<<< + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + */ + __pyx_v_bid = (__pyx_v_self->grid->beadids[((__pyx_v_cellindex_probe * __pyx_v_self->grid->nbeads_per_cell) + __pyx_v_j)]); + + /* "MDAnalysis/lib/nsgrid.pyx":907 + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) # <<<<<<<<<<<<<< + * if d2 < cutoff2: + * results.add_neighbors(current_beadid, bid, d2) + */ + __pyx_t_26 = __pyx_v_current_beadid; + __pyx_t_27 = 0; + if (__pyx_t_26 < 0) __pyx_t_26 += __pyx_v_searchcoords_bbox.shape[0]; + if (__pyx_t_27 < 0) __pyx_t_27 += __pyx_v_searchcoords_bbox.shape[1]; + __pyx_t_28 = __pyx_v_bid; + __pyx_t_29 = 0; + if (__pyx_t_28 < 0) __pyx_t_28 += __pyx_v_self->coords_bbox.shape[0]; + if (__pyx_t_29 < 0) __pyx_t_29 += __pyx_v_self->coords_bbox.shape[1]; + __pyx_v_d2 = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self->box->__pyx_vtab)->fast_distance2(__pyx_v_self->box, (&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_searchcoords_bbox.data + __pyx_t_26 * __pyx_v_searchcoords_bbox.strides[0]) )) + __pyx_t_27)) )))), (&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_self->coords_bbox.data + __pyx_t_28 * __pyx_v_self->coords_bbox.strides[0]) )) + __pyx_t_29)) ))))); + + /* "MDAnalysis/lib/nsgrid.pyx":908 + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + * if d2 < cutoff2: # <<<<<<<<<<<<<< + * results.add_neighbors(current_beadid, bid, d2) + * npairs += 1 + */ + __pyx_t_1 = ((__pyx_v_d2 < __pyx_v_cutoff2) != 0); + if (__pyx_t_1) { + + /* "MDAnalysis/lib/nsgrid.pyx":909 + * d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + * if d2 < cutoff2: + * results.add_neighbors(current_beadid, bid, d2) # <<<<<<<<<<<<<< + * npairs += 1 + * return results + */ + ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_results->__pyx_vtab)->add_neighbors(__pyx_v_results, __pyx_v_current_beadid, __pyx_v_bid, __pyx_v_d2); + + /* "MDAnalysis/lib/nsgrid.pyx":910 + * if d2 < cutoff2: + * results.add_neighbors(current_beadid, bid, d2) + * npairs += 1 # <<<<<<<<<<<<<< + * return results + * + */ + __pyx_v_npairs = (__pyx_v_npairs + 1); + + /* "MDAnalysis/lib/nsgrid.pyx":908 + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&searchcoords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + * if d2 < cutoff2: # <<<<<<<<<<<<<< + * results.add_neighbors(current_beadid, bid, d2) + * npairs += 1 + */ + } + } + __pyx_L15_continue:; + } + } + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":868 + * results = NSResults(self.cutoff, self.coords, searchcoords) + * + * with nogil: # <<<<<<<<<<<<<< + * for i in range(size_search): + * # Start with first search coordinate + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L8; + } + __pyx_L8:; + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":911 + * results.add_neighbors(current_beadid, bid, d2) + * npairs += 1 + * return results # <<<<<<<<<<<<<< + * + * def self_search(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_results)); + __pyx_r = ((PyObject *)__pyx_v_results); + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":798 + * self.grid.fill_grid(self.coords_bbox) + * + * def search(self, search_coords): # <<<<<<<<<<<<<< + * """Search a group of atoms against initialized coordinates + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.FastNS.search", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_results); + __PYX_XDEC_MEMVIEW(&__pyx_v_searchcoords, 1); + __PYX_XDEC_MEMVIEW(&__pyx_v_searchcoords_bbox, 1); + __Pyx_XDECREF((PyObject *)__pyx_v_searchgrid); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":913 + * return results + * + * def self_search(self): # <<<<<<<<<<<<<< + * """Searches all the pairs within the initialized coordinates + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_5self_search(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_4self_search[] = "FastNS.self_search(self)\nSearches all the pairs within the initialized coordinates\n\n All the pairs among the initialized coordinates are registered\n in hald the time. Although the algorithm is still the same, but\n the distance checks can be reduced to half in this particular case\n as every pair need not be evaluated twice.\n\n Returns\n -------\n results : NSResults object\n The object from :class:NSResults\n contains ``get_indices``, ``get_distances``.\n ``get_pairs``, ``get_pair_distances``\n\n See Also\n --------\n MDAnalysis.lib.nsgrid.NSResults\n\n "; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_5self_search(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("self_search (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_4self_search(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_4self_search(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_i; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_j; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_size_search; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_d; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_m; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_current_beadid; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_bid; + CYTHON_UNUSED __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_cellindex; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_cellindex_probe; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_xi; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_yi; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_zi; + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v_results = 0; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_d2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_rvec __pyx_v_probe; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_v_cutoff2; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_v_npairs; + int __pyx_v_check; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_5; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_6; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_7; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_8; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_9; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_10; + Py_ssize_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + Py_ssize_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + Py_ssize_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + int __pyx_t_17; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_18; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_19; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_20; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_21; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_22; + Py_ssize_t __pyx_t_23; + Py_ssize_t __pyx_t_24; + Py_ssize_t __pyx_t_25; + Py_ssize_t __pyx_t_26; + int __pyx_t_27; + __Pyx_RefNannySetupContext("self_search", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":944 + * cdef rvec probe + * + * cdef real cutoff2 = self.cutoff * self.cutoff # <<<<<<<<<<<<<< + * cdef ns_int npairs = 0 + * cdef bint check + */ + __pyx_v_cutoff2 = (__pyx_v_self->cutoff * __pyx_v_self->cutoff); + + /* "MDAnalysis/lib/nsgrid.pyx":945 + * + * cdef real cutoff2 = self.cutoff * self.cutoff + * cdef ns_int npairs = 0 # <<<<<<<<<<<<<< + * cdef bint check + * + */ + __pyx_v_npairs = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":948 + * cdef bint check + * + * size_search = self.coords.shape[0] # <<<<<<<<<<<<<< + * + * results = NSResults(self.cutoff, self.coords, self.coords) + */ + __pyx_v_size_search = (__pyx_v_self->coords.shape[0]); + + /* "MDAnalysis/lib/nsgrid.pyx":950 + * size_search = self.coords.shape[0] + * + * results = NSResults(self.cutoff, self.coords, self.coords) # <<<<<<<<<<<<<< + * + * with nogil: + */ + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 950, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_self->coords, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 950, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_self->coords, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 950, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 950, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSResults), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 950, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_results = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":952 + * results = NSResults(self.cutoff, self.coords, self.coords) + * + * with nogil: # <<<<<<<<<<<<<< + * for i in range(size_search): + * # Start with first search coordinate + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + __Pyx_FastGIL_Remember(); + #endif + /*try:*/ { + + /* "MDAnalysis/lib/nsgrid.pyx":953 + * + * with nogil: + * for i in range(size_search): # <<<<<<<<<<<<<< + * # Start with first search coordinate + * current_beadid = i + */ + __pyx_t_5 = __pyx_v_size_search; + __pyx_t_6 = __pyx_t_5; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "MDAnalysis/lib/nsgrid.pyx":955 + * for i in range(size_search): + * # Start with first search coordinate + * current_beadid = i # <<<<<<<<<<<<<< + * # find the cellindex of the coordinate + * cellindex = self.grid.cellids[current_beadid] + */ + __pyx_v_current_beadid = __pyx_v_i; + + /* "MDAnalysis/lib/nsgrid.pyx":957 + * current_beadid = i + * # find the cellindex of the coordinate + * cellindex = self.grid.cellids[current_beadid] # <<<<<<<<<<<<<< + * for xi in range(DIM): + * for yi in range(DIM): + */ + __pyx_v_cellindex = (__pyx_v_self->grid->cellids[__pyx_v_current_beadid]); + + /* "MDAnalysis/lib/nsgrid.pyx":958 + * # find the cellindex of the coordinate + * cellindex = self.grid.cellids[current_beadid] + * for xi in range(DIM): # <<<<<<<<<<<<<< + * for yi in range(DIM): + * for zi in range(DIM): + */ + for (__pyx_t_8 = 0; __pyx_t_8 < 3; __pyx_t_8+=1) { + __pyx_v_xi = __pyx_t_8; + + /* "MDAnalysis/lib/nsgrid.pyx":959 + * cellindex = self.grid.cellids[current_beadid] + * for xi in range(DIM): + * for yi in range(DIM): # <<<<<<<<<<<<<< + * for zi in range(DIM): + * check = True + */ + for (__pyx_t_9 = 0; __pyx_t_9 < 3; __pyx_t_9+=1) { + __pyx_v_yi = __pyx_t_9; + + /* "MDAnalysis/lib/nsgrid.pyx":960 + * for xi in range(DIM): + * for yi in range(DIM): + * for zi in range(DIM): # <<<<<<<<<<<<<< + * check = True + * # Calculate and/or reinitialize shifted coordinates + */ + for (__pyx_t_10 = 0; __pyx_t_10 < 3; __pyx_t_10+=1) { + __pyx_v_zi = __pyx_t_10; + + /* "MDAnalysis/lib/nsgrid.pyx":961 + * for yi in range(DIM): + * for zi in range(DIM): + * check = True # <<<<<<<<<<<<<< + * # Calculate and/or reinitialize shifted coordinates + * # Probe the search coordinates in a brick shaped box + */ + __pyx_v_check = 1; + + /* "MDAnalysis/lib/nsgrid.pyx":964 + * # Calculate and/or reinitialize shifted coordinates + * # Probe the search coordinates in a brick shaped box + * probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] # <<<<<<<<<<<<<< + * probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] + * probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] + */ + __pyx_t_11 = __pyx_v_current_beadid; + __pyx_t_12 = 0; + if (__pyx_t_11 < 0) __pyx_t_11 += __pyx_v_self->coords_bbox.shape[0]; + if (__pyx_t_12 < 0) __pyx_t_12 += __pyx_v_self->coords_bbox.shape[1]; + (__pyx_v_probe[0]) = ((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_self->coords_bbox.data + __pyx_t_11 * __pyx_v_self->coords_bbox.strides[0]) )) + __pyx_t_12)) ))) + ((__pyx_v_xi - 1) * (__pyx_v_self->grid->cellsize[0]))); + + /* "MDAnalysis/lib/nsgrid.pyx":965 + * # Probe the search coordinates in a brick shaped box + * probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] + * probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] # <<<<<<<<<<<<<< + * probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] + * # Make sure the shifted coordinates is inside the brick-shaped box + */ + __pyx_t_13 = __pyx_v_current_beadid; + __pyx_t_14 = 1; + if (__pyx_t_13 < 0) __pyx_t_13 += __pyx_v_self->coords_bbox.shape[0]; + if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_self->coords_bbox.shape[1]; + (__pyx_v_probe[1]) = ((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_self->coords_bbox.data + __pyx_t_13 * __pyx_v_self->coords_bbox.strides[0]) )) + __pyx_t_14)) ))) + ((__pyx_v_yi - 1) * (__pyx_v_self->grid->cellsize[1]))); + + /* "MDAnalysis/lib/nsgrid.pyx":966 + * probe[XX] = self.coords_bbox[current_beadid, XX] + (xi - 1) * self.grid.cellsize[XX] + * probe[YY] = self.coords_bbox[current_beadid, YY] + (yi - 1) * self.grid.cellsize[YY] + * probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] # <<<<<<<<<<<<<< + * # Make sure the shifted coordinates is inside the brick-shaped box + * if self.periodic: + */ + __pyx_t_15 = __pyx_v_current_beadid; + __pyx_t_16 = 2; + if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_self->coords_bbox.shape[0]; + if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_v_self->coords_bbox.shape[1]; + (__pyx_v_probe[2]) = ((*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_self->coords_bbox.data + __pyx_t_15 * __pyx_v_self->coords_bbox.strides[0]) )) + __pyx_t_16)) ))) + ((__pyx_v_zi - 1) * (__pyx_v_self->grid->cellsize[2]))); + + /* "MDAnalysis/lib/nsgrid.pyx":968 + * probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] + * # Make sure the shifted coordinates is inside the brick-shaped box + * if self.periodic: # <<<<<<<<<<<<<< + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: + */ + __pyx_t_17 = (__pyx_v_self->periodic != 0); + if (__pyx_t_17) { + + /* "MDAnalysis/lib/nsgrid.pyx":969 + * # Make sure the shifted coordinates is inside the brick-shaped box + * if self.periodic: + * for m in range(DIM - 1, -1, -1): # <<<<<<<<<<<<<< + * while probe[m] < 0: + * for d in range(m+1): + */ + for (__pyx_t_18 = 2; __pyx_t_18 > -1L; __pyx_t_18-=1) { + __pyx_v_m = __pyx_t_18; + + /* "MDAnalysis/lib/nsgrid.pyx":970 + * if self.periodic: + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: # <<<<<<<<<<<<<< + * for d in range(m+1): + * probe[d] += self.box.c_pbcbox.box[m][d] + */ + while (1) { + __pyx_t_17 = (((__pyx_v_probe[__pyx_v_m]) < 0.0) != 0); + if (!__pyx_t_17) break; + + /* "MDAnalysis/lib/nsgrid.pyx":971 + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: + * for d in range(m+1): # <<<<<<<<<<<<<< + * probe[d] += self.box.c_pbcbox.box[m][d] + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + */ + __pyx_t_19 = (__pyx_v_m + 1); + __pyx_t_20 = __pyx_t_19; + for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) { + __pyx_v_d = __pyx_t_21; + + /* "MDAnalysis/lib/nsgrid.pyx":972 + * while probe[m] < 0: + * for d in range(m+1): + * probe[d] += self.box.c_pbcbox.box[m][d] # <<<<<<<<<<<<<< + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + * for d in range(m+1): + */ + __pyx_t_22 = __pyx_v_d; + (__pyx_v_probe[__pyx_t_22]) = ((__pyx_v_probe[__pyx_t_22]) + ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_d])); + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":973 + * for d in range(m+1): + * probe[d] += self.box.c_pbcbox.box[m][d] + * while probe[m] >= self.box.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * for d in range(m+1): + * probe[d] -= self.box.c_pbcbox.box[m][d] + */ + while (1) { + __pyx_t_17 = (((__pyx_v_probe[__pyx_v_m]) >= ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_m])) != 0); + if (!__pyx_t_17) break; + + /* "MDAnalysis/lib/nsgrid.pyx":974 + * probe[d] += self.box.c_pbcbox.box[m][d] + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + * for d in range(m+1): # <<<<<<<<<<<<<< + * probe[d] -= self.box.c_pbcbox.box[m][d] + * else: + */ + __pyx_t_19 = (__pyx_v_m + 1); + __pyx_t_20 = __pyx_t_19; + for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) { + __pyx_v_d = __pyx_t_21; + + /* "MDAnalysis/lib/nsgrid.pyx":975 + * while probe[m] >= self.box.c_pbcbox.box[m][m]: + * for d in range(m+1): + * probe[d] -= self.box.c_pbcbox.box[m][d] # <<<<<<<<<<<<<< + * else: + * for m in range(DIM -1, -1, -1): + */ + __pyx_t_22 = __pyx_v_d; + (__pyx_v_probe[__pyx_t_22]) = ((__pyx_v_probe[__pyx_t_22]) - ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_d])); + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":968 + * probe[ZZ] = self.coords_bbox[current_beadid, ZZ] + (zi - 1) * self.grid.cellsize[ZZ] + * # Make sure the shifted coordinates is inside the brick-shaped box + * if self.periodic: # <<<<<<<<<<<<<< + * for m in range(DIM - 1, -1, -1): + * while probe[m] < 0: + */ + goto __pyx_L14; + } + + /* "MDAnalysis/lib/nsgrid.pyx":977 + * probe[d] -= self.box.c_pbcbox.box[m][d] + * else: + * for m in range(DIM -1, -1, -1): # <<<<<<<<<<<<<< + * if probe[m] < 0: + * check = False + */ + /*else*/ { + for (__pyx_t_18 = 2; __pyx_t_18 > -1L; __pyx_t_18-=1) { + __pyx_v_m = __pyx_t_18; + + /* "MDAnalysis/lib/nsgrid.pyx":978 + * else: + * for m in range(DIM -1, -1, -1): + * if probe[m] < 0: # <<<<<<<<<<<<<< + * check = False + * break + */ + __pyx_t_17 = (((__pyx_v_probe[__pyx_v_m]) < 0.0) != 0); + if (__pyx_t_17) { + + /* "MDAnalysis/lib/nsgrid.pyx":979 + * for m in range(DIM -1, -1, -1): + * if probe[m] < 0: + * check = False # <<<<<<<<<<<<<< + * break + * elif probe[m] >= self.box.c_pbcbox.box[m][m]: + */ + __pyx_v_check = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":980 + * if probe[m] < 0: + * check = False + * break # <<<<<<<<<<<<<< + * elif probe[m] >= self.box.c_pbcbox.box[m][m]: + * check = False + */ + goto __pyx_L26_break; + + /* "MDAnalysis/lib/nsgrid.pyx":978 + * else: + * for m in range(DIM -1, -1, -1): + * if probe[m] < 0: # <<<<<<<<<<<<<< + * check = False + * break + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":981 + * check = False + * break + * elif probe[m] >= self.box.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * check = False + * break + */ + __pyx_t_17 = (((__pyx_v_probe[__pyx_v_m]) >= ((__pyx_v_self->box->c_pbcbox.box[__pyx_v_m])[__pyx_v_m])) != 0); + if (__pyx_t_17) { + + /* "MDAnalysis/lib/nsgrid.pyx":982 + * break + * elif probe[m] >= self.box.c_pbcbox.box[m][m]: + * check = False # <<<<<<<<<<<<<< + * break + * if not check: + */ + __pyx_v_check = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":983 + * elif probe[m] >= self.box.c_pbcbox.box[m][m]: + * check = False + * break # <<<<<<<<<<<<<< + * if not check: + * continue + */ + goto __pyx_L26_break; + + /* "MDAnalysis/lib/nsgrid.pyx":981 + * check = False + * break + * elif probe[m] >= self.box.c_pbcbox.box[m][m]: # <<<<<<<<<<<<<< + * check = False + * break + */ + } + } + __pyx_L26_break:; + } + __pyx_L14:; + + /* "MDAnalysis/lib/nsgrid.pyx":984 + * check = False + * break + * if not check: # <<<<<<<<<<<<<< + * continue + * # Get the cell index corresponding to the probe + */ + __pyx_t_17 = ((!(__pyx_v_check != 0)) != 0); + if (__pyx_t_17) { + + /* "MDAnalysis/lib/nsgrid.pyx":985 + * break + * if not check: + * continue # <<<<<<<<<<<<<< + * # Get the cell index corresponding to the probe + * cellindex_probe = self.grid.coord2cellid(probe) + */ + goto __pyx_L12_continue; + + /* "MDAnalysis/lib/nsgrid.pyx":984 + * check = False + * break + * if not check: # <<<<<<<<<<<<<< + * continue + * # Get the cell index corresponding to the probe + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":987 + * continue + * # Get the cell index corresponding to the probe + * cellindex_probe = self.grid.coord2cellid(probe) # <<<<<<<<<<<<<< + * # for this cellindex search in grid + * for j in range(self.grid.nbeads[cellindex_probe]): + */ + __pyx_v_cellindex_probe = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_v_self->grid->__pyx_vtab)->coord2cellid(__pyx_v_self->grid, __pyx_v_probe); + + /* "MDAnalysis/lib/nsgrid.pyx":989 + * cellindex_probe = self.grid.coord2cellid(probe) + * # for this cellindex search in grid + * for j in range(self.grid.nbeads[cellindex_probe]): # <<<<<<<<<<<<<< + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + * if bid < current_beadid: + */ + __pyx_t_18 = (__pyx_v_self->grid->nbeads[__pyx_v_cellindex_probe]); + __pyx_t_19 = __pyx_t_18; + for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) { + __pyx_v_j = __pyx_t_20; + + /* "MDAnalysis/lib/nsgrid.pyx":990 + * # for this cellindex search in grid + * for j in range(self.grid.nbeads[cellindex_probe]): + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] # <<<<<<<<<<<<<< + * if bid < current_beadid: + * continue + */ + __pyx_v_bid = (__pyx_v_self->grid->beadids[((__pyx_v_cellindex_probe * __pyx_v_self->grid->nbeads_per_cell) + __pyx_v_j)]); + + /* "MDAnalysis/lib/nsgrid.pyx":991 + * for j in range(self.grid.nbeads[cellindex_probe]): + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + * if bid < current_beadid: # <<<<<<<<<<<<<< + * continue + * # find distance between search coords[i] and coords[bid] + */ + __pyx_t_17 = ((__pyx_v_bid < __pyx_v_current_beadid) != 0); + if (__pyx_t_17) { + + /* "MDAnalysis/lib/nsgrid.pyx":992 + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + * if bid < current_beadid: + * continue # <<<<<<<<<<<<<< + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + */ + goto __pyx_L29_continue; + + /* "MDAnalysis/lib/nsgrid.pyx":991 + * for j in range(self.grid.nbeads[cellindex_probe]): + * bid = self.grid.beadids[cellindex_probe * self.grid.nbeads_per_cell + j] + * if bid < current_beadid: # <<<<<<<<<<<<<< + * continue + * # find distance between search coords[i] and coords[bid] + */ + } + + /* "MDAnalysis/lib/nsgrid.pyx":994 + * continue + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) # <<<<<<<<<<<<<< + * if d2 < cutoff2 and d2 > EPSILON: + * results.add_neighbors(current_beadid, bid, d2) + */ + __pyx_t_23 = __pyx_v_current_beadid; + __pyx_t_24 = 0; + if (__pyx_t_23 < 0) __pyx_t_23 += __pyx_v_self->coords_bbox.shape[0]; + if (__pyx_t_24 < 0) __pyx_t_24 += __pyx_v_self->coords_bbox.shape[1]; + __pyx_t_25 = __pyx_v_bid; + __pyx_t_26 = 0; + if (__pyx_t_25 < 0) __pyx_t_25 += __pyx_v_self->coords_bbox.shape[0]; + if (__pyx_t_26 < 0) __pyx_t_26 += __pyx_v_self->coords_bbox.shape[1]; + __pyx_v_d2 = ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_v_self->box->__pyx_vtab)->fast_distance2(__pyx_v_self->box, (&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_self->coords_bbox.data + __pyx_t_23 * __pyx_v_self->coords_bbox.strides[0]) )) + __pyx_t_24)) )))), (&(*((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=1 */ ((char *) (((__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) ( /* dim=0 */ (__pyx_v_self->coords_bbox.data + __pyx_t_25 * __pyx_v_self->coords_bbox.strides[0]) )) + __pyx_t_26)) ))))); + + /* "MDAnalysis/lib/nsgrid.pyx":995 + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + * if d2 < cutoff2 and d2 > EPSILON: # <<<<<<<<<<<<<< + * results.add_neighbors(current_beadid, bid, d2) + * results.add_neighbors(bid, current_beadid, d2) + */ + __pyx_t_27 = ((__pyx_v_d2 < __pyx_v_cutoff2) != 0); + if (__pyx_t_27) { + } else { + __pyx_t_17 = __pyx_t_27; + goto __pyx_L33_bool_binop_done; + } + __pyx_t_27 = ((__pyx_v_d2 > 1e-05) != 0); + __pyx_t_17 = __pyx_t_27; + __pyx_L33_bool_binop_done:; + if (__pyx_t_17) { + + /* "MDAnalysis/lib/nsgrid.pyx":996 + * d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + * if d2 < cutoff2 and d2 > EPSILON: + * results.add_neighbors(current_beadid, bid, d2) # <<<<<<<<<<<<<< + * results.add_neighbors(bid, current_beadid, d2) + * npairs += 2 + */ + ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_results->__pyx_vtab)->add_neighbors(__pyx_v_results, __pyx_v_current_beadid, __pyx_v_bid, __pyx_v_d2); + + /* "MDAnalysis/lib/nsgrid.pyx":997 + * if d2 < cutoff2 and d2 > EPSILON: + * results.add_neighbors(current_beadid, bid, d2) + * results.add_neighbors(bid, current_beadid, d2) # <<<<<<<<<<<<<< + * npairs += 2 + * return results + */ + ((struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v_results->__pyx_vtab)->add_neighbors(__pyx_v_results, __pyx_v_bid, __pyx_v_current_beadid, __pyx_v_d2); + + /* "MDAnalysis/lib/nsgrid.pyx":998 + * results.add_neighbors(current_beadid, bid, d2) + * results.add_neighbors(bid, current_beadid, d2) + * npairs += 2 # <<<<<<<<<<<<<< + * return results + */ + __pyx_v_npairs = (__pyx_v_npairs + 2); + + /* "MDAnalysis/lib/nsgrid.pyx":995 + * # find distance between search coords[i] and coords[bid] + * d2 = self.box.fast_distance2(&self.coords_bbox[current_beadid, XX], &self.coords_bbox[bid, XX]) + * if d2 < cutoff2 and d2 > EPSILON: # <<<<<<<<<<<<<< + * results.add_neighbors(current_beadid, bid, d2) + * results.add_neighbors(bid, current_beadid, d2) + */ + } + __pyx_L29_continue:; + } + __pyx_L12_continue:; + } + } + } + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":952 + * results = NSResults(self.cutoff, self.coords, self.coords) + * + * with nogil: # <<<<<<<<<<<<<< + * for i in range(size_search): + * # Start with first search coordinate + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + __Pyx_FastGIL_Forget(); + Py_BLOCK_THREADS + #endif + goto __pyx_L5; + } + __pyx_L5:; + } + } + + /* "MDAnalysis/lib/nsgrid.pyx":999 + * results.add_neighbors(bid, current_beadid, d2) + * npairs += 2 + * return results # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_results)); + __pyx_r = ((PyObject *)__pyx_v_results); + goto __pyx_L0; + + /* "MDAnalysis/lib/nsgrid.pyx":913 + * return results + * + * def self_search(self): # <<<<<<<<<<<<<< + * """Searches all the pairs within the initialized coordinates + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.FastNS.self_search", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_results); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "MDAnalysis/lib/nsgrid.pyx":699 + * cdef real[:, ::1] coords + * cdef real[:, ::1] coords_bbox + * cdef readonly real cutoff # <<<<<<<<<<<<<< + * cdef NSGrid grid + * cdef ns_int max_gridsize + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_6cutoff_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_6cutoff_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_6cutoff___get__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_6cutoff___get__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 699, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.FastNS.cutoff.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.box, self.coords, self.coords_bbox, self.cutoff, self.grid, self.max_gridsize, self.periodic) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_6__reduce_cython__[] = "FastNS.__reduce_cython__(self)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_6__reduce_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_6__reduce_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self) { + int __pyx_v_use_setstate; + PyObject *__pyx_v_state = NULL; + PyObject *__pyx_v__dict = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * cdef bint use_setstate + * state = (self.box, self.coords, self.coords_bbox, self.cutoff, self.grid, self.max_gridsize, self.periodic) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_self->coords, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_self->coords_bbox, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, (int (*)(char *, PyObject *)) __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_self->cutoff); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyInt_From_npy_long(__pyx_v_self->max_gridsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBool_FromLong(__pyx_v_self->periodic); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(7); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(((PyObject *)__pyx_v_self->box)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self->box)); + PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_self->box)); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_self->grid)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self->grid)); + PyTuple_SET_ITEM(__pyx_t_6, 4, ((PyObject *)__pyx_v_self->grid)); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 5, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_6, 6, __pyx_t_5); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_6); + __pyx_t_6 = 0; + + /* "(tree fragment)":4 + * cdef bint use_setstate + * state = (self.box, self.coords, self.coords_bbox, self.cutoff, self.grid, self.max_gridsize, self.periodic) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_6 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_v__dict = __pyx_t_6; + __pyx_t_6 = 0; + + /* "(tree fragment)":5 + * state = (self.box, self.coords, self.coords_bbox, self.cutoff, self.grid, self.max_gridsize, self.periodic) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_7 = (__pyx_v__dict != Py_None); + __pyx_t_8 = (__pyx_t_7 != 0); + if (__pyx_t_8) { + + /* "(tree fragment)":6 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v__dict); + __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_5)); + __pyx_t_5 = 0; + + /* "(tree fragment)":7 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.box is not None or self.grid is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":5 + * state = (self.box, self.coords, self.coords_bbox, self.cutoff, self.grid, self.max_gridsize, self.periodic) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":9 + * use_setstate = True + * else: + * use_setstate = self.box is not None or self.grid is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, None), state + */ + /*else*/ { + __pyx_t_7 = (((PyObject *)__pyx_v_self->box) != Py_None); + __pyx_t_9 = (__pyx_t_7 != 0); + if (!__pyx_t_9) { + } else { + __pyx_t_8 = __pyx_t_9; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_9 = (((PyObject *)__pyx_v_self->grid) != Py_None); + __pyx_t_7 = (__pyx_t_9 != 0); + __pyx_t_8 = __pyx_t_7; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_8; + } + __pyx_L3:; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.box is not None or self.grid is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, None), state + * else: + */ + __pyx_t_8 = (__pyx_v_use_setstate != 0); + if (__pyx_t_8) { + + /* "(tree fragment)":11 + * use_setstate = self.box is not None or self.grid is not None + * if use_setstate: + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, state) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_FastNS); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_221827040); + __Pyx_GIVEREF(__pyx_int_221827040); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_221827040); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_6, 2, Py_None); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_6); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_state); + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.box is not None or self.grid is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, None), state + * else: + */ + } + + /* "(tree fragment)":13 + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, None), state + * else: + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_FastNS__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_FastNS); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_221827040); + __Pyx_GIVEREF(__pyx_int_221827040); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_int_221827040); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6); + __pyx_t_4 = 0; + __pyx_t_6 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.box, self.coords, self.coords_bbox, self.cutoff, self.grid, self.max_gridsize, self.periodic) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.FastNS.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":14 + * else: + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_FastNS__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_8__setstate_cython__[] = "FastNS.__setstate_cython__(self, __pyx_state)"; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_8__setstate_cython__(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_6FastNS_8__setstate_cython__(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":15 + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_FastNS__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 15, __pyx_L1_error) + __pyx_t_1 = __pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_FastNS__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":14 + * else: + * return __pyx_unpickle_FastNS, (type(self), 0xd38cfe0, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_FastNS__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.FastNS.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0x294c292: + * from pickle import PickleError as __pyx_PickleError + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_1__pyx_unpickle_NSResults(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults[] = "__pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state)"; +static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_6nsgrid_1__pyx_unpickle_NSResults = {"__pyx_unpickle_NSResults", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_1__pyx_unpickle_NSResults, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults}; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_1__pyx_unpickle_NSResults(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_NSResults (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_NSResults", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_NSResults", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_NSResults") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_NSResults", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.__pyx_unpickle_NSResults", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = NULL; + PyObject *__pyx_v___pyx_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __Pyx_RefNannySetupContext("__pyx_unpickle_NSResults", 0); + + /* "(tree fragment)":2 + * def __pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0x294c292: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x294c292) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":3 + * def __pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0x294c292: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))" % __pyx_checksum) + * __pyx_result = NSResults.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, -1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":4 + * if __pyx_checksum != 0x294c292: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = NSResults.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x29, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_5) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":2 + * def __pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0x294c292: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":5 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))" % __pyx_checksum) + * __pyx_result = NSResults.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSResults), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_6) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_INCREF(__pyx_v___pyx_type); + __Pyx_GIVEREF(__pyx_v___pyx_type); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v___pyx_type); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))" % __pyx_checksum) + * __pyx_result = NSResults.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_7 = (__pyx_t_1 != 0); + if (__pyx_t_7) { + + /* "(tree fragment)":7 + * __pyx_result = NSResults.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 7, __pyx_L1_error) + __pyx_t_3 = __pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults__set_state(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x294c292 = (coords, cutoff, distances_buffer, indices_buffer, npairs, pair_distances2_buffer, pair_distances_buffer, pairs_buffer, searchcoords))" % __pyx_checksum) + * __pyx_result = NSResults.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":8 + * if __pyx_state is not None: + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0x294c292: + * from pickle import PickleError as __pyx_PickleError + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.__pyx_unpickle_NSResults", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":9 + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_NSResults__set_state(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1 = { 0, 0, { 0 }, { 0 }, { 0 } }; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_2; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> __pyx_t_3; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> __pyx_t_4; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_5; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> __pyx_t_6; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> __pyx_t_7; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + __Pyx_RefNannySetupContext("__pyx_unpickle_NSResults__set_state", 0); + + /* "(tree fragment)":10 + * return __pyx_result + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[9]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyTuple_GET_ITEM(__pyx_v___pyx_state, 0), PyBUF_WRITABLE); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(1, 10, __pyx_L1_error) + __PYX_XDEC_MEMVIEW(&__pyx_v___pyx_result->coords, 0); + __pyx_v___pyx_result->coords = __pyx_t_1; + __pyx_t_1.memview = NULL; + __pyx_t_1.data = NULL; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_2 = __pyx_PyFloat_AsFloat(PyTuple_GET_ITEM(__pyx_v___pyx_state, 1)); if (unlikely((__pyx_t_2 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->cutoff = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_3 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(PyTuple_GET_ITEM(__pyx_v___pyx_state, 2)); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->distances_buffer = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_4 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(PyTuple_GET_ITEM(__pyx_v___pyx_state, 3)); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->indices_buffer = __pyx_t_4; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyInt_As_npy_long(PyTuple_GET_ITEM(__pyx_v___pyx_state, 4)); if (unlikely((__pyx_t_5 == ((npy_long)-1)) && PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->npairs = __pyx_t_5; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_6 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyTuple_GET_ITEM(__pyx_v___pyx_state, 5)); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->pair_distances2_buffer = __pyx_t_6; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_6 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyTuple_GET_ITEM(__pyx_v___pyx_state, 6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->pair_distances_buffer = __pyx_t_6; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_7 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(PyTuple_GET_ITEM(__pyx_v___pyx_state, 7)); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->pairs_buffer = __pyx_t_7; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyTuple_GET_ITEM(__pyx_v___pyx_state, 8), PyBUF_WRITABLE); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(1, 10, __pyx_L1_error) + __PYX_XDEC_MEMVIEW(&__pyx_v___pyx_result->searchcoords, 0); + __pyx_v___pyx_result->searchcoords = __pyx_t_1; + __pyx_t_1.memview = NULL; + __pyx_t_1.data = NULL; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[9]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 11, __pyx_L1_error) + } + __pyx_t_9 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(1, 11, __pyx_L1_error) + __pyx_t_10 = ((__pyx_t_9 > 9) != 0); + if (__pyx_t_10) { + } else { + __pyx_t_8 = __pyx_t_10; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_10 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(1, 11, __pyx_L1_error) + __pyx_t_11 = (__pyx_t_10 != 0); + __pyx_t_8 = __pyx_t_11; + __pyx_L4_bool_binop_done:; + if (__pyx_t_8) { + + /* "(tree fragment)":12 + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[9]) # <<<<<<<<<<<<<< + */ + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_13)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_update); if (unlikely(!__pyx_t_14)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_13 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_14))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_14); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_14, function); + } + } + if (!__pyx_t_13) { + __pyx_t_12 = __Pyx_PyObject_CallOneArg(__pyx_t_14, PyTuple_GET_ITEM(__pyx_v___pyx_state, 9)); if (unlikely(!__pyx_t_12)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_14)) { + PyObject *__pyx_temp[2] = {__pyx_t_13, PyTuple_GET_ITEM(__pyx_v___pyx_state, 9)}; + __pyx_t_12 = __Pyx_PyFunction_FastCall(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_GOTREF(__pyx_t_12); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_14)) { + PyObject *__pyx_temp[2] = {__pyx_t_13, PyTuple_GET_ITEM(__pyx_v___pyx_state, 9)}; + __pyx_t_12 = __Pyx_PyCFunction_FastCall(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_GOTREF(__pyx_t_12); + } else + #endif + { + __pyx_t_15 = PyTuple_New(1+1); if (unlikely(!__pyx_t_15)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13); __pyx_t_13 = NULL; + __Pyx_INCREF(PyTuple_GET_ITEM(__pyx_v___pyx_state, 9)); + __Pyx_GIVEREF(PyTuple_GET_ITEM(__pyx_v___pyx_state, 9)); + PyTuple_SET_ITEM(__pyx_t_15, 0+1, PyTuple_GET_ITEM(__pyx_v___pyx_state, 9)); + __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_14, __pyx_t_15, NULL); if (unlikely(!__pyx_t_12)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; + } + } + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[9]) + */ + } + + /* "(tree fragment)":9 + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.__pyx_unpickle_NSResults__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_FastNS(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xd38cfe0: + * from pickle import PickleError as __pyx_PickleError + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_3__pyx_unpickle_FastNS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_10MDAnalysis_3lib_6nsgrid_2__pyx_unpickle_FastNS[] = "__pyx_unpickle_FastNS(__pyx_type, long __pyx_checksum, __pyx_state)"; +static PyMethodDef __pyx_mdef_10MDAnalysis_3lib_6nsgrid_3__pyx_unpickle_FastNS = {"__pyx_unpickle_FastNS", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_3__pyx_unpickle_FastNS, METH_VARARGS|METH_KEYWORDS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_2__pyx_unpickle_FastNS}; +static PyObject *__pyx_pw_10MDAnalysis_3lib_6nsgrid_3__pyx_unpickle_FastNS(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_FastNS (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FastNS", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FastNS", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_FastNS") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_FastNS", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.__pyx_unpickle_FastNS", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_10MDAnalysis_3lib_6nsgrid_2__pyx_unpickle_FastNS(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_10MDAnalysis_3lib_6nsgrid_2__pyx_unpickle_FastNS(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = NULL; + PyObject *__pyx_v___pyx_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __Pyx_RefNannySetupContext("__pyx_unpickle_FastNS", 0); + + /* "(tree fragment)":2 + * def __pyx_unpickle_FastNS(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xd38cfe0: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xd38cfe0) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":3 + * def __pyx_unpickle_FastNS(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xd38cfe0: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))" % __pyx_checksum) + * __pyx_result = FastNS.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, -1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":4 + * if __pyx_checksum != 0xd38cfe0: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = FastNS.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xd3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_5) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":2 + * def __pyx_unpickle_FastNS(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xd38cfe0: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":5 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))" % __pyx_checksum) + * __pyx_result = FastNS.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_FastNS__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_10MDAnalysis_3lib_6nsgrid_FastNS), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_6) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_INCREF(__pyx_v___pyx_type); + __Pyx_GIVEREF(__pyx_v___pyx_type); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v___pyx_type); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))" % __pyx_checksum) + * __pyx_result = FastNS.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_FastNS__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_7 = (__pyx_t_1 != 0); + if (__pyx_t_7) { + + /* "(tree fragment)":7 + * __pyx_result = FastNS.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_FastNS__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_FastNS__set_state(FastNS __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 7, __pyx_L1_error) + __pyx_t_3 = __pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_FastNS__set_state(((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd38cfe0 = (box, coords, coords_bbox, cutoff, grid, max_gridsize, periodic))" % __pyx_checksum) + * __pyx_result = FastNS.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_FastNS__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":8 + * if __pyx_state is not None: + * __pyx_unpickle_FastNS__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_FastNS__set_state(FastNS __pyx_result, tuple __pyx_state): + * __pyx_result.box = __pyx_state[0]; __pyx_result.coords = __pyx_state[1]; __pyx_result.coords_bbox = __pyx_state[2]; __pyx_result.cutoff = __pyx_state[3]; __pyx_result.grid = __pyx_state[4]; __pyx_result.max_gridsize = __pyx_state[5]; __pyx_result.periodic = __pyx_state[6] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_FastNS(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xd38cfe0: + * from pickle import PickleError as __pyx_PickleError + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.__pyx_unpickle_FastNS", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":9 + * __pyx_unpickle_FastNS__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_FastNS__set_state(FastNS __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.box = __pyx_state[0]; __pyx_result.coords = __pyx_state[1]; __pyx_result.coords_bbox = __pyx_state[2]; __pyx_result.cutoff = __pyx_state[3]; __pyx_result.grid = __pyx_state[4]; __pyx_result.max_gridsize = __pyx_state[5]; __pyx_result.periodic = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_10MDAnalysis_3lib_6nsgrid___pyx_unpickle_FastNS__set_state(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_memviewslice __pyx_t_2 = { 0, 0, { 0 }, { 0 }, { 0 } }; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_3; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("__pyx_unpickle_FastNS__set_state", 0); + + /* "(tree fragment)":10 + * return __pyx_result + * cdef __pyx_unpickle_FastNS__set_state(FastNS __pyx_result, tuple __pyx_state): + * __pyx_result.box = __pyx_state[0]; __pyx_result.coords = __pyx_state[1]; __pyx_result.coords_bbox = __pyx_state[2]; __pyx_result.cutoff = __pyx_state[3]; __pyx_result.grid = __pyx_state[4]; __pyx_result.max_gridsize = __pyx_state[5]; __pyx_result.periodic = __pyx_state[6] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + if (!(likely(((PyTuple_GET_ITEM(__pyx_v___pyx_state, 0)) == Py_None) || likely(__Pyx_TypeTest(PyTuple_GET_ITEM(__pyx_v___pyx_state, 0), __pyx_ptype_10MDAnalysis_3lib_6nsgrid_PBCBox))))) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_v___pyx_state, 0); + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->box); + __Pyx_DECREF(((PyObject *)__pyx_v___pyx_result->box)); + __pyx_v___pyx_result->box = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyTuple_GET_ITEM(__pyx_v___pyx_state, 1), PyBUF_WRITABLE); if (unlikely(!__pyx_t_2.memview)) __PYX_ERR(1, 10, __pyx_L1_error) + __PYX_XDEC_MEMVIEW(&__pyx_v___pyx_result->coords, 0); + __pyx_v___pyx_result->coords = __pyx_t_2; + __pyx_t_2.memview = NULL; + __pyx_t_2.data = NULL; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyTuple_GET_ITEM(__pyx_v___pyx_state, 2), PyBUF_WRITABLE); if (unlikely(!__pyx_t_2.memview)) __PYX_ERR(1, 10, __pyx_L1_error) + __PYX_XDEC_MEMVIEW(&__pyx_v___pyx_result->coords_bbox, 0); + __pyx_v___pyx_result->coords_bbox = __pyx_t_2; + __pyx_t_2.memview = NULL; + __pyx_t_2.data = NULL; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_3 = __pyx_PyFloat_AsFloat(PyTuple_GET_ITEM(__pyx_v___pyx_state, 3)); if (unlikely((__pyx_t_3 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->cutoff = __pyx_t_3; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + if (!(likely(((PyTuple_GET_ITEM(__pyx_v___pyx_state, 4)) == Py_None) || likely(__Pyx_TypeTest(PyTuple_GET_ITEM(__pyx_v___pyx_state, 4), __pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSGrid))))) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_v___pyx_state, 4); + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->grid); + __Pyx_DECREF(((PyObject *)__pyx_v___pyx_result->grid)); + __pyx_v___pyx_result->grid = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_4 = __Pyx_PyInt_As_npy_long(PyTuple_GET_ITEM(__pyx_v___pyx_state, 5)); if (unlikely((__pyx_t_4 == ((npy_long)-1)) && PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->max_gridsize = __pyx_t_4; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_PyObject_IsTrue(PyTuple_GET_ITEM(__pyx_v___pyx_state, 6)); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 10, __pyx_L1_error) + __pyx_v___pyx_result->periodic = __pyx_t_5; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_FastNS__set_state(FastNS __pyx_result, tuple __pyx_state): + * __pyx_result.box = __pyx_state[0]; __pyx_result.coords = __pyx_state[1]; __pyx_result.coords_bbox = __pyx_state[2]; __pyx_result.cutoff = __pyx_state[3]; __pyx_result.grid = __pyx_state[4]; __pyx_result.max_gridsize = __pyx_state[5]; __pyx_result.periodic = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 11, __pyx_L1_error) + } + __pyx_t_6 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_6 == ((Py_ssize_t)-1))) __PYX_ERR(1, 11, __pyx_L1_error) + __pyx_t_7 = ((__pyx_t_6 > 7) != 0); + if (__pyx_t_7) { + } else { + __pyx_t_5 = __pyx_t_7; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_7 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(1, 11, __pyx_L1_error) + __pyx_t_8 = (__pyx_t_7 != 0); + __pyx_t_5 = __pyx_t_8; + __pyx_L4_bool_binop_done:; + if (__pyx_t_5) { + + /* "(tree fragment)":12 + * __pyx_result.box = __pyx_state[0]; __pyx_result.coords = __pyx_state[1]; __pyx_result.coords_bbox = __pyx_state[2]; __pyx_result.cutoff = __pyx_state[3]; __pyx_result.grid = __pyx_state[4]; __pyx_result.max_gridsize = __pyx_state[5]; __pyx_result.periodic = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[7]) # <<<<<<<<<<<<<< + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_update); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_9 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) { + __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10); + if (likely(__pyx_t_9)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); + __Pyx_INCREF(__pyx_t_9); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_10, function); + } + } + if (!__pyx_t_9) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_10, PyTuple_GET_ITEM(__pyx_v___pyx_state, 7)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_9, PyTuple_GET_ITEM(__pyx_v___pyx_state, 7)}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) { + PyObject *__pyx_temp[2] = {__pyx_t_9, PyTuple_GET_ITEM(__pyx_v___pyx_state, 7)}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; + __Pyx_INCREF(PyTuple_GET_ITEM(__pyx_v___pyx_state, 7)); + __Pyx_GIVEREF(PyTuple_GET_ITEM(__pyx_v___pyx_state, 7)); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, PyTuple_GET_ITEM(__pyx_v___pyx_state, 7)); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_FastNS__set_state(FastNS __pyx_result, tuple __pyx_state): + * __pyx_result.box = __pyx_state[0]; __pyx_result.coords = __pyx_state[1]; __pyx_result.coords_bbox = __pyx_state[2]; __pyx_result.cutoff = __pyx_state[3]; __pyx_result.grid = __pyx_state[4]; __pyx_result.max_gridsize = __pyx_state[5]; __pyx_result.periodic = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[7]) + */ + } + + /* "(tree fragment)":9 + * __pyx_unpickle_FastNS__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_FastNS__set_state(FastNS __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.box = __pyx_state[0]; __pyx_result.coords = __pyx_state[1]; __pyx_result.coords_bbox = __pyx_state[2]; __pyx_result.cutoff = __pyx_state[3]; __pyx_result.grid = __pyx_state[4]; __pyx_result.max_gridsize = __pyx_state[5]; __pyx_result.periodic = __pyx_state[6] + * if len(__pyx_state) > 7 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __PYX_XDEC_MEMVIEW(&__pyx_t_2, 1); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("MDAnalysis.lib.nsgrid.__pyx_unpickle_FastNS__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fulfill the PEP. + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_i; + int __pyx_v_ndim; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + int __pyx_v_t; + char *__pyx_v_f; + PyArray_Descr *__pyx_v_descr = 0; + int __pyx_v_offset; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + char *__pyx_t_8; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + * + * cdef int i, ndim + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + */ + __pyx_v_endian_detector = 1; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + * cdef int i, ndim + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * + * ndim = PyArray_NDIM(self) + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + */ + __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not C contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 229, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 229, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + * ndim = PyArray_NDIM(self) + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L7_bool_binop_done; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not Fortran contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L7_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 233, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + * raise ValueError(u"ndarray is not Fortran contiguous") + * + * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + * + * info.buf = PyArray_DATA(self) + * info.ndim = ndim # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * # Allocate new buffer for strides and shape info. + */ + __pyx_v_info->ndim = __pyx_v_ndim; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< + * info.shape = info.strides + ndim + * for i in range(ndim): + */ + __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + * # This is allocated as one block, strides first. + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) + * info.shape = info.strides + ndim # <<<<<<<<<<<<<< + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + */ + __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) + * info.shape = info.strides + ndim + * for i in range(ndim): # <<<<<<<<<<<<<< + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] + */ + __pyx_t_4 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + * info.shape = info.strides + ndim + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + */ + (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< + * else: + * info.strides = PyArray_STRIDES(self) + */ + (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + goto __pyx_L9; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + */ + /*else*/ { + __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + * else: + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + */ + __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); + } + __pyx_L9:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) + */ + __pyx_v_info->suboffsets = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< + * info.readonly = not PyArray_ISWRITEABLE(self) + * + */ + __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< + * + * cdef int t + */ + __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + * + * cdef int t + * cdef char* f = NULL # <<<<<<<<<<<<<< + * cdef dtype descr = self.descr + * cdef int offset + */ + __pyx_v_f = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + * cdef int t + * cdef char* f = NULL + * cdef dtype descr = self.descr # <<<<<<<<<<<<<< + * cdef int offset + * + */ + __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + * cdef int offset + * + * info.obj = self # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(descr): + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * info.obj = self + * + * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + * + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num # <<<<<<<<<<<<<< + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + */ + __pyx_t_4 = __pyx_v_descr->type_num; + __pyx_v_t = __pyx_t_4; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); + if (!__pyx_t_2) { + goto __pyx_L15_next_or; + } else { + } + __pyx_t_2 = (__pyx_v_little_endian != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L14_bool_binop_done; + } + __pyx_L15_next_or:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L14_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (unlikely(__pyx_t_1)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 263, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + * if not PyDataType_HASFIELDS(descr): + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + */ + switch (__pyx_v_t) { + case NPY_BYTE: + __pyx_v_f = ((char *)"b"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + */ + case NPY_UBYTE: + __pyx_v_f = ((char *)"B"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + */ + case NPY_SHORT: + __pyx_v_f = ((char *)"h"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + */ + case NPY_USHORT: + __pyx_v_f = ((char *)"H"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + */ + case NPY_INT: + __pyx_v_f = ((char *)"i"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + */ + case NPY_UINT: + __pyx_v_f = ((char *)"I"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + */ + case NPY_LONG: + __pyx_v_f = ((char *)"l"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + */ + case NPY_ULONG: + __pyx_v_f = ((char *)"L"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + */ + case NPY_LONGLONG: + __pyx_v_f = ((char *)"q"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + */ + case NPY_ULONGLONG: + __pyx_v_f = ((char *)"Q"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + */ + case NPY_FLOAT: + __pyx_v_f = ((char *)"f"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + */ + case NPY_DOUBLE: + __pyx_v_f = ((char *)"d"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + */ + case NPY_LONGDOUBLE: + __pyx_v_f = ((char *)"g"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + */ + case NPY_CFLOAT: + __pyx_v_f = ((char *)"Zf"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" + */ + case NPY_CDOUBLE: + __pyx_v_f = ((char *)"Zd"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f = "O" + * else: + */ + case NPY_CLONGDOUBLE: + __pyx_v_f = ((char *)"Zg"); + break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + case NPY_OBJECT: + __pyx_v_f = ((char *)"O"); + break; + default: + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + * elif t == NPY_OBJECT: f = "O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * info.format = f + * return + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 282, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 282, __pyx_L1_error) + break; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f # <<<<<<<<<<<<<< + * return + * else: + */ + __pyx_v_info->format = __pyx_v_f; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f + * return # <<<<<<<<<<<<<< + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + * info.obj = self + * + * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + * return + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + */ + /*else*/ { + __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + * else: + * info.format = PyObject_Malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, + */ + (__pyx_v_info->format[0]) = '^'; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + * info.format = PyObject_Malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 # <<<<<<<<<<<<<< + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + */ + __pyx_v_offset = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< + * info.format + _buffer_format_string_len, + * &offset) + */ + __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(2, 289, __pyx_L1_error) + __pyx_v_f = __pyx_t_8; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + * info.format + _buffer_format_string_len, + * &offset) + * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + */ + (__pyx_v_f[0]) = '\x00'; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fulfill the PEP. + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + */ + +/* Python wrapper */ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); + __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__releasebuffer__", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * PyObject_Free(info.strides) + */ + PyObject_Free(__pyx_v_info->format); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * PyObject_Free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * PyObject_Free(info.strides) # <<<<<<<<<<<<<< + * # info.shape was stored after info.strides in the same block + * + */ + PyObject_Free(__pyx_v_info->strides); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * PyObject_Free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * PyObject_Free(info.format) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 776, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 779, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 782, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 785, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 788, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + * + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + * return () + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { + PyArray_Descr *__pyx_v_child = 0; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + PyObject *__pyx_v_fields = 0; + PyObject *__pyx_v_childname = NULL; + PyObject *__pyx_v_new_offset = NULL; + PyObject *__pyx_v_t = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + long __pyx_t_8; + char *__pyx_t_9; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + * + * cdef dtype child + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef tuple fields + */ + __pyx_v_endian_detector = 1; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + * cdef dtype child + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * cdef tuple fields + * + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + if (unlikely(__pyx_v_descr->names == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(2, 805, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(2, 805, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 805, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + * + * for childname in descr.names: + * fields = descr.fields[childname] # <<<<<<<<<<<<<< + * child, new_offset = fields + * + */ + if (unlikely(__pyx_v_descr->fields == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(2, 806, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 806, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(2, 806, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + * for childname in descr.names: + * fields = descr.fields[childname] + * child, new_offset = fields # <<<<<<<<<<<<<< + * + * if (end - f) - (new_offset - offset[0]) < 15: + */ + if (likely(__pyx_v_fields != Py_None)) { + PyObject* sequence = __pyx_v_fields; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(2, 807, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 807, __pyx_L1_error) + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(2, 807, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); + __pyx_t_3 = 0; + __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 809, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 809, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 809, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 810, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); + if (!__pyx_t_7) { + goto __pyx_L8_next_or; + } else { + } + __pyx_t_7 = (__pyx_v_little_endian != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_L8_next_or:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + * + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * # One could encode it in the format string and have Cython + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_6 = __pyx_t_7; + __pyx_L7_bool_binop_done:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(2, 814, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + * + * # Output padding bytes + * while offset[0] < new_offset: # <<<<<<<<<<<<<< + * f[0] = 120 # "x"; pad byte + * f += 1 + */ + while (1) { + __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 824, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 824, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 824, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + * # Output padding bytes + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< + * f += 1 + * offset[0] += 1 + */ + (__pyx_v_f[0]) = 0x78; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte + * f += 1 # <<<<<<<<<<<<<< + * offset[0] += 1 + * + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + * f[0] = 120 # "x"; pad byte + * f += 1 + * offset[0] += 1 # <<<<<<<<<<<<<< + * + * offset[0] += child.itemsize + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + * offset[0] += 1 + * + * offset[0] += child.itemsize # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(child): + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); + if (__pyx_t_6) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + * + * if not PyDataType_HASFIELDS(child): + * t = child.type_num # <<<<<<<<<<<<<< + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 832, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); + if (unlikely(__pyx_t_6)) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(2, 834, __pyx_L1_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + * + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 837, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 838, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 839, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 840, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 841, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 842, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 843, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 843, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 843, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 844, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 844, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 845, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 845, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 845, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 846, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 846, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 846, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 847, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 847, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 847, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 848, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 848, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 848, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 849, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 849, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 849, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 850, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 850, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 850, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x66; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 851, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 851, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 851, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x64; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 852, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 852, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 852, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x67; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 853, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 853, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(2, 853, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (likely(__pyx_t_6)) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * f += 1 + * else: + */ + /*else*/ { + __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 855, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 855, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(2, 855, __pyx_L1_error) + } + __pyx_L15:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * f += 1 # <<<<<<<<<<<<<< + * else: + * # Cython ignores struct boundary information ("T{...}"), + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + goto __pyx_L13; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + * # Cython ignores struct boundary information ("T{...}"), + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< + * return f + * + */ + /*else*/ { + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(2, 860, __pyx_L1_error) + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) + * return f # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + * return () + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_child); + __Pyx_XDECREF(__pyx_v_fields); + __Pyx_XDECREF(__pyx_v_childname); + __Pyx_XDECREF(__pyx_v_new_offset); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + PyObject *__pyx_v_baseptr; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("set_array_base", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + __pyx_t_1 = (__pyx_v_base == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + * cdef PyObject* baseptr + * if base is None: + * baseptr = NULL # <<<<<<<<<<<<<< + * else: + * Py_INCREF(base) # important to do this before decref below! + */ + __pyx_v_baseptr = NULL; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + goto __pyx_L3; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + * baseptr = NULL + * else: + * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< + * baseptr = base + * Py_XDECREF(arr.base) + */ + /*else*/ { + Py_INCREF(__pyx_v_base); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + * else: + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base # <<<<<<<<<<<<<< + * Py_XDECREF(arr.base) + * arr.base = baseptr + */ + __pyx_v_baseptr = ((PyObject *)__pyx_v_base); + } + __pyx_L3:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base + * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< + * arr.base = baseptr + * + */ + Py_XDECREF(__pyx_v_arr->base); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + * baseptr = base + * Py_XDECREF(arr.base) + * arr.base = baseptr # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_v_arr->base = __pyx_v_baseptr; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); + if (__pyx_t_1) { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: + * return None # <<<<<<<<<<<<<< + * else: + * return arr.base + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + * return None + * else: + * return arr.base # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); + __pyx_r = ((PyObject *)__pyx_v_arr->base); + goto __pyx_L0; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_array", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + * cdef inline int import_array() except -1: + * try: + * _import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 998, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + * try: + * _import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 999, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 1000, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 1000, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_umath", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 1004, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 1005, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 1006, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 1006, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_ufunc", 0); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 1010, __pyx_L3_error) + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 1011, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 1012, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(2, 1012, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> &__pyx_v_v) { + size_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + size_t __pyx_t_2; + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real", 0); + + /* "vector.to_py":61 + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(vector[X]& v): + * return [v[i] for i in range(v.size())] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_v_v.size(); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + __pyx_t_5 = PyFloat_FromDouble((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("vector.to_py.__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> &__pyx_v_v) { + size_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + size_t __pyx_t_2; + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec", 0); + + /* "vector.to_py":61 + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(vector[X]& v): + * return [v[i] for i in range(v.size())] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_v_v.size(); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + __pyx_t_5 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("vector.to_py.__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "vector.from_py":45 + * + * @cname("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real") + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(object o) except *: # <<<<<<<<<<<<<< + * cdef vector[X] v + * for item in o: + */ + +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyObject *__pyx_v_o) { + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> __pyx_v_v; + PyObject *__pyx_v_item = NULL; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + __pyx_t_10MDAnalysis_3lib_6nsgrid_real __pyx_t_5; + __Pyx_RefNannySetupContext("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real", 0); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_1 = __pyx_v_o; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + __pyx_t_3 = NULL; + } else { + __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 47, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_3)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } + } else { + __pyx_t_4 = __pyx_t_3(__pyx_t_1); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 47, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_4); + __pyx_t_4 = 0; + + /* "vector.from_py":48 + * cdef vector[X] v + * for item in o: + * v.push_back(item) # <<<<<<<<<<<<<< + * return v + * + */ + __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_v_item); if (unlikely((__pyx_t_5 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(1, 48, __pyx_L1_error) + __pyx_v_v.push_back(((__pyx_t_10MDAnalysis_3lib_6nsgrid_real)__pyx_t_5)); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "vector.from_py":49 + * for item in o: + * v.push_back(item) + * return v # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_v; + goto __pyx_L0; + + /* "vector.from_py":45 + * + * @cname("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real") + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(object o) except *: # <<<<<<<<<<<<<< + * cdef vector[X] v + * for item in o: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("vector.from_py.__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_pretend_to_initialize(&__pyx_r); + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(PyObject *__pyx_v_o) { + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> __pyx_v_v; + PyObject *__pyx_v_item = NULL; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + __pyx_t_10MDAnalysis_3lib_6nsgrid_realvec __pyx_t_5; + __Pyx_RefNannySetupContext("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec", 0); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_1 = __pyx_v_o; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + __pyx_t_3 = NULL; + } else { + __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 47, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_3)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } + } else { + __pyx_t_4 = __pyx_t_3(__pyx_t_1); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 47, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_4); + __pyx_t_4 = 0; + + /* "vector.from_py":48 + * cdef vector[X] v + * for item in o: + * v.push_back(item) # <<<<<<<<<<<<<< + * return v + * + */ + __pyx_t_5 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_real(__pyx_v_item); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 48, __pyx_L1_error) + __pyx_v_v.push_back(((__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec)__pyx_t_5)); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "vector.from_py":49 + * for item in o: + * v.push_back(item) + * return v # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_v; + goto __pyx_L0; + + /* "vector.from_py":45 + * + * @cname("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec") + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec(object o) except *: # <<<<<<<<<<<<<< + * cdef vector[X] v + * for item in o: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("vector.from_py.__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_realvec", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_pretend_to_initialize(&__pyx_r); + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> &__pyx_v_v) { + size_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + size_t __pyx_t_2; + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int", 0); + + /* "vector.to_py":61 + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(vector[X]& v): + * return [v[i] for i in range(v.size())] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_v_v.size(); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + __pyx_t_5 = __Pyx_PyInt_From_npy_long((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("vector.to_py.__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(const std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> &__pyx_v_v) { + size_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + size_t __pyx_t_2; + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec", 0); + + /* "vector.to_py":61 + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(vector[X]& v): + * return [v[i] for i in range(v.size())] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __pyx_v_v.size(); + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + __pyx_t_5 = __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "vector.to_py":60 + * + * @cname("__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec") + * cdef object __pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(vector[X]& v): # <<<<<<<<<<<<<< + * return [v[i] for i in range(v.size())] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("vector.to_py.__pyx_convert_vector_to_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "vector.from_py":45 + * + * @cname("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int") + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(object o) except *: # <<<<<<<<<<<<<< + * cdef vector[X] v + * for item in o: + */ + +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(PyObject *__pyx_v_o) { + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> __pyx_v_v; + PyObject *__pyx_v_item = NULL; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int __pyx_t_5; + __Pyx_RefNannySetupContext("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int", 0); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_1 = __pyx_v_o; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + __pyx_t_3 = NULL; + } else { + __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 47, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_3)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } + } else { + __pyx_t_4 = __pyx_t_3(__pyx_t_1); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 47, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_4); + __pyx_t_4 = 0; + + /* "vector.from_py":48 + * cdef vector[X] v + * for item in o: + * v.push_back(item) # <<<<<<<<<<<<<< + * return v + * + */ + __pyx_t_5 = __Pyx_PyInt_As_npy_long(__pyx_v_item); if (unlikely((__pyx_t_5 == ((npy_long)-1)) && PyErr_Occurred())) __PYX_ERR(1, 48, __pyx_L1_error) + __pyx_v_v.push_back(((__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int)__pyx_t_5)); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "vector.from_py":49 + * for item in o: + * v.push_back(item) + * return v # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_v; + goto __pyx_L0; + + /* "vector.from_py":45 + * + * @cname("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int") + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(object o) except *: # <<<<<<<<<<<<<< + * cdef vector[X] v + * for item in o: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("vector.from_py.__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_pretend_to_initialize(&__pyx_r); + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(PyObject *__pyx_v_o) { + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> __pyx_v_v; + PyObject *__pyx_v_item = NULL; + std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + __pyx_t_10MDAnalysis_3lib_6nsgrid_intvec __pyx_t_5; + __Pyx_RefNannySetupContext("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec", 0); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { + __pyx_t_1 = __pyx_v_o; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + __pyx_t_3 = NULL; + } else { + __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 47, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_3)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 47, __pyx_L1_error) + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } + } else { + __pyx_t_4 = __pyx_t_3(__pyx_t_1); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 47, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_4); + __pyx_t_4 = 0; + + /* "vector.from_py":48 + * cdef vector[X] v + * for item in o: + * v.push_back(item) # <<<<<<<<<<<<<< + * return v + * + */ + __pyx_t_5 = __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(__pyx_v_item); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 48, __pyx_L1_error) + __pyx_v_v.push_back(((__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec)__pyx_t_5)); + + /* "vector.from_py":47 + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(object o) except *: + * cdef vector[X] v + * for item in o: # <<<<<<<<<<<<<< + * v.push_back(item) + * return v + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "vector.from_py":49 + * for item in o: + * v.push_back(item) + * return v # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_v; + goto __pyx_L0; + + /* "vector.from_py":45 + * + * @cname("__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec") + * cdef vector[X] __pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec(object o) except *: # <<<<<<<<<<<<<< + * cdef vector[X] v + * for item in o: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("vector.from_py.__pyx_convert_vector_from_py___pyx_t_10MDAnalysis_3lib_6nsgrid_intvec", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_pretend_to_initialize(&__pyx_r); + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_item); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + +/* Python wrapper */ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_shape = 0; + Py_ssize_t __pyx_v_itemsize; + PyObject *__pyx_v_format = 0; + PyObject *__pyx_v_mode = 0; + int __pyx_v_allocate_buffer; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_shape,&__pyx_n_s_itemsize,&__pyx_n_s_format,&__pyx_n_s_mode,&__pyx_n_s_allocate_buffer,0}; + PyObject* values[5] = {0,0,0,0,0}; + values[3] = ((PyObject *)__pyx_n_s_c); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_shape)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_itemsize)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(1, 121, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_format)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(1, 121, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mode); + if (value) { values[3] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_allocate_buffer); + if (value) { values[4] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(1, 121, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_shape = ((PyObject*)values[0]); + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 121, __pyx_L3_error) + __pyx_v_format = values[2]; + __pyx_v_mode = values[3]; + if (values[4]) { + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 122, __pyx_L3_error) + } else { + + /* "View.MemoryView":122 + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, + * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< + * + * cdef int idx + */ + __pyx_v_allocate_buffer = ((int)1); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 121, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(1, 121, __pyx_L1_error) + if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(1, 121, __pyx_L1_error) + } + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); + + /* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer) { + int __pyx_v_idx; + Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_dim; + PyObject **__pyx_v_p; + char __pyx_v_order; + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + char *__pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + Py_ssize_t __pyx_t_11; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_format); + + /* "View.MemoryView":128 + * cdef PyObject **p + * + * self.ndim = len(shape) # <<<<<<<<<<<<<< + * self.itemsize = itemsize + * + */ + if (unlikely(__pyx_v_shape == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 128, __pyx_L1_error) + } + __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 128, __pyx_L1_error) + __pyx_v_self->ndim = ((int)__pyx_t_1); + + /* "View.MemoryView":129 + * + * self.ndim = len(shape) + * self.itemsize = itemsize # <<<<<<<<<<<<<< + * + * if not self.ndim: + */ + __pyx_v_self->itemsize = __pyx_v_itemsize; + + /* "View.MemoryView":131 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") + * + */ + __pyx_t_2 = ((!(__pyx_v_self->ndim != 0)) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":132 + * + * if not self.ndim: + * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 132, __pyx_L1_error) + + /* "View.MemoryView":131 + * self.itemsize = itemsize + * + * if not self.ndim: # <<<<<<<<<<<<<< + * raise ValueError("Empty shape tuple for cython.array") + * + */ + } + + /* "View.MemoryView":134 + * raise ValueError("Empty shape tuple for cython.array") + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") + * + */ + __pyx_t_2 = ((__pyx_v_itemsize <= 0) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":135 + * + * if itemsize <= 0: + * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 135, __pyx_L1_error) + + /* "View.MemoryView":134 + * raise ValueError("Empty shape tuple for cython.array") + * + * if itemsize <= 0: # <<<<<<<<<<<<<< + * raise ValueError("itemsize <= 0 for cython.array") + * + */ + } + + /* "View.MemoryView":137 + * raise ValueError("itemsize <= 0 for cython.array") + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_format); + __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":138 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":137 + * raise ValueError("itemsize <= 0 for cython.array") + * + * if not isinstance(format, bytes): # <<<<<<<<<<<<<< + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + */ + } + + /* "View.MemoryView":139 + * if not isinstance(format, bytes): + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< + * self.format = self._format + * + */ + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(1, 139, __pyx_L1_error) + __pyx_t_5 = __pyx_v_format; + __Pyx_INCREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_v_self->_format); + __Pyx_DECREF(__pyx_v_self->_format); + __pyx_v_self->_format = ((PyObject*)__pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":140 + * format = format.encode('ASCII') + * self._format = format # keep a reference to the byte string + * self.format = self._format # <<<<<<<<<<<<<< + * + * + */ + if (unlikely(__pyx_v_self->_format == Py_None)) { + PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); + __PYX_ERR(1, 140, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) __PYX_ERR(1, 140, __pyx_L1_error) + __pyx_v_self->format = __pyx_t_6; + + /* "View.MemoryView":143 + * + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< + * self._strides = self._shape + self.ndim + * + */ + __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); + + /* "View.MemoryView":144 + * + * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) + * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< + * + * if not self._shape: + */ + __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); + + /* "View.MemoryView":146 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") + * + */ + __pyx_t_4 = ((!(__pyx_v_self->_shape != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":147 + * + * if not self._shape: + * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 147, __pyx_L1_error) + + /* "View.MemoryView":146 + * self._strides = self._shape + self.ndim + * + * if not self._shape: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate shape and strides.") + * + */ + } + + /* "View.MemoryView":150 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + */ + __pyx_t_7 = 0; + __pyx_t_5 = __pyx_v_shape; __Pyx_INCREF(__pyx_t_5); __pyx_t_1 = 0; + for (;;) { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(1, 150, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_5, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 150, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_dim = __pyx_t_8; + __pyx_v_idx = __pyx_t_7; + __pyx_t_7 = (__pyx_t_7 + 1); + + /* "View.MemoryView":151 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim + */ + __pyx_t_4 = ((__pyx_v_dim <= 0) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":152 + * for idx, dim in enumerate(shape): + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) # <<<<<<<<<<<<<< + * self._shape[idx] = dim + * + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_9); + __pyx_t_3 = 0; + __pyx_t_9 = 0; + __pyx_t_9 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(1, 152, __pyx_L1_error) + + /* "View.MemoryView":151 + * + * for idx, dim in enumerate(shape): + * if dim <= 0: # <<<<<<<<<<<<<< + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim + */ + } + + /* "View.MemoryView":153 + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + * self._shape[idx] = dim # <<<<<<<<<<<<<< + * + * cdef char order + */ + (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; + + /* "View.MemoryView":150 + * + * + * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< + * if dim <= 0: + * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) + */ + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "View.MemoryView":156 + * + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(1, 156, __pyx_L1_error) + if (__pyx_t_4) { + + /* "View.MemoryView":157 + * cdef char order + * if mode == 'fortran': + * order = b'F' # <<<<<<<<<<<<<< + * self.mode = u'fortran' + * elif mode == 'c': + */ + __pyx_v_order = 'F'; + + /* "View.MemoryView":158 + * if mode == 'fortran': + * order = b'F' + * self.mode = u'fortran' # <<<<<<<<<<<<<< + * elif mode == 'c': + * order = b'C' + */ + __Pyx_INCREF(__pyx_n_u_fortran); + __Pyx_GIVEREF(__pyx_n_u_fortran); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_fortran; + + /* "View.MemoryView":156 + * + * cdef char order + * if mode == 'fortran': # <<<<<<<<<<<<<< + * order = b'F' + * self.mode = u'fortran' + */ + goto __pyx_L10; + } + + /* "View.MemoryView":159 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(1, 159, __pyx_L1_error) + if (likely(__pyx_t_4)) { + + /* "View.MemoryView":160 + * self.mode = u'fortran' + * elif mode == 'c': + * order = b'C' # <<<<<<<<<<<<<< + * self.mode = u'c' + * else: + */ + __pyx_v_order = 'C'; + + /* "View.MemoryView":161 + * elif mode == 'c': + * order = b'C' + * self.mode = u'c' # <<<<<<<<<<<<<< + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + */ + __Pyx_INCREF(__pyx_n_u_c); + __Pyx_GIVEREF(__pyx_n_u_c); + __Pyx_GOTREF(__pyx_v_self->mode); + __Pyx_DECREF(__pyx_v_self->mode); + __pyx_v_self->mode = __pyx_n_u_c; + + /* "View.MemoryView":159 + * order = b'F' + * self.mode = u'fortran' + * elif mode == 'c': # <<<<<<<<<<<<<< + * order = b'C' + * self.mode = u'c' + */ + goto __pyx_L10; + } + + /* "View.MemoryView":163 + * self.mode = u'c' + * else: + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) # <<<<<<<<<<<<<< + * + * self.len = fill_contig_strides_array(self._shape, self._strides, + */ + /*else*/ { + __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 163, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 163, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(1, 163, __pyx_L1_error) + } + __pyx_L10:; + + /* "View.MemoryView":165 + * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) + * + * self.len = fill_contig_strides_array(self._shape, self._strides, # <<<<<<<<<<<<<< + * itemsize, self.ndim, order) + * + */ + __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); + + /* "View.MemoryView":168 + * itemsize, self.ndim, order) + * + * self.free_data = allocate_buffer # <<<<<<<<<<<<<< + * self.dtype_is_object = format == b'O' + * if allocate_buffer: + */ + __pyx_v_self->free_data = __pyx_v_allocate_buffer; + + /* "View.MemoryView":169 + * + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< + * if allocate_buffer: + * + */ + __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 169, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 169, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_v_self->dtype_is_object = __pyx_t_4; + + /* "View.MemoryView":170 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_4 = (__pyx_v_allocate_buffer != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":173 + * + * + * self.data = malloc(self.len) # <<<<<<<<<<<<<< + * if not self.data: + * raise MemoryError("unable to allocate array data.") + */ + __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); + + /* "View.MemoryView":174 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ + __pyx_t_4 = ((!(__pyx_v_self->data != 0)) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":175 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_Raise(__pyx_t_10, 0, 0, 0); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __PYX_ERR(1, 175, __pyx_L1_error) + + /* "View.MemoryView":174 + * + * self.data = malloc(self.len) + * if not self.data: # <<<<<<<<<<<<<< + * raise MemoryError("unable to allocate array data.") + * + */ + } + + /* "View.MemoryView":177 + * raise MemoryError("unable to allocate array data.") + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): + */ + __pyx_t_4 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":178 + * + * if self.dtype_is_object: + * p = self.data # <<<<<<<<<<<<<< + * for i in range(self.len / itemsize): + * p[i] = Py_None + */ + __pyx_v_p = ((PyObject **)__pyx_v_self->data); + + /* "View.MemoryView":179 + * if self.dtype_is_object: + * p = self.data + * for i in range(self.len / itemsize): # <<<<<<<<<<<<<< + * p[i] = Py_None + * Py_INCREF(Py_None) + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 179, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 179, __pyx_L1_error) + } + __pyx_t_1 = (__pyx_v_self->len / __pyx_v_itemsize); + __pyx_t_8 = __pyx_t_1; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_8; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "View.MemoryView":180 + * p = self.data + * for i in range(self.len / itemsize): + * p[i] = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + (__pyx_v_p[__pyx_v_i]) = Py_None; + + /* "View.MemoryView":181 + * for i in range(self.len / itemsize): + * p[i] = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + Py_INCREF(Py_None); + } + + /* "View.MemoryView":177 + * raise MemoryError("unable to allocate array data.") + * + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * p = self.data + * for i in range(self.len / itemsize): + */ + } + + /* "View.MemoryView":170 + * self.free_data = allocate_buffer + * self.dtype_is_object = format == b'O' + * if allocate_buffer: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":121 + * cdef bint dtype_is_object + * + * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< + * mode="c", bint allocate_buffer=True): + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_format); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":184 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(((struct __pyx_array_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_bufmode; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + char *__pyx_t_4; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + Py_ssize_t *__pyx_t_7; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":185 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 # <<<<<<<<<<<<<< + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = -1; + + /* "View.MemoryView":186 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 186, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":187 + * cdef int bufmode = -1 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + */ + __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":186 + * def __getbuffer__(self, Py_buffer *info, int flags): + * cdef int bufmode = -1 + * if self.mode == u"c": # <<<<<<<<<<<<<< + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + */ + goto __pyx_L3; + } + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(1, 188, __pyx_L1_error) + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":189 + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") + */ + __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); + + /* "View.MemoryView":188 + * if self.mode == u"c": + * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * elif self.mode == u"fortran": # <<<<<<<<<<<<<< + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + */ + } + __pyx_L3:; + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + __pyx_t_1 = ((!((__pyx_v_flags & __pyx_v_bufmode) != 0)) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 191, __pyx_L1_error) + + /* "View.MemoryView":190 + * elif self.mode == u"fortran": + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): # <<<<<<<<<<<<<< + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + */ + } + + /* "View.MemoryView":192 + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data # <<<<<<<<<<<<<< + * info.len = self.len + * info.ndim = self.ndim + */ + __pyx_t_4 = __pyx_v_self->data; + __pyx_v_info->buf = __pyx_t_4; + + /* "View.MemoryView":193 + * raise ValueError("Can only create a buffer that is contiguous in memory.") + * info.buf = self.data + * info.len = self.len # <<<<<<<<<<<<<< + * info.ndim = self.ndim + * info.shape = self._shape + */ + __pyx_t_5 = __pyx_v_self->len; + __pyx_v_info->len = __pyx_t_5; + + /* "View.MemoryView":194 + * info.buf = self.data + * info.len = self.len + * info.ndim = self.ndim # <<<<<<<<<<<<<< + * info.shape = self._shape + * info.strides = self._strides + */ + __pyx_t_6 = __pyx_v_self->ndim; + __pyx_v_info->ndim = __pyx_t_6; + + /* "View.MemoryView":195 + * info.len = self.len + * info.ndim = self.ndim + * info.shape = self._shape # <<<<<<<<<<<<<< + * info.strides = self._strides + * info.suboffsets = NULL + */ + __pyx_t_7 = __pyx_v_self->_shape; + __pyx_v_info->shape = __pyx_t_7; + + /* "View.MemoryView":196 + * info.ndim = self.ndim + * info.shape = self._shape + * info.strides = self._strides # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = self.itemsize + */ + __pyx_t_7 = __pyx_v_self->_strides; + __pyx_v_info->strides = __pyx_t_7; + + /* "View.MemoryView":197 + * info.shape = self._shape + * info.strides = self._strides + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = self.itemsize + * info.readonly = 0 + */ + __pyx_v_info->suboffsets = NULL; + + /* "View.MemoryView":198 + * info.strides = self._strides + * info.suboffsets = NULL + * info.itemsize = self.itemsize # <<<<<<<<<<<<<< + * info.readonly = 0 + * + */ + __pyx_t_5 = __pyx_v_self->itemsize; + __pyx_v_info->itemsize = __pyx_t_5; + + /* "View.MemoryView":199 + * info.suboffsets = NULL + * info.itemsize = self.itemsize + * info.readonly = 0 # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + __pyx_v_info->readonly = 0; + + /* "View.MemoryView":201 + * info.readonly = 0 + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":202 + * + * if flags & PyBUF_FORMAT: + * info.format = self.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_4 = __pyx_v_self->format; + __pyx_v_info->format = __pyx_t_4; + + /* "View.MemoryView":201 + * info.readonly = 0 + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.format + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":204 + * info.format = self.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.obj = self + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L5:; + + /* "View.MemoryView":206 + * info.format = NULL + * + * info.obj = self # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":184 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * cdef int bufmode = -1 + * if self.mode == u"c": + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":210 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + +/* Python wrapper */ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_array___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: + */ + __pyx_t_1 = ((__pyx_v_self->callback_free_data != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":212 + * def __dealloc__(array self): + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) # <<<<<<<<<<<<<< + * elif self.free_data: + * if self.dtype_is_object: + */ + __pyx_v_self->callback_free_data(__pyx_v_self->data); + + /* "View.MemoryView":211 + * + * def __dealloc__(array self): + * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< + * self.callback_free_data(self.data) + * elif self.free_data: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, + */ + __pyx_t_1 = (__pyx_v_self->free_data != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + */ + __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":215 + * elif self.free_data: + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, # <<<<<<<<<<<<<< + * self._strides, self.ndim, False) + * free(self.data) + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); + + /* "View.MemoryView":214 + * self.callback_free_data(self.data) + * elif self.free_data: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + */ + } + + /* "View.MemoryView":217 + * refcount_objects_in_slice(self.data, self._shape, + * self._strides, self.ndim, False) + * free(self.data) # <<<<<<<<<<<<<< + * PyObject_Free(self._shape) + * + */ + free(__pyx_v_self->data); + + /* "View.MemoryView":213 + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + * elif self.free_data: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * refcount_objects_in_slice(self.data, self._shape, + */ + } + __pyx_L3:; + + /* "View.MemoryView":218 + * self._strides, self.ndim, False) + * free(self.data) + * PyObject_Free(self._shape) # <<<<<<<<<<<<<< + * + * @property + */ + PyObject_Free(__pyx_v_self->_shape); + + /* "View.MemoryView":210 + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") + * + * def __dealloc__(array self): # <<<<<<<<<<<<<< + * if self.callback_free_data != NULL: + * self.callback_free_data(self.data) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":221 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_5array_7memview___get__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":222 + * @property + * def memview(self): + * return self.get_memview() # <<<<<<<<<<<<<< + * + * @cname('get_memview') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 222, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":221 + * + * @property + * def memview(self): # <<<<<<<<<<<<<< + * return self.get_memview() + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.memview.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":225 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + +static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_memview", 0); + + /* "View.MemoryView":226 + * @cname('get_memview') + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< + * return memoryview(self, flags, self.dtype_is_object) + * + */ + __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); + + /* "View.MemoryView":227 + * cdef get_memview(self): + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 227, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":225 + * + * @cname('get_memview') + * cdef get_memview(self): # <<<<<<<<<<<<<< + * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE + * return memoryview(self, flags, self.dtype_is_object) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.array.get_memview", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":229 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(struct __pyx_array_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__", 0); + + /* "View.MemoryView":230 + * + * def __len__(self): + * return self._shape[0] # <<<<<<<<<<<<<< + * + * def __getattr__(self, attr): + */ + __pyx_r = (__pyx_v_self->_shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":229 + * return memoryview(self, flags, self.dtype_is_object) + * + * def __len__(self): # <<<<<<<<<<<<<< + * return self._shape[0] + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":232 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr); /*proto*/ +static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getattr__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_attr)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_attr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getattr__", 0); + + /* "View.MemoryView":233 + * + * def __getattr__(self, attr): + * return getattr(self.memview, attr) # <<<<<<<<<<<<<< + * + * def __getitem__(self, item): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":232 + * return self._shape[0] + * + * def __getattr__(self, attr): # <<<<<<<<<<<<<< + * return getattr(self.memview, attr) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getattr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":235 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + +/* Python wrapper */ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item); /*proto*/ +static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__getitem__", 0); + + /* "View.MemoryView":236 + * + * def __getitem__(self, item): + * return self.memview[item] # <<<<<<<<<<<<<< + * + * def __setitem__(self, item, value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":235 + * return getattr(self.memview, attr) + * + * def __getitem__(self, item): # <<<<<<<<<<<<<< + * return self.memview[item] + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.array.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":238 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + +/* Python wrapper */ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v_item), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_item, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + + /* "View.MemoryView":239 + * + * def __setitem__(self, item, value): + * self.memview[item] = value # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(1, 239, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":238 + * return self.memview[item] + * + * def __setitem__(self, item, value): # <<<<<<<<<<<<<< + * self.memview[item] = value + * + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array___reduce_cython__(((struct __pyx_array_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_array_2__setstate_cython__(((struct __pyx_array_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct __pyx_array_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.array.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":243 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result + */ + +static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, char *__pyx_v_format, char *__pyx_v_mode, char *__pyx_v_buf) { + struct __pyx_array_obj *__pyx_v_result = 0; + struct __pyx_array_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("array_cwrapper", 0); + + /* "View.MemoryView":247 + * cdef array result + * + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + */ + __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":248 + * + * if buf == NULL: + * result = array(shape, itemsize, format, mode.decode('ASCII')) # <<<<<<<<<<<<<< + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":247 + * cdef array result + * + * if buf == NULL: # <<<<<<<<<<<<<< + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":250 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf + */ + /*else*/ { + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_shape); + __Pyx_GIVEREF(__pyx_v_shape); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_shape); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_3); + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_3 = 0; + + /* "View.MemoryView":251 + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) # <<<<<<<<<<<<<< + * result.data = buf + * + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 251, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(1, 251, __pyx_L1_error) + + /* "View.MemoryView":250 + * result = array(shape, itemsize, format, mode.decode('ASCII')) + * else: + * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< + * allocate_buffer=False) + * result.data = buf + */ + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "View.MemoryView":252 + * result = array(shape, itemsize, format, mode.decode('ASCII'), + * allocate_buffer=False) + * result.data = buf # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->data = __pyx_v_buf; + } + __pyx_L3:; + + /* "View.MemoryView":254 + * result.data = buf + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":243 + * + * @cname("__pyx_array_new") + * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< + * char *mode, char *buf): + * cdef array result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.array_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":280 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + +/* Python wrapper */ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(1, 280, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_name = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 280, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), __pyx_v_name); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v_name) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 0); + + /* "View.MemoryView":281 + * cdef object name + * def __init__(self, name): + * self.name = name # <<<<<<<<<<<<<< + * def __repr__(self): + * return self.name + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "View.MemoryView":280 + * cdef class Enum(object): + * cdef object name + * def __init__(self, name): # <<<<<<<<<<<<<< + * self.name = name + * def __repr__(self): + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":282 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + +/* Python wrapper */ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "View.MemoryView":283 + * self.name = name + * def __repr__(self): + * return self.name # <<<<<<<<<<<<<< + * + * cdef generic = Enum("") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* "View.MemoryView":282 + * def __init__(self, name): + * self.name = name + * def __repr__(self): # <<<<<<<<<<<<<< + * return self.name + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.name,) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum___reduce_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self) { + int __pyx_v_use_setstate; + PyObject *__pyx_v_state = NULL; + PyObject *__pyx_v__dict = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * cdef bint use_setstate + * state = (self.name,) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":4 + * cdef bint use_setstate + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":5 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":6 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); + __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); + __pyx_t_4 = 0; + + /* "(tree fragment)":7 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":5 + * state = (self.name,) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":9 + * use_setstate = True + * else: + * use_setstate = self.name is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_self->name != Py_None); + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + __pyx_t_3 = (__pyx_v_use_setstate != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":11 + * use_setstate = self.name is not None + * if use_setstate: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "(tree fragment)":10 + * else: + * use_setstate = self.name is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + */ + } + + /* "(tree fragment)":13 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, None), state + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_pyx_unpickle_Enum); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_184977713); + __Pyx_GIVEREF(__pyx_int_184977713); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_184977713); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __pyx_t_5 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef bint use_setstate + * state = (self.name,) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.Enum.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":14 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_MemviewEnum_2__setstate_cython__(((struct __pyx_MemviewEnum_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_MemviewEnum_obj *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":15 + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 15, __pyx_L1_error) + __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":14 + * else: + * return __pyx_unpickle_Enum, (type(self), 0xb068931, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.Enum.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":297 + * + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory + */ + +static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) { + Py_intptr_t __pyx_v_aligned_p; + size_t __pyx_v_offset; + void *__pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":299 + * cdef void *align_pointer(void *memory, size_t alignment) nogil: + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory # <<<<<<<<<<<<<< + * cdef size_t offset + * + */ + __pyx_v_aligned_p = ((Py_intptr_t)__pyx_v_memory); + + /* "View.MemoryView":303 + * + * with cython.cdivision(True): + * offset = aligned_p % alignment # <<<<<<<<<<<<<< + * + * if offset > 0: + */ + __pyx_v_offset = (__pyx_v_aligned_p % __pyx_v_alignment); + + /* "View.MemoryView":305 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset + * + */ + __pyx_t_1 = ((__pyx_v_offset > 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":306 + * + * if offset > 0: + * aligned_p += alignment - offset # <<<<<<<<<<<<<< + * + * return aligned_p + */ + __pyx_v_aligned_p = (__pyx_v_aligned_p + (__pyx_v_alignment - __pyx_v_offset)); + + /* "View.MemoryView":305 + * offset = aligned_p % alignment + * + * if offset > 0: # <<<<<<<<<<<<<< + * aligned_p += alignment - offset + * + */ + } + + /* "View.MemoryView":308 + * aligned_p += alignment - offset + * + * return aligned_p # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((void *)__pyx_v_aligned_p); + goto __pyx_L0; + + /* "View.MemoryView":297 + * + * @cname('__pyx_align_pointer') + * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< + * "Align pointer memory on a given boundary" + * cdef Py_intptr_t aligned_p = memory + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":344 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + +/* Python wrapper */ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_obj = 0; + int __pyx_v_flags; + int __pyx_v_dtype_is_object; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,&__pyx_n_s_flags,&__pyx_n_s_dtype_is_object,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_obj)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flags)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(1, 344, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_dtype_is_object); + if (value) { values[2] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(1, 344, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_obj = values[0]; + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 344, __pyx_L3_error) + if (values[2]) { + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 344, __pyx_L3_error) + } else { + __pyx_v_dtype_is_object = ((int)0); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 344, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_obj, __pyx_v_flags, __pyx_v_dtype_is_object); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_v_flags, int __pyx_v_dtype_is_object) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "View.MemoryView":345 + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj # <<<<<<<<<<<<<< + * self.flags = flags + * if type(self) is memoryview or obj is not None: + */ + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + __Pyx_GOTREF(__pyx_v_self->obj); + __Pyx_DECREF(__pyx_v_self->obj); + __pyx_v_self->obj = __pyx_v_obj; + + /* "View.MemoryView":346 + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): + * self.obj = obj + * self.flags = flags # <<<<<<<<<<<<<< + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + */ + __pyx_v_self->flags = __pyx_v_flags; + + /* "View.MemoryView":347 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + __pyx_t_2 = (((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))) == ((PyObject *)__pyx_memoryview_type)); + __pyx_t_3 = (__pyx_t_2 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_obj != Py_None); + __pyx_t_2 = (__pyx_t_3 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (__pyx_t_1) { + + /* "View.MemoryView":348 + * self.flags = flags + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + */ + __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 348, __pyx_L1_error) + + /* "View.MemoryView":349 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_t_1 = ((((PyObject *)__pyx_v_self->view.obj) == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":350 + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; + + /* "View.MemoryView":351 + * if self.view.obj == NULL: + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * global __pyx_memoryview_thread_locks_used + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":349 + * if type(self) is memoryview or obj is not None: + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &self.view).obj = Py_None + * Py_INCREF(Py_None) + */ + } + + /* "View.MemoryView":347 + * self.obj = obj + * self.flags = flags + * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< + * __Pyx_GetBuffer(obj, &self.view, flags) + * if self.view.obj == NULL: + */ + } + + /* "View.MemoryView":354 + * + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":355 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + */ + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + + /* "View.MemoryView":356 + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + + /* "View.MemoryView":354 + * + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + */ + } + + /* "View.MemoryView":357 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":358 + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":359 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":360 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + PyErr_NoMemory(); __PYX_ERR(1, 360, __pyx_L1_error) + + /* "View.MemoryView":359 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } + + /* "View.MemoryView":357 + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + */ + } + + /* "View.MemoryView":362 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":363 + * + * if flags & PyBUF_FORMAT: + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< + * else: + * self.dtype_is_object = dtype_is_object + */ + __pyx_t_2 = (((__pyx_v_self->view.format[0]) == 'O') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_2 = (((__pyx_v_self->view.format[1]) == '\x00') != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_self->dtype_is_object = __pyx_t_1; + + /* "View.MemoryView":362 + * raise MemoryError + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + */ + goto __pyx_L10; + } + + /* "View.MemoryView":365 + * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') + * else: + * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< + * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + */ + /*else*/ { + __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; + } + __pyx_L10:; + + /* "View.MemoryView":367 + * self.dtype_is_object = dtype_is_object + * + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( # <<<<<<<<<<<<<< + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL + */ + __pyx_v_self->acquisition_count_aligned_p = ((__pyx_atomic_int *)__pyx_align_pointer(((void *)(&(__pyx_v_self->acquisition_count[0]))), (sizeof(__pyx_atomic_int)))); + + /* "View.MemoryView":369 + * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( + * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) + * self.typeinfo = NULL # <<<<<<<<<<<<<< + * + * def __dealloc__(memoryview self): + */ + __pyx_v_self->typeinfo = NULL; + + /* "View.MemoryView":344 + * cdef __Pyx_TypeInfo *typeinfo + * + * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< + * self.obj = obj + * self.flags = flags + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":371 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + +/* Python wrapper */ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__(struct __pyx_memoryview_obj *__pyx_v_self) { + int __pyx_v_i; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyThread_type_lock __pyx_t_6; + PyThread_type_lock __pyx_t_7; + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":372 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * + */ + __pyx_t_1 = (__pyx_v_self->obj != Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":373 + * def __dealloc__(memoryview self): + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< + * + * cdef int i + */ + __Pyx_ReleaseBuffer((&__pyx_v_self->view)); + + /* "View.MemoryView":372 + * + * def __dealloc__(memoryview self): + * if self.obj is not None: # <<<<<<<<<<<<<< + * __Pyx_ReleaseBuffer(&self.view) + * + */ + } + + /* "View.MemoryView":377 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + __pyx_t_2 = ((__pyx_v_self->lock != NULL) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":378 + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + */ + __pyx_t_3 = __pyx_memoryview_thread_locks_used; + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "View.MemoryView":379 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + __pyx_t_2 = (((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":380 + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + */ + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); + + /* "View.MemoryView":381 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + __pyx_t_2 = ((__pyx_v_i != __pyx_memoryview_thread_locks_used) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":383 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); + __pyx_t_7 = (__pyx_memoryview_thread_locks[__pyx_v_i]); + + /* "View.MemoryView":382 + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break + */ + (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_6; + (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_7; + + /* "View.MemoryView":381 + * if __pyx_memoryview_thread_locks[i] is self.lock: + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + */ + } + + /* "View.MemoryView":384 + * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( + * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) + * break # <<<<<<<<<<<<<< + * else: + * PyThread_free_lock(self.lock) + */ + goto __pyx_L6_break; + + /* "View.MemoryView":379 + * if self.lock != NULL: + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used -= 1 + * if i != __pyx_memoryview_thread_locks_used: + */ + } + } + /*else*/ { + + /* "View.MemoryView":386 + * break + * else: + * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + */ + PyThread_free_lock(__pyx_v_self->lock); + } + __pyx_L6_break:; + + /* "View.MemoryView":377 + * cdef int i + * global __pyx_memoryview_thread_locks_used + * if self.lock != NULL: # <<<<<<<<<<<<<< + * for i in range(__pyx_memoryview_thread_locks_used): + * if __pyx_memoryview_thread_locks[i] is self.lock: + */ + } + + /* "View.MemoryView":371 + * self.typeinfo = NULL + * + * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< + * if self.obj is not None: + * __Pyx_ReleaseBuffer(&self.view) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":388 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + +static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + Py_ssize_t __pyx_v_dim; + char *__pyx_v_itemp; + PyObject *__pyx_v_idx = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + char *__pyx_t_7; + __Pyx_RefNannySetupContext("get_item_pointer", 0); + + /* "View.MemoryView":390 + * cdef char *get_item_pointer(memoryview self, object index) except NULL: + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< + * + * for dim, idx in enumerate(index): + */ + __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); + + /* "View.MemoryView":392 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + __pyx_t_1 = 0; + if (likely(PyList_CheckExact(__pyx_v_index)) || PyTuple_CheckExact(__pyx_v_index)) { + __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 392, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(1, 392, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(1, 392, __pyx_L1_error) + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 392, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 392, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_5); + __pyx_t_5 = 0; + __pyx_v_dim = __pyx_t_1; + __pyx_t_1 = (__pyx_t_1 + 1); + + /* "View.MemoryView":393 + * + * for dim, idx in enumerate(index): + * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< + * + * return itemp + */ + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 393, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(1, 393, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_7; + + /* "View.MemoryView":392 + * cdef char *itemp = self.view.buf + * + * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + */ + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":395 + * itemp = pybuffer_index(&self.view, itemp, idx, dim) + * + * return itemp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_itemp; + goto __pyx_L0; + + /* "View.MemoryView":388 + * PyThread_free_lock(self.lock) + * + * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< + * cdef Py_ssize_t dim + * cdef char *itemp = self.view.buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.get_item_pointer", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":398 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/ +static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4__getitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_indices = NULL; + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + char *__pyx_t_6; + __Pyx_RefNannySetupContext("__getitem__", 0); + + /* "View.MemoryView":399 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + __pyx_t_1 = (__pyx_v_index == __pyx_builtin_Ellipsis); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":400 + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: + * return self # <<<<<<<<<<<<<< + * + * have_slices, indices = _unellipsify(index, self.view.ndim) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __pyx_r = ((PyObject *)__pyx_v_self); + goto __pyx_L0; + + /* "View.MemoryView":399 + * + * def __getitem__(memoryview self, object index): + * if index is Ellipsis: # <<<<<<<<<<<<<< + * return self + * + */ + } + + /* "View.MemoryView":402 + * return self + * + * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * cdef char *itemp + */ + __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (likely(__pyx_t_3 != Py_None)) { + PyObject* sequence = __pyx_t_3; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 402, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 402, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 402, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_v_indices = __pyx_t_5; + __pyx_t_5 = 0; + + /* "View.MemoryView":405 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(1, 405, __pyx_L1_error) + if (__pyx_t_2) { + + /* "View.MemoryView":406 + * cdef char *itemp + * if have_slices: + * return memview_slice(self, indices) # <<<<<<<<<<<<<< + * else: + * itemp = self.get_item_pointer(indices) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 406, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":405 + * + * cdef char *itemp + * if have_slices: # <<<<<<<<<<<<<< + * return memview_slice(self, indices) + * else: + */ + } + + /* "View.MemoryView":408 + * return memview_slice(self, indices) + * else: + * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< + * return self.convert_item_to_object(itemp) + * + */ + /*else*/ { + __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(1, 408, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_6; + + /* "View.MemoryView":409 + * else: + * itemp = self.get_item_pointer(indices) + * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< + * + * def __setitem__(memoryview self, object index, object value): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 409, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":398 + * + * + * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< + * if index is Ellipsis: + * return self + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_indices); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":411 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") + */ + +/* Python wrapper */ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v_index), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + PyObject *__pyx_v_have_slices = NULL; + PyObject *__pyx_v_obj = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("__setitem__", 0); + __Pyx_INCREF(__pyx_v_index); + + /* "View.MemoryView":412 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") + * + */ + __pyx_t_1 = (__pyx_v_self->view.readonly != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":413 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 413, __pyx_L1_error) + + /* "View.MemoryView":412 + * + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: # <<<<<<<<<<<<<< + * raise TypeError("Cannot assign to read-only memoryview") + * + */ + } + + /* "View.MemoryView":415 + * raise TypeError("Cannot assign to read-only memoryview") + * + * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< + * + * if have_slices: + */ + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(__pyx_t_2 != Py_None)) { + PyObject* sequence = __pyx_t_2; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(1, 415, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 415, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 415, __pyx_L1_error) + } + __pyx_v_have_slices = __pyx_t_3; + __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":417 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 417, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":418 + * + * if have_slices: + * obj = self.is_slice(value) # <<<<<<<<<<<<<< + * if obj: + * self.setitem_slice_assignment(self[index], obj) + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_obj = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":419 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 419, __pyx_L1_error) + if (__pyx_t_1) { + + /* "View.MemoryView":420 + * obj = self.is_slice(value) + * if obj: + * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< + * else: + * self.setitem_slice_assign_scalar(self[index], value) + */ + __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "View.MemoryView":419 + * if have_slices: + * obj = self.is_slice(value) + * if obj: # <<<<<<<<<<<<<< + * self.setitem_slice_assignment(self[index], obj) + * else: + */ + goto __pyx_L5; + } + + /* "View.MemoryView":422 + * self.setitem_slice_assignment(self[index], obj) + * else: + * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< + * else: + * self.setitem_indexed(index, value) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(1, 422, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L5:; + + /* "View.MemoryView":417 + * have_slices, index = _unellipsify(index, self.view.ndim) + * + * if have_slices: # <<<<<<<<<<<<<< + * obj = self.is_slice(value) + * if obj: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":424 + * self.setitem_slice_assign_scalar(self[index], value) + * else: + * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< + * + * cdef is_slice(self, obj): + */ + /*else*/ { + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 424, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L4:; + + /* "View.MemoryView":411 + * return self.convert_item_to_object(itemp) + * + * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setitem__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_have_slices); + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":426 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + +static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_obj) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + __Pyx_RefNannySetupContext("is_slice", 0); + __Pyx_INCREF(__pyx_v_obj); + + /* "View.MemoryView":427 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_obj, __pyx_memoryview_type); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + /*try:*/ { + + /* "View.MemoryView":429 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_6 = __Pyx_PyInt_From_int((__pyx_v_self->flags | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":430 + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) # <<<<<<<<<<<<<< + * except TypeError: + * return None + */ + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 430, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "View.MemoryView":429 + * if not isinstance(obj, memoryview): + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< + * self.dtype_is_object) + * except TypeError: + */ + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_v_obj); + __Pyx_GIVEREF(__pyx_v_obj); + PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_obj); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 429, __pyx_L4_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); + __pyx_t_7 = 0; + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + } + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L9_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":431 + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + * except TypeError: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(1, 431, __pyx_L6_except_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_t_6); + + /* "View.MemoryView":432 + * self.dtype_is_object) + * except TypeError: + * return None # <<<<<<<<<<<<<< + * + * return obj + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_except_return; + } + goto __pyx_L6_except_error; + __pyx_L6_except_error:; + + /* "View.MemoryView":428 + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): + * try: # <<<<<<<<<<<<<< + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + * self.dtype_is_object) + */ + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L1_error; + __pyx_L7_except_return:; + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); + goto __pyx_L0; + __pyx_L9_try_end:; + } + + /* "View.MemoryView":427 + * + * cdef is_slice(self, obj): + * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< + * try: + * obj = memoryview(obj, self.flags|PyBUF_ANY_CONTIGUOUS, + */ + } + + /* "View.MemoryView":434 + * return None + * + * return obj # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assignment(self, dst, src): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_obj); + __pyx_r = __pyx_v_obj; + goto __pyx_L0; + + /* "View.MemoryView":426 + * self.setitem_indexed(index, value) + * + * cdef is_slice(self, obj): # <<<<<<<<<<<<<< + * if not isinstance(obj, memoryview): + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_obj); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":436 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + +static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_dst, PyObject *__pyx_v_src) { + __Pyx_memviewslice __pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_src_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("setitem_slice_assignment", 0); + + /* "View.MemoryView":440 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(1, 440, __pyx_L1_error) + + /* "View.MemoryView":441 + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], # <<<<<<<<<<<<<< + * src.ndim, dst.ndim, self.dtype_is_object) + * + */ + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(1, 441, __pyx_L1_error) + + /* "View.MemoryView":442 + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 442, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 442, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 442, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 442, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":440 + * cdef __Pyx_memviewslice src_slice + * + * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< + * get_slice_from_memview(dst, &dst_slice)[0], + * src.ndim, dst.ndim, self.dtype_is_object) + */ + __pyx_t_4 = __pyx_memoryview_copy_contents((__pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice))[0]), (__pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice))[0]), __pyx_t_2, __pyx_t_3, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 440, __pyx_L1_error) + + /* "View.MemoryView":436 + * return obj + * + * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice dst_slice + * cdef __Pyx_memviewslice src_slice + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assignment", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":444 + * src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + +static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memoryview_obj *__pyx_v_self, struct __pyx_memoryview_obj *__pyx_v_dst, PyObject *__pyx_v_value) { + int __pyx_v_array[0x80]; + void *__pyx_v_tmp; + void *__pyx_v_item; + __Pyx_memviewslice *__pyx_v_dst_slice; + __Pyx_memviewslice __pyx_v_tmp_slice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + char const *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 0); + + /* "View.MemoryView":446 + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): + * cdef int array[128] + * cdef void *tmp = NULL # <<<<<<<<<<<<<< + * cdef void *item + * + */ + __pyx_v_tmp = NULL; + + /* "View.MemoryView":451 + * cdef __Pyx_memviewslice *dst_slice + * cdef __Pyx_memviewslice tmp_slice + * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< + * + * if self.view.itemsize > sizeof(array): + */ + __pyx_v_dst_slice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); + + /* "View.MemoryView":453 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + __pyx_t_1 = ((((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":454 + * + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< + * if tmp == NULL: + * raise MemoryError + */ + __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); + + /* "View.MemoryView":455 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + __pyx_t_1 = ((__pyx_v_tmp == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":456 + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + * raise MemoryError # <<<<<<<<<<<<<< + * item = tmp + * else: + */ + PyErr_NoMemory(); __PYX_ERR(1, 456, __pyx_L1_error) + + /* "View.MemoryView":455 + * if self.view.itemsize > sizeof(array): + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * item = tmp + */ + } + + /* "View.MemoryView":457 + * if tmp == NULL: + * raise MemoryError + * item = tmp # <<<<<<<<<<<<<< + * else: + * item = array + */ + __pyx_v_item = __pyx_v_tmp; + + /* "View.MemoryView":453 + * dst_slice = get_slice_from_memview(dst, &tmp_slice) + * + * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< + * tmp = PyMem_Malloc(self.view.itemsize) + * if tmp == NULL: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":459 + * item = tmp + * else: + * item = array # <<<<<<<<<<<<<< + * + * try: + */ + /*else*/ { + __pyx_v_item = ((void *)__pyx_v_array); + } + __pyx_L3:; + + /* "View.MemoryView":461 + * item = array + * + * try: # <<<<<<<<<<<<<< + * if self.dtype_is_object: + * ( item)[0] = value + */ + /*try:*/ { + + /* "View.MemoryView":462 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":463 + * try: + * if self.dtype_is_object: + * ( item)[0] = value # <<<<<<<<<<<<<< + * else: + * self.assign_item_from_object( item, value) + */ + (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); + + /* "View.MemoryView":462 + * + * try: + * if self.dtype_is_object: # <<<<<<<<<<<<<< + * ( item)[0] = value + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":465 + * ( item)[0] = value + * else: + * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 465, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L8:; + + /* "View.MemoryView":469 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + __pyx_t_1 = ((__pyx_v_self->view.suboffsets != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":470 + * + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + * item, self.dtype_is_object) + */ + __pyx_t_2 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 470, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":469 + * + * + * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + */ + } + + /* "View.MemoryView":471 + * if self.view.suboffsets != NULL: + * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< + * item, self.dtype_is_object) + * finally: + */ + __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); + } + + /* "View.MemoryView":474 + * item, self.dtype_is_object) + * finally: + * PyMem_Free(tmp) # <<<<<<<<<<<<<< + * + * cdef setitem_indexed(self, index, value): + */ + /*finally:*/ { + /*normal exit:*/{ + PyMem_Free(__pyx_v_tmp); + goto __pyx_L7; + } + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8) < 0)) __Pyx_ErrFetch(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_7); + __Pyx_XGOTREF(__pyx_t_8); + __Pyx_XGOTREF(__pyx_t_9); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __pyx_t_3 = __pyx_lineno; __pyx_t_4 = __pyx_clineno; __pyx_t_5 = __pyx_filename; + { + PyMem_Free(__pyx_v_tmp); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_9); + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11); + } + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_XGIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ErrRestore(__pyx_t_6, __pyx_t_7, __pyx_t_8); + __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; + __pyx_lineno = __pyx_t_3; __pyx_clineno = __pyx_t_4; __pyx_filename = __pyx_t_5; + goto __pyx_L1_error; + } + __pyx_L7:; + } + + /* "View.MemoryView":444 + * src.ndim, dst.ndim, self.dtype_is_object) + * + * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< + * cdef int array[128] + * cdef void *tmp = NULL + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_slice_assign_scalar", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":476 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + +static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *__pyx_v_self, PyObject *__pyx_v_index, PyObject *__pyx_v_value) { + char *__pyx_v_itemp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + char *__pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("setitem_indexed", 0); + + /* "View.MemoryView":477 + * + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< + * self.assign_item_from_object(itemp, value) + * + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(1, 477, __pyx_L1_error) + __pyx_v_itemp = __pyx_t_1; + + /* "View.MemoryView":478 + * cdef setitem_indexed(self, index, value): + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 478, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":476 + * PyMem_Free(tmp) + * + * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< + * cdef char *itemp = self.get_item_pointer(index) + * self.assign_item_from_object(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.setitem_indexed", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":480 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_v_struct = NULL; + PyObject *__pyx_v_bytesitem = 0; + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + size_t __pyx_t_10; + int __pyx_t_11; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); + + /* "View.MemoryView":483 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef bytes bytesitem + * + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 483, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":486 + * cdef bytes bytesitem + * + * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< + * try: + * result = struct.unpack(self.view.format, bytesitem) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 486, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "View.MemoryView":488 + * bytesitem = itemp[:self.view.itemsize] + * try: + * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< + * except struct.error: + * raise ValueError("Unable to convert item to object") + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 488, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 488, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_7) { + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; + } + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_6); + __Pyx_INCREF(__pyx_v_bytesitem); + __Pyx_GIVEREF(__pyx_v_bytesitem); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_bytesitem); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 488, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_result = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + } + + /* "View.MemoryView":492 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + /*else:*/ { + __pyx_t_10 = strlen(__pyx_v_self->view.format); + __pyx_t_11 = ((__pyx_t_10 == 1) != 0); + if (__pyx_t_11) { + + /* "View.MemoryView":493 + * else: + * if len(self.view.format) == 1: + * return result[0] # <<<<<<<<<<<<<< + * return result + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 493, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L6_except_return; + + /* "View.MemoryView":492 + * raise ValueError("Unable to convert item to object") + * else: + * if len(self.view.format) == 1: # <<<<<<<<<<<<<< + * return result[0] + * return result + */ + } + + /* "View.MemoryView":494 + * if len(self.view.format) == 1: + * return result[0] + * return result # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_result); + __pyx_r = __pyx_v_result; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":489 + * try: + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: # <<<<<<<<<<<<<< + * raise ValueError("Unable to convert item to object") + * else: + */ + __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 489, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_ErrRestore(__pyx_t_1, __pyx_t_5, __pyx_t_9); + __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; + if (__pyx_t_8) { + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(1, 489, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_1); + + /* "View.MemoryView":490 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 490, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 490, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "View.MemoryView":487 + * + * bytesitem = itemp[:self.view.itemsize] + * try: # <<<<<<<<<<<<<< + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "View.MemoryView":480 + * self.assign_item_from_object(itemp, value) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesitem); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":496 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + +static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryview_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_v_struct = NULL; + char __pyx_v_c; + PyObject *__pyx_v_bytesvalue = 0; + Py_ssize_t __pyx_v_i; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + Py_ssize_t __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + char *__pyx_t_11; + char *__pyx_t_12; + char *__pyx_t_13; + char *__pyx_t_14; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); + + /* "View.MemoryView":499 + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + * import struct # <<<<<<<<<<<<<< + * cdef char c + * cdef bytes bytesvalue + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 499, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_struct = __pyx_t_1; + __pyx_t_1 = 0; + + /* "View.MemoryView":504 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + __pyx_t_2 = PyTuple_Check(__pyx_v_value); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "View.MemoryView":505 + * + * if isinstance(value, tuple): + * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< + * else: + * bytesvalue = struct.pack(self.view.format, value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 505, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(1, 505, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "View.MemoryView":504 + * cdef Py_ssize_t i + * + * if isinstance(value, tuple): # <<<<<<<<<<<<<< + * bytesvalue = struct.pack(self.view.format, *value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":507 + * bytesvalue = struct.pack(self.view.format, *value) + * else: + * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< + * + * for i, c in enumerate(bytesvalue): + */ + /*else*/ { + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = NULL; + __pyx_t_7 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_7 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 507, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 507, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else + #endif + { + __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + if (__pyx_t_5) { + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; + } + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_1); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_value); + __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(1, 507, __pyx_L1_error) + __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":509 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_9 = 0; + if (unlikely(__pyx_v_bytesvalue == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(1, 509, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_bytesvalue); + __pyx_t_10 = __pyx_v_bytesvalue; + __pyx_t_12 = PyBytes_AS_STRING(__pyx_t_10); + __pyx_t_13 = (__pyx_t_12 + PyBytes_GET_SIZE(__pyx_t_10)); + for (__pyx_t_14 = __pyx_t_12; __pyx_t_14 < __pyx_t_13; __pyx_t_14++) { + __pyx_t_11 = __pyx_t_14; + __pyx_v_c = (__pyx_t_11[0]); + + /* "View.MemoryView":510 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + __pyx_v_i = __pyx_t_9; + + /* "View.MemoryView":509 + * bytesvalue = struct.pack(self.view.format, value) + * + * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< + * itemp[i] = c + * + */ + __pyx_t_9 = (__pyx_t_9 + 1); + + /* "View.MemoryView":510 + * + * for i, c in enumerate(bytesvalue): + * itemp[i] = c # <<<<<<<<<<<<<< + * + * @cname('getbuffer') + */ + (__pyx_v_itemp[__pyx_v_i]) = __pyx_v_c; + } + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + + /* "View.MemoryView":496 + * return result + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * """Only used if instantiated manually by the user, or if Cython doesn't + * know how to convert the type""" + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("View.MemoryView.memoryview.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_struct); + __Pyx_XDECREF(__pyx_v_bytesvalue); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":513 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__(struct __pyx_memoryview_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t *__pyx_t_4; + char *__pyx_t_5; + void *__pyx_t_6; + int __pyx_t_7; + Py_ssize_t __pyx_t_8; + if (__pyx_v_info == NULL) { + PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); + return -1; + } + __Pyx_RefNannySetupContext("__getbuffer__", 0); + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + + /* "View.MemoryView":514 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + */ + __pyx_t_2 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->view.readonly != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":515 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 515, __pyx_L1_error) + + /* "View.MemoryView":514 + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + */ + } + + /* "View.MemoryView":517 + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":518 + * + * if flags & PyBUF_STRIDES: + * info.shape = self.view.shape # <<<<<<<<<<<<<< + * else: + * info.shape = NULL + */ + __pyx_t_4 = __pyx_v_self->view.shape; + __pyx_v_info->shape = __pyx_t_4; + + /* "View.MemoryView":517 + * raise ValueError("Cannot create writable memory view from read-only memoryview") + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.shape = self.view.shape + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":520 + * info.shape = self.view.shape + * else: + * info.shape = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + /*else*/ { + __pyx_v_info->shape = NULL; + } + __pyx_L6:; + + /* "View.MemoryView":522 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":523 + * + * if flags & PyBUF_STRIDES: + * info.strides = self.view.strides # <<<<<<<<<<<<<< + * else: + * info.strides = NULL + */ + __pyx_t_4 = __pyx_v_self->view.strides; + __pyx_v_info->strides = __pyx_t_4; + + /* "View.MemoryView":522 + * info.shape = NULL + * + * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< + * info.strides = self.view.strides + * else: + */ + goto __pyx_L7; + } + + /* "View.MemoryView":525 + * info.strides = self.view.strides + * else: + * info.strides = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_INDIRECT: + */ + /*else*/ { + __pyx_v_info->strides = NULL; + } + __pyx_L7:; + + /* "View.MemoryView":527 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":528 + * + * if flags & PyBUF_INDIRECT: + * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< + * else: + * info.suboffsets = NULL + */ + __pyx_t_4 = __pyx_v_self->view.suboffsets; + __pyx_v_info->suboffsets = __pyx_t_4; + + /* "View.MemoryView":527 + * info.strides = NULL + * + * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< + * info.suboffsets = self.view.suboffsets + * else: + */ + goto __pyx_L8; + } + + /* "View.MemoryView":530 + * info.suboffsets = self.view.suboffsets + * else: + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * + * if flags & PyBUF_FORMAT: + */ + /*else*/ { + __pyx_v_info->suboffsets = NULL; + } + __pyx_L8:; + + /* "View.MemoryView":532 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":533 + * + * if flags & PyBUF_FORMAT: + * info.format = self.view.format # <<<<<<<<<<<<<< + * else: + * info.format = NULL + */ + __pyx_t_5 = __pyx_v_self->view.format; + __pyx_v_info->format = __pyx_t_5; + + /* "View.MemoryView":532 + * info.suboffsets = NULL + * + * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< + * info.format = self.view.format + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":535 + * info.format = self.view.format + * else: + * info.format = NULL # <<<<<<<<<<<<<< + * + * info.buf = self.view.buf + */ + /*else*/ { + __pyx_v_info->format = NULL; + } + __pyx_L9:; + + /* "View.MemoryView":537 + * info.format = NULL + * + * info.buf = self.view.buf # <<<<<<<<<<<<<< + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + */ + __pyx_t_6 = __pyx_v_self->view.buf; + __pyx_v_info->buf = __pyx_t_6; + + /* "View.MemoryView":538 + * + * info.buf = self.view.buf + * info.ndim = self.view.ndim # <<<<<<<<<<<<<< + * info.itemsize = self.view.itemsize + * info.len = self.view.len + */ + __pyx_t_7 = __pyx_v_self->view.ndim; + __pyx_v_info->ndim = __pyx_t_7; + + /* "View.MemoryView":539 + * info.buf = self.view.buf + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< + * info.len = self.view.len + * info.readonly = self.view.readonly + */ + __pyx_t_8 = __pyx_v_self->view.itemsize; + __pyx_v_info->itemsize = __pyx_t_8; + + /* "View.MemoryView":540 + * info.ndim = self.view.ndim + * info.itemsize = self.view.itemsize + * info.len = self.view.len # <<<<<<<<<<<<<< + * info.readonly = self.view.readonly + * info.obj = self + */ + __pyx_t_8 = __pyx_v_self->view.len; + __pyx_v_info->len = __pyx_t_8; + + /* "View.MemoryView":541 + * info.itemsize = self.view.itemsize + * info.len = self.view.len + * info.readonly = self.view.readonly # <<<<<<<<<<<<<< + * info.obj = self + * + */ + __pyx_t_1 = __pyx_v_self->view.readonly; + __pyx_v_info->readonly = __pyx_t_1; + + /* "View.MemoryView":542 + * info.len = self.view.len + * info.readonly = self.view.readonly + * info.obj = self # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + + /* "View.MemoryView":513 + * + * @cname('getbuffer') + * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; + } + __pyx_L2:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":548 + * + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":549 + * @property + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< + * transpose_memslice(&result.from_slice) + * return result + */ + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 549, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(1, 549, __pyx_L1_error) + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":550 + * def T(self): + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 550, __pyx_L1_error) + + /* "View.MemoryView":551 + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + * return result # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":548 + * + * @property + * def T(self): # <<<<<<<<<<<<<< + * cdef _memoryviewslice result = memoryview_copy(self) + * transpose_memslice(&result.from_slice) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.T.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":554 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":555 + * @property + * def base(self): + * return self.obj # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->obj); + __pyx_r = __pyx_v_self->obj; + goto __pyx_L0; + + /* "View.MemoryView":554 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.obj + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":558 + * + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_length; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":559 + * @property + * def shape(self): + * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { + __pyx_t_2 = __pyx_t_4; + __pyx_v_length = (__pyx_t_2[0]); + __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(1, 559, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 559, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":558 + * + * @property + * def shape(self): # <<<<<<<<<<<<<< + * return tuple([length for length in self.view.shape[:self.view.ndim]]) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview.shape.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":562 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_stride; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":563 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError("Buffer view does not expose strides") + */ + __pyx_t_1 = ((__pyx_v_self->view.strides == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":565 + * if self.view.strides == NULL: + * + * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__31, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 565, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 565, __pyx_L1_error) + + /* "View.MemoryView":563 + * @property + * def strides(self): + * if self.view.strides == NULL: # <<<<<<<<<<<<<< + * + * raise ValueError("Buffer view does not expose strides") + */ + } + + /* "View.MemoryView":567 + * raise ValueError("Buffer view does not expose strides") + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_v_stride = (__pyx_t_3[0]); + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(1, 567, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 567, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "View.MemoryView":562 + * + * @property + * def strides(self): # <<<<<<<<<<<<<< + * if self.view.strides == NULL: + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.strides.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":570 + * + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + Py_ssize_t *__pyx_t_6; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":571 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + __pyx_t_1 = ((__pyx_v_self->view.suboffsets == NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":572 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__32, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":571 + * @property + * def suboffsets(self): + * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< + * return (-1,) * self.view.ndim + * + */ + } + + /* "View.MemoryView":574 + * return (-1,) * self.view.ndim + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); + for (__pyx_t_6 = __pyx_v_self->view.suboffsets; __pyx_t_6 < __pyx_t_5; __pyx_t_6++) { + __pyx_t_4 = __pyx_t_6; + __pyx_v_suboffset = (__pyx_t_4[0]); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(1, 574, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 574, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":570 + * + * @property + * def suboffsets(self): # <<<<<<<<<<<<<< + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.suboffsets.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":577 + * + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":578 + * @property + * def ndim(self): + * return self.view.ndim # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 578, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":577 + * + * @property + * def ndim(self): # <<<<<<<<<<<<<< + * return self.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.ndim.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":581 + * + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":582 + * @property + * def itemsize(self): + * return self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 582, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":581 + * + * @property + * def itemsize(self): # <<<<<<<<<<<<<< + * return self.view.itemsize + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.itemsize.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":585 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":586 + * @property + * def nbytes(self): + * return self.size * self.view.itemsize # <<<<<<<<<<<<<< + * + * @property + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":585 + * + * @property + * def nbytes(self): # <<<<<<<<<<<<<< + * return self.size * self.view.itemsize + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.nbytes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":589 + * + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_v_result = NULL; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + Py_ssize_t *__pyx_t_3; + Py_ssize_t *__pyx_t_4; + Py_ssize_t *__pyx_t_5; + PyObject *__pyx_t_6 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":590 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + __pyx_t_1 = (__pyx_v_self->_size == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":591 + * def size(self): + * if self._size is None: + * result = 1 # <<<<<<<<<<<<<< + * + * for length in self.view.shape[:self.view.ndim]: + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_result = __pyx_int_1; + + /* "View.MemoryView":593 + * result = 1 + * + * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< + * result *= length + * + */ + __pyx_t_4 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); + for (__pyx_t_5 = __pyx_v_self->view.shape; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { + __pyx_t_3 = __pyx_t_5; + __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 593, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_6); + __pyx_t_6 = 0; + + /* "View.MemoryView":594 + * + * for length in self.view.shape[:self.view.ndim]: + * result *= length # <<<<<<<<<<<<<< + * + * self._size = result + */ + __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 594, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_6); + __pyx_t_6 = 0; + } + + /* "View.MemoryView":596 + * result *= length + * + * self._size = result # <<<<<<<<<<<<<< + * + * return self._size + */ + __Pyx_INCREF(__pyx_v_result); + __Pyx_GIVEREF(__pyx_v_result); + __Pyx_GOTREF(__pyx_v_self->_size); + __Pyx_DECREF(__pyx_v_self->_size); + __pyx_v_self->_size = __pyx_v_result; + + /* "View.MemoryView":590 + * @property + * def size(self): + * if self._size is None: # <<<<<<<<<<<<<< + * result = 1 + * + */ + } + + /* "View.MemoryView":598 + * self._size = result + * + * return self._size # <<<<<<<<<<<<<< + * + * def __len__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_size); + __pyx_r = __pyx_v_self->_size; + goto __pyx_L0; + + /* "View.MemoryView":589 + * + * @property + * def size(self): # <<<<<<<<<<<<<< + * if self._size is None: + * result = 1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.memoryview.size.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":600 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + +/* Python wrapper */ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self); /*proto*/ +static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__len__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_10__len__(struct __pyx_memoryview_obj *__pyx_v_self) { + Py_ssize_t __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__len__", 0); + + /* "View.MemoryView":601 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + __pyx_t_1 = ((__pyx_v_self->view.ndim >= 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":602 + * def __len__(self): + * if self.view.ndim >= 1: + * return self.view.shape[0] # <<<<<<<<<<<<<< + * + * return 0 + */ + __pyx_r = (__pyx_v_self->view.shape[0]); + goto __pyx_L0; + + /* "View.MemoryView":601 + * + * def __len__(self): + * if self.view.ndim >= 1: # <<<<<<<<<<<<<< + * return self.view.shape[0] + * + */ + } + + /* "View.MemoryView":604 + * return self.view.shape[0] + * + * return 0 # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":600 + * return self._size + * + * def __len__(self): # <<<<<<<<<<<<<< + * if self.view.ndim >= 1: + * return self.view.shape[0] + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":606 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12__repr__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "View.MemoryView":607 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "View.MemoryView":608 + * def __repr__(self): + * return "" % (self.base.__class__.__name__, + * id(self)) # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 608, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "View.MemoryView":607 + * + * def __repr__(self): + * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< + * id(self)) + * + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 607, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":606 + * return 0 + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__, + * id(self)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":610 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14__str__(struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__str__", 0); + + /* "View.MemoryView":611 + * + * def __str__(self): + * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 611, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":610 + * id(self)) + * + * def __str__(self): # <<<<<<<<<<<<<< + * return "" % (self.base.__class__.__name__,) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":614 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_c_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16is_c_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("is_c_contig", 0); + + /* "View.MemoryView":617 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + */ + __pyx_v_mslice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); + + /* "View.MemoryView":618 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< + * + * def is_f_contig(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 618, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":614 + * + * + * def is_c_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_c_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":620 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_f_contig (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18is_f_contig(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice *__pyx_v_mslice; + __Pyx_memviewslice __pyx_v_tmp; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("is_f_contig", 0); + + /* "View.MemoryView":623 + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + */ + __pyx_v_mslice = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); + + /* "View.MemoryView":624 + * cdef __Pyx_memviewslice tmp + * mslice = get_slice_from_memview(self, &tmp) + * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< + * + * def copy(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 624, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":620 + * return slice_is_contig(mslice[0], 'C', self.view.ndim) + * + * def is_f_contig(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice *mslice + * cdef __Pyx_memviewslice tmp + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.is_f_contig", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":626 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20copy(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_mslice; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy", 0); + + /* "View.MemoryView":628 + * def copy(self): + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &mslice) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); + + /* "View.MemoryView":630 + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + * + * slice_copy(self, &mslice) # <<<<<<<<<<<<<< + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); + + /* "View.MemoryView":631 + * + * slice_copy(self, &mslice) + * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_C_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 631, __pyx_L1_error) + __pyx_v_mslice = __pyx_t_1; + + /* "View.MemoryView":636 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< + * + * def copy_fortran(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 636, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":626 + * return slice_is_contig(mslice[0], 'F', self.view.ndim) + * + * def copy(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice mslice + * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":638 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + +/* Python wrapper */ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("copy_fortran (wrapper)", 0); + __pyx_r = __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22copy_fortran(struct __pyx_memoryview_obj *__pyx_v_self) { + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + int __pyx_v_flags; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_memviewslice __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("copy_fortran", 0); + + /* "View.MemoryView":640 + * def copy_fortran(self): + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< + * + * slice_copy(self, &src) + */ + __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); + + /* "View.MemoryView":642 + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + * + * slice_copy(self, &src) # <<<<<<<<<<<<<< + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, + * self.view.itemsize, + */ + __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); + + /* "View.MemoryView":643 + * + * slice_copy(self, &src) + * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< + * self.view.itemsize, + * flags|PyBUF_F_CONTIGUOUS, + */ + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 643, __pyx_L1_error) + __pyx_v_dst = __pyx_t_1; + + /* "View.MemoryView":648 + * self.dtype_is_object) + * + * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 648, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":638 + * return memoryview_copy_from_slice(self, &mslice) + * + * def copy_fortran(self): # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice src, dst + * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView.memoryview.copy_fortran", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview___reduce_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__33, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryview_2__setstate_cython__(((struct __pyx_memoryview_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryview_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":652 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + +static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, int __pyx_v_dtype_is_object, __Pyx_TypeInfo *__pyx_v_typeinfo) { + struct __pyx_memoryview_obj *__pyx_v_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("memoryview_cwrapper", 0); + + /* "View.MemoryView":653 + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< + * result.typeinfo = typeinfo + * return result + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_o); + __Pyx_GIVEREF(__pyx_v_o); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_o); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 653, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":654 + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo # <<<<<<<<<<<<<< + * return result + * + */ + __pyx_v_result->typeinfo = __pyx_v_typeinfo; + + /* "View.MemoryView":655 + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_check') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":652 + * + * @cname('__pyx_memoryview_new') + * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< + * cdef memoryview result = memoryview(o, flags, dtype_is_object) + * result.typeinfo = typeinfo + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_cwrapper", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":658 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + +static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("memoryview_check", 0); + + /* "View.MemoryView":659 + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): + * return isinstance(o, memoryview) # <<<<<<<<<<<<<< + * + * cdef tuple _unellipsify(object index, int ndim): + */ + __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_o, __pyx_memoryview_type); + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + /* "View.MemoryView":658 + * + * @cname('__pyx_memoryview_check') + * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< + * return isinstance(o, memoryview) + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":661 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + +static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { + PyObject *__pyx_v_tup = NULL; + PyObject *__pyx_v_result = NULL; + int __pyx_v_have_slices; + int __pyx_v_seen_ellipsis; + CYTHON_UNUSED PyObject *__pyx_v_idx = NULL; + PyObject *__pyx_v_item = NULL; + Py_ssize_t __pyx_v_nslices; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + PyObject *(*__pyx_t_6)(PyObject *); + PyObject *__pyx_t_7 = NULL; + Py_ssize_t __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("_unellipsify", 0); + + /* "View.MemoryView":666 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: + */ + __pyx_t_1 = PyTuple_Check(__pyx_v_index); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":667 + * """ + * if not isinstance(index, tuple): + * tup = (index,) # <<<<<<<<<<<<<< + * else: + * tup = index + */ + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 667, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_index); + __pyx_v_tup = __pyx_t_3; + __pyx_t_3 = 0; + + /* "View.MemoryView":666 + * full slices. + * """ + * if not isinstance(index, tuple): # <<<<<<<<<<<<<< + * tup = (index,) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":669 + * tup = (index,) + * else: + * tup = index # <<<<<<<<<<<<<< + * + * result = [] + */ + /*else*/ { + __Pyx_INCREF(__pyx_v_index); + __pyx_v_tup = __pyx_v_index; + } + __pyx_L3:; + + /* "View.MemoryView":671 + * tup = index + * + * result = [] # <<<<<<<<<<<<<< + * have_slices = False + * seen_ellipsis = False + */ + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 671, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_result = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":672 + * + * result = [] + * have_slices = False # <<<<<<<<<<<<<< + * seen_ellipsis = False + * for idx, item in enumerate(tup): + */ + __pyx_v_have_slices = 0; + + /* "View.MemoryView":673 + * result = [] + * have_slices = False + * seen_ellipsis = False # <<<<<<<<<<<<<< + * for idx, item in enumerate(tup): + * if item is Ellipsis: + */ + __pyx_v_seen_ellipsis = 0; + + /* "View.MemoryView":674 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + __Pyx_INCREF(__pyx_int_0); + __pyx_t_3 = __pyx_int_0; + if (likely(PyList_CheckExact(__pyx_v_tup)) || PyTuple_CheckExact(__pyx_v_tup)) { + __pyx_t_4 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 674, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_6)) { + if (likely(PyList_CheckExact(__pyx_t_4))) { + if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(1, 674, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } else { + if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(1, 674, __pyx_L1_error) + #else + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + } + } else { + __pyx_t_7 = __pyx_t_6(__pyx_t_4); + if (unlikely(!__pyx_t_7)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 674, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_7); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_3); + __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 674, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); + __pyx_t_3 = __pyx_t_7; + __pyx_t_7 = 0; + + /* "View.MemoryView":675 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + __pyx_t_2 = (__pyx_v_item == __pyx_builtin_Ellipsis); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":676 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True + */ + __pyx_t_1 = ((!(__pyx_v_seen_ellipsis != 0)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":677 + * if item is Ellipsis: + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * else: + */ + __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(1, 677, __pyx_L1_error) + __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__35); + __Pyx_GIVEREF(__pyx_slice__35); + PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__35); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "View.MemoryView":678 + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True # <<<<<<<<<<<<<< + * else: + * result.append(slice(None)) + */ + __pyx_v_seen_ellipsis = 1; + + /* "View.MemoryView":676 + * for idx, item in enumerate(tup): + * if item is Ellipsis: + * if not seen_ellipsis: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + * seen_ellipsis = True + */ + goto __pyx_L7; + } + + /* "View.MemoryView":680 + * seen_ellipsis = True + * else: + * result.append(slice(None)) # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__36); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 680, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":681 + * else: + * result.append(slice(None)) + * have_slices = True # <<<<<<<<<<<<<< + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + */ + __pyx_v_have_slices = 1; + + /* "View.MemoryView":675 + * seen_ellipsis = False + * for idx, item in enumerate(tup): + * if item is Ellipsis: # <<<<<<<<<<<<<< + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) + */ + goto __pyx_L6; + } + + /* "View.MemoryView":683 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + */ + /*else*/ { + __pyx_t_2 = PySlice_Check(__pyx_v_item); + __pyx_t_10 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = ((!(PyIndex_Check(__pyx_v_item) != 0)) != 0); + __pyx_t_1 = __pyx_t_10; + __pyx_L9_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":684 + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): + * raise TypeError("Cannot index with type '%s'" % type(item)) # <<<<<<<<<<<<<< + * + * have_slices = have_slices or isinstance(item, slice) + */ + __pyx_t_7 = __Pyx_PyString_Format(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_11, 0, 0, 0); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __PYX_ERR(1, 684, __pyx_L1_error) + + /* "View.MemoryView":683 + * have_slices = True + * else: + * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + */ + } + + /* "View.MemoryView":686 + * raise TypeError("Cannot index with type '%s'" % type(item)) + * + * have_slices = have_slices or isinstance(item, slice) # <<<<<<<<<<<<<< + * result.append(item) + * + */ + __pyx_t_10 = (__pyx_v_have_slices != 0); + if (!__pyx_t_10) { + } else { + __pyx_t_1 = __pyx_t_10; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = PySlice_Check(__pyx_v_item); + __pyx_t_2 = (__pyx_t_10 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L11_bool_binop_done:; + __pyx_v_have_slices = __pyx_t_1; + + /* "View.MemoryView":687 + * + * have_slices = have_slices or isinstance(item, slice) + * result.append(item) # <<<<<<<<<<<<<< + * + * nslices = ndim - len(result) + */ + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 687, __pyx_L1_error) + } + __pyx_L6:; + + /* "View.MemoryView":674 + * have_slices = False + * seen_ellipsis = False + * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< + * if item is Ellipsis: + * if not seen_ellipsis: + */ + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":689 + * result.append(item) + * + * nslices = ndim - len(result) # <<<<<<<<<<<<<< + * if nslices: + * result.extend([slice(None)] * nslices) + */ + __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(1, 689, __pyx_L1_error) + __pyx_v_nslices = (__pyx_v_ndim - __pyx_t_5); + + /* "View.MemoryView":690 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + __pyx_t_1 = (__pyx_v_nslices != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":691 + * nslices = ndim - len(result) + * if nslices: + * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< + * + * return have_slices or nslices, tuple(result) + */ + __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 691, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + { Py_ssize_t __pyx_temp; + for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { + __Pyx_INCREF(__pyx_slice__37); + __Pyx_GIVEREF(__pyx_slice__37); + PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__37); + } + } + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 691, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":690 + * + * nslices = ndim - len(result) + * if nslices: # <<<<<<<<<<<<<< + * result.extend([slice(None)] * nslices) + * + */ + } + + /* "View.MemoryView":693 + * result.extend([slice(None)] * nslices) + * + * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + */ + __Pyx_XDECREF(__pyx_r); + if (!__pyx_v_have_slices) { + } else { + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __pyx_t_4; + __pyx_t_4 = 0; + __pyx_L14_bool_binop_done:; + __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(1, 693, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_4); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_r = ((PyObject*)__pyx_t_11); + __pyx_t_11 = 0; + goto __pyx_L0; + + /* "View.MemoryView":661 + * return isinstance(o, memoryview) + * + * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< + * """ + * Replace all ellipses with full slices and fill incomplete indices with + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("View.MemoryView._unellipsify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tup); + __Pyx_XDECREF(__pyx_v_result); + __Pyx_XDECREF(__pyx_v_idx); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":695 + * return have_slices or nslices, tuple(result) + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + +static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __pyx_v_ndim) { + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t *__pyx_t_1; + Py_ssize_t *__pyx_t_2; + Py_ssize_t *__pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("assert_direct_dimensions", 0); + + /* "View.MemoryView":696 + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") + */ + __pyx_t_2 = (__pyx_v_suboffsets + __pyx_v_ndim); + for (__pyx_t_3 = __pyx_v_suboffsets; __pyx_t_3 < __pyx_t_2; __pyx_t_3++) { + __pyx_t_1 = __pyx_t_3; + __pyx_v_suboffset = (__pyx_t_1[0]); + + /* "View.MemoryView":697 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") + * + */ + __pyx_t_4 = ((__pyx_v_suboffset >= 0) != 0); + if (unlikely(__pyx_t_4)) { + + /* "View.MemoryView":698 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __PYX_ERR(1, 698, __pyx_L1_error) + + /* "View.MemoryView":697 + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * raise ValueError("Indirect dimensions not supported") + * + */ + } + } + + /* "View.MemoryView":695 + * return have_slices or nslices, tuple(result) + * + * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.assert_direct_dimensions", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":705 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + +static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_obj *__pyx_v_memview, PyObject *__pyx_v_indices) { + int __pyx_v_new_ndim; + int __pyx_v_suboffset_dim; + int __pyx_v_dim; + __Pyx_memviewslice __pyx_v_src; + __Pyx_memviewslice __pyx_v_dst; + __Pyx_memviewslice *__pyx_v_p_src; + struct __pyx_memoryviewslice_obj *__pyx_v_memviewsliceobj = 0; + __Pyx_memviewslice *__pyx_v_p_dst; + int *__pyx_v_p_suboffset_dim; + Py_ssize_t __pyx_v_start; + Py_ssize_t __pyx_v_stop; + Py_ssize_t __pyx_v_step; + int __pyx_v_have_start; + int __pyx_v_have_stop; + int __pyx_v_have_step; + PyObject *__pyx_v_index = NULL; + struct __pyx_memoryview_obj *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + struct __pyx_memoryview_obj *__pyx_t_4; + char *__pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *(*__pyx_t_8)(PyObject *); + PyObject *__pyx_t_9 = NULL; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + Py_ssize_t __pyx_t_12; + __Pyx_RefNannySetupContext("memview_slice", 0); + + /* "View.MemoryView":706 + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): + * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< + * cdef bint negative_step + * cdef __Pyx_memviewslice src, dst + */ + __pyx_v_new_ndim = 0; + __pyx_v_suboffset_dim = -1; + + /* "View.MemoryView":713 + * + * + * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< + * + * cdef _memoryviewslice memviewsliceobj + */ + (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); + + /* "View.MemoryView":717 + * cdef _memoryviewslice memviewsliceobj + * + * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(!Py_OptimizeFlag)) { + if (unlikely(!((__pyx_v_memview->view.ndim > 0) != 0))) { + PyErr_SetNone(PyExc_AssertionError); + __PYX_ERR(1, 717, __pyx_L1_error) + } + } + #endif + + /* "View.MemoryView":719 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":720 + * + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview # <<<<<<<<<<<<<< + * p_src = &memviewsliceobj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 720, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":721 + * if isinstance(memview, _memoryviewslice): + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, &src) + */ + __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); + + /* "View.MemoryView":719 + * assert memview.view.ndim > 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * memviewsliceobj = memview + * p_src = &memviewsliceobj.from_slice + */ + goto __pyx_L3; + } + + /* "View.MemoryView":723 + * p_src = &memviewsliceobj.from_slice + * else: + * slice_copy(memview, &src) # <<<<<<<<<<<<<< + * p_src = &src + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); + + /* "View.MemoryView":724 + * else: + * slice_copy(memview, &src) + * p_src = &src # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_p_src = (&__pyx_v_src); + } + __pyx_L3:; + + /* "View.MemoryView":730 + * + * + * dst.memview = p_src.memview # <<<<<<<<<<<<<< + * dst.data = p_src.data + * + */ + __pyx_t_4 = __pyx_v_p_src->memview; + __pyx_v_dst.memview = __pyx_t_4; + + /* "View.MemoryView":731 + * + * dst.memview = p_src.memview + * dst.data = p_src.data # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __pyx_v_p_src->data; + __pyx_v_dst.data = __pyx_t_5; + + /* "View.MemoryView":736 + * + * + * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< + * cdef int *p_suboffset_dim = &suboffset_dim + * cdef Py_ssize_t start, stop, step + */ + __pyx_v_p_dst = (&__pyx_v_dst); + + /* "View.MemoryView":737 + * + * cdef __Pyx_memviewslice *p_dst = &dst + * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< + * cdef Py_ssize_t start, stop, step + * cdef bint have_start, have_stop, have_step + */ + __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); + + /* "View.MemoryView":741 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( + */ + __pyx_t_6 = 0; + if (likely(PyList_CheckExact(__pyx_v_indices)) || PyTuple_CheckExact(__pyx_v_indices)) { + __pyx_t_3 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; + __pyx_t_8 = NULL; + } else { + __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 741, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_8)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(1, 741, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } else { + if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(1, 741, __pyx_L1_error) + #else + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + #endif + } + } else { + __pyx_t_9 = __pyx_t_8(__pyx_t_3); + if (unlikely(!__pyx_t_9)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(1, 741, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_9); + } + __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_9); + __pyx_t_9 = 0; + __pyx_v_dim = __pyx_t_6; + __pyx_t_6 = (__pyx_t_6 + 1); + + /* "View.MemoryView":742 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + __pyx_t_2 = (PyIndex_Check(__pyx_v_index) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":746 + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + * index, 0, 0, # start, stop, step # <<<<<<<<<<<<<< + * 0, 0, 0, # have_{start,stop,step} + * False) + */ + __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 746, __pyx_L1_error) + + /* "View.MemoryView":743 + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(1, 743, __pyx_L1_error) + + /* "View.MemoryView":742 + * + * for dim, index in enumerate(indices): + * if PyIndex_Check(index): # <<<<<<<<<<<<<< + * slice_memviewslice( + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + */ + goto __pyx_L6; + } + + /* "View.MemoryView":749 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + __pyx_t_2 = (__pyx_v_index == Py_None); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":750 + * False) + * elif index is None: + * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + */ + (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; + + /* "View.MemoryView":751 + * elif index is None: + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 + */ + (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; + + /* "View.MemoryView":752 + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< + * new_ndim += 1 + * else: + */ + (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; + + /* "View.MemoryView":753 + * p_dst.strides[new_ndim] = 0 + * p_dst.suboffsets[new_ndim] = -1 + * new_ndim += 1 # <<<<<<<<<<<<<< + * else: + * start = index.start or 0 + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + + /* "View.MemoryView":749 + * 0, 0, 0, # have_{start,stop,step} + * False) + * elif index is None: # <<<<<<<<<<<<<< + * p_dst.shape[new_ndim] = 1 + * p_dst.strides[new_ndim] = 0 + */ + goto __pyx_L6; + } + + /* "View.MemoryView":755 + * new_ndim += 1 + * else: + * start = index.start or 0 # <<<<<<<<<<<<<< + * stop = index.stop or 0 + * step = index.step or 0 + */ + /*else*/ { + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 755, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 755, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 755, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L7_bool_binop_done:; + __pyx_v_start = __pyx_t_10; + + /* "View.MemoryView":756 + * else: + * start = index.start or 0 + * stop = index.stop or 0 # <<<<<<<<<<<<<< + * step = index.step or 0 + * + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 756, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 756, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 756, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L9_bool_binop_done:; + __pyx_v_stop = __pyx_t_10; + + /* "View.MemoryView":757 + * start = index.start or 0 + * stop = index.stop or 0 + * step = index.step or 0 # <<<<<<<<<<<<<< + * + * have_start = index.start is not None + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 757, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(1, 757, __pyx_L1_error) + if (!__pyx_t_1) { + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else { + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 757, __pyx_L1_error) + __pyx_t_10 = __pyx_t_12; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_10 = 0; + __pyx_L11_bool_binop_done:; + __pyx_v_step = __pyx_t_10; + + /* "View.MemoryView":759 + * step = index.step or 0 + * + * have_start = index.start is not None # <<<<<<<<<<<<<< + * have_stop = index.stop is not None + * have_step = index.step is not None + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 759, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_start = __pyx_t_1; + + /* "View.MemoryView":760 + * + * have_start = index.start is not None + * have_stop = index.stop is not None # <<<<<<<<<<<<<< + * have_step = index.step is not None + * + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 760, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_stop = __pyx_t_1; + + /* "View.MemoryView":761 + * have_start = index.start is not None + * have_stop = index.stop is not None + * have_step = index.step is not None # <<<<<<<<<<<<<< + * + * slice_memviewslice( + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 761, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_1 = (__pyx_t_9 != Py_None); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_have_step = __pyx_t_1; + + /* "View.MemoryView":763 + * have_step = index.step is not None + * + * slice_memviewslice( # <<<<<<<<<<<<<< + * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], + * dim, new_ndim, p_suboffset_dim, + */ + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(1, 763, __pyx_L1_error) + + /* "View.MemoryView":769 + * have_start, have_stop, have_step, + * True) + * new_ndim += 1 # <<<<<<<<<<<<<< + * + * if isinstance(memview, _memoryviewslice): + */ + __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); + } + __pyx_L6:; + + /* "View.MemoryView":741 + * cdef bint have_start, have_stop, have_step + * + * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< + * if PyIndex_Check(index): + * slice_memviewslice( + */ + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "View.MemoryView":771 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":772 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __Pyx_XDECREF(((PyObject *)__pyx_r)); + + /* "View.MemoryView":773 + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< + * memviewsliceobj.to_dtype_func, + * memview.dtype_is_object) + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 773, __pyx_L1_error) } + + /* "View.MemoryView":774 + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * else: + */ + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(1, 774, __pyx_L1_error) } + + /* "View.MemoryView":772 + * + * if isinstance(memview, _memoryviewslice): + * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< + * memviewsliceobj.to_object_func, + * memviewsliceobj.to_dtype_func, + */ + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 772, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "View.MemoryView":771 + * new_ndim += 1 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * return memoryview_fromslice(dst, new_ndim, + * memviewsliceobj.to_object_func, + */ + } + + /* "View.MemoryView":777 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + /*else*/ { + __Pyx_XDECREF(((PyObject *)__pyx_r)); + + /* "View.MemoryView":778 + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "View.MemoryView":777 + * memview.dtype_is_object) + * else: + * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< + * memview.dtype_is_object) + * + */ + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(1, 777, __pyx_L1_error) + __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":705 + * + * @cname('__pyx_memview_slice') + * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< + * cdef int new_ndim = 0, suboffset_dim = -1, dim + * cdef bint negative_step + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.memview_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_memviewsliceobj); + __Pyx_XDECREF(__pyx_v_index); + __Pyx_XGIVEREF((PyObject *)__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":802 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + +static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, Py_ssize_t __pyx_v_shape, Py_ssize_t __pyx_v_stride, Py_ssize_t __pyx_v_suboffset, int __pyx_v_dim, int __pyx_v_new_ndim, int *__pyx_v_suboffset_dim, Py_ssize_t __pyx_v_start, Py_ssize_t __pyx_v_stop, Py_ssize_t __pyx_v_step, int __pyx_v_have_start, int __pyx_v_have_stop, int __pyx_v_have_step, int __pyx_v_is_slice) { + Py_ssize_t __pyx_v_new_shape; + int __pyx_v_negative_step; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":822 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + __pyx_t_1 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":824 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + __pyx_t_1 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":825 + * + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":824 + * if not is_slice: + * + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if not 0 <= start < shape: + */ + } + + /* "View.MemoryView":826 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + __pyx_t_1 = (0 <= __pyx_v_start); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_start < __pyx_v_shape); + } + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":827 + * start += shape + * if not 0 <= start < shape: + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< + * else: + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 827, __pyx_L1_error) + + /* "View.MemoryView":826 + * if start < 0: + * start += shape + * if not 0 <= start < shape: # <<<<<<<<<<<<<< + * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) + * else: + */ + } + + /* "View.MemoryView":822 + * cdef bint negative_step + * + * if not is_slice: # <<<<<<<<<<<<<< + * + * if start < 0: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":830 + * else: + * + * negative_step = have_step != 0 and step < 0 # <<<<<<<<<<<<<< + * + * if have_step and step == 0: + */ + /*else*/ { + __pyx_t_1 = ((__pyx_v_have_step != 0) != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step < 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L6_bool_binop_done:; + __pyx_v_negative_step = __pyx_t_2; + + /* "View.MemoryView":832 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) + * + */ + __pyx_t_1 = (__pyx_v_have_step != 0); + if (__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_step == 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L9_bool_binop_done:; + if (__pyx_t_2) { + + /* "View.MemoryView":833 + * + * if have_step and step == 0: + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 833, __pyx_L1_error) + + /* "View.MemoryView":832 + * negative_step = have_step != 0 and step < 0 + * + * if have_step and step == 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) + * + */ + } + + /* "View.MemoryView":836 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + __pyx_t_2 = (__pyx_v_have_start != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":837 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":838 + * if have_start: + * if start < 0: + * start += shape # <<<<<<<<<<<<<< + * if start < 0: + * start = 0 + */ + __pyx_v_start = (__pyx_v_start + __pyx_v_shape); + + /* "View.MemoryView":839 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + __pyx_t_2 = ((__pyx_v_start < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":840 + * start += shape + * if start < 0: + * start = 0 # <<<<<<<<<<<<<< + * elif start >= shape: + * if negative_step: + */ + __pyx_v_start = 0; + + /* "View.MemoryView":839 + * if start < 0: + * start += shape + * if start < 0: # <<<<<<<<<<<<<< + * start = 0 + * elif start >= shape: + */ + } + + /* "View.MemoryView":837 + * + * if have_start: + * if start < 0: # <<<<<<<<<<<<<< + * start += shape + * if start < 0: + */ + goto __pyx_L12; + } + + /* "View.MemoryView":841 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + __pyx_t_2 = ((__pyx_v_start >= __pyx_v_shape) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":842 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":843 + * elif start >= shape: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = shape + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":842 + * start = 0 + * elif start >= shape: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L14; + } + + /* "View.MemoryView":845 + * start = shape - 1 + * else: + * start = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + /*else*/ { + __pyx_v_start = __pyx_v_shape; + } + __pyx_L14:; + + /* "View.MemoryView":841 + * if start < 0: + * start = 0 + * elif start >= shape: # <<<<<<<<<<<<<< + * if negative_step: + * start = shape - 1 + */ + } + __pyx_L12:; + + /* "View.MemoryView":836 + * + * + * if have_start: # <<<<<<<<<<<<<< + * if start < 0: + * start += shape + */ + goto __pyx_L11; + } + + /* "View.MemoryView":847 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":848 + * else: + * if negative_step: + * start = shape - 1 # <<<<<<<<<<<<<< + * else: + * start = 0 + */ + __pyx_v_start = (__pyx_v_shape - 1); + + /* "View.MemoryView":847 + * start = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * start = shape - 1 + * else: + */ + goto __pyx_L15; + } + + /* "View.MemoryView":850 + * start = shape - 1 + * else: + * start = 0 # <<<<<<<<<<<<<< + * + * if have_stop: + */ + /*else*/ { + __pyx_v_start = 0; + } + __pyx_L15:; + } + __pyx_L11:; + + /* "View.MemoryView":852 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + __pyx_t_2 = (__pyx_v_have_stop != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":853 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":854 + * if have_stop: + * if stop < 0: + * stop += shape # <<<<<<<<<<<<<< + * if stop < 0: + * stop = 0 + */ + __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); + + /* "View.MemoryView":855 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + __pyx_t_2 = ((__pyx_v_stop < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":856 + * stop += shape + * if stop < 0: + * stop = 0 # <<<<<<<<<<<<<< + * elif stop > shape: + * stop = shape + */ + __pyx_v_stop = 0; + + /* "View.MemoryView":855 + * if stop < 0: + * stop += shape + * if stop < 0: # <<<<<<<<<<<<<< + * stop = 0 + * elif stop > shape: + */ + } + + /* "View.MemoryView":853 + * + * if have_stop: + * if stop < 0: # <<<<<<<<<<<<<< + * stop += shape + * if stop < 0: + */ + goto __pyx_L17; + } + + /* "View.MemoryView":857 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + __pyx_t_2 = ((__pyx_v_stop > __pyx_v_shape) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":858 + * stop = 0 + * elif stop > shape: + * stop = shape # <<<<<<<<<<<<<< + * else: + * if negative_step: + */ + __pyx_v_stop = __pyx_v_shape; + + /* "View.MemoryView":857 + * if stop < 0: + * stop = 0 + * elif stop > shape: # <<<<<<<<<<<<<< + * stop = shape + * else: + */ + } + __pyx_L17:; + + /* "View.MemoryView":852 + * start = 0 + * + * if have_stop: # <<<<<<<<<<<<<< + * if stop < 0: + * stop += shape + */ + goto __pyx_L16; + } + + /* "View.MemoryView":860 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_negative_step != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":861 + * else: + * if negative_step: + * stop = -1 # <<<<<<<<<<<<<< + * else: + * stop = shape + */ + __pyx_v_stop = -1L; + + /* "View.MemoryView":860 + * stop = shape + * else: + * if negative_step: # <<<<<<<<<<<<<< + * stop = -1 + * else: + */ + goto __pyx_L19; + } + + /* "View.MemoryView":863 + * stop = -1 + * else: + * stop = shape # <<<<<<<<<<<<<< + * + * if not have_step: + */ + /*else*/ { + __pyx_v_stop = __pyx_v_shape; + } + __pyx_L19:; + } + __pyx_L16:; + + /* "View.MemoryView":865 + * stop = shape + * + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 + * + */ + __pyx_t_2 = ((!(__pyx_v_have_step != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":866 + * + * if not have_step: + * step = 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_step = 1; + + /* "View.MemoryView":865 + * stop = shape + * + * if not have_step: # <<<<<<<<<<<<<< + * step = 1 + * + */ + } + + /* "View.MemoryView":870 + * + * with cython.cdivision(True): + * new_shape = (stop - start) // step # <<<<<<<<<<<<<< + * + * if (stop - start) - step * new_shape: + */ + __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); + + /* "View.MemoryView":872 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":873 + * + * if (stop - start) - step * new_shape: + * new_shape += 1 # <<<<<<<<<<<<<< + * + * if new_shape < 0: + */ + __pyx_v_new_shape = (__pyx_v_new_shape + 1); + + /* "View.MemoryView":872 + * new_shape = (stop - start) // step + * + * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< + * new_shape += 1 + * + */ + } + + /* "View.MemoryView":875 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + __pyx_t_2 = ((__pyx_v_new_shape < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":876 + * + * if new_shape < 0: + * new_shape = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_new_shape = 0; + + /* "View.MemoryView":875 + * new_shape += 1 + * + * if new_shape < 0: # <<<<<<<<<<<<<< + * new_shape = 0 + * + */ + } + + /* "View.MemoryView":879 + * + * + * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset + */ + (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); + + /* "View.MemoryView":880 + * + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< + * dst.suboffsets[new_ndim] = suboffset + * + */ + (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; + + /* "View.MemoryView":881 + * dst.strides[new_ndim] = stride * step + * dst.shape[new_ndim] = new_shape + * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_dst->suboffsets[__pyx_v_new_ndim]) = __pyx_v_suboffset; + } + __pyx_L3:; + + /* "View.MemoryView":884 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + __pyx_t_2 = (((__pyx_v_suboffset_dim[0]) < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":885 + * + * if suboffset_dim[0] < 0: + * dst.data += start * stride # <<<<<<<<<<<<<< + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride + */ + __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); + + /* "View.MemoryView":884 + * + * + * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< + * dst.data += start * stride + * else: + */ + goto __pyx_L23; + } + + /* "View.MemoryView":887 + * dst.data += start * stride + * else: + * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< + * + * if suboffset >= 0: + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_suboffset_dim[0]); + (__pyx_v_dst->suboffsets[__pyx_t_3]) = ((__pyx_v_dst->suboffsets[__pyx_t_3]) + (__pyx_v_start * __pyx_v_stride)); + } + __pyx_L23:; + + /* "View.MemoryView":889 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":890 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + __pyx_t_2 = ((!(__pyx_v_is_slice != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":891 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + __pyx_t_2 = ((__pyx_v_new_ndim == 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":892 + * if not is_slice: + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " + */ + __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":891 + * if suboffset >= 0: + * if not is_slice: + * if new_ndim == 0: # <<<<<<<<<<<<<< + * dst.data = ( dst.data)[0] + suboffset + * else: + */ + goto __pyx_L26; + } + + /* "View.MemoryView":894 + * dst.data = ( dst.data)[0] + suboffset + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< + * "must be indexed and not sliced", dim) + * else: + */ + /*else*/ { + + /* "View.MemoryView":895 + * else: + * _err_dim(IndexError, "All dimensions preceding dimension %d " + * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< + * else: + * suboffset_dim[0] = new_ndim + */ + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 894, __pyx_L1_error) + } + __pyx_L26:; + + /* "View.MemoryView":890 + * + * if suboffset >= 0: + * if not is_slice: # <<<<<<<<<<<<<< + * if new_ndim == 0: + * dst.data = ( dst.data)[0] + suboffset + */ + goto __pyx_L25; + } + + /* "View.MemoryView":897 + * "must be indexed and not sliced", dim) + * else: + * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< + * + * return 0 + */ + /*else*/ { + (__pyx_v_suboffset_dim[0]) = __pyx_v_new_ndim; + } + __pyx_L25:; + + /* "View.MemoryView":889 + * dst.suboffsets[suboffset_dim[0]] += start * stride + * + * if suboffset >= 0: # <<<<<<<<<<<<<< + * if not is_slice: + * if new_ndim == 0: + */ + } + + /* "View.MemoryView":899 + * suboffset_dim[0] = new_ndim + * + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":802 + * + * @cname('__pyx_memoryview_slice_memviewslice') + * cdef int slice_memviewslice( # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * Py_ssize_t shape, Py_ssize_t stride, Py_ssize_t suboffset, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.slice_memviewslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":905 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + +static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, Py_ssize_t __pyx_v_index, Py_ssize_t __pyx_v_dim) { + Py_ssize_t __pyx_v_shape; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_suboffset; + Py_ssize_t __pyx_v_itemsize; + char *__pyx_v_resultp; + char *__pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + __Pyx_RefNannySetupContext("pybuffer_index", 0); + + /* "View.MemoryView":907 + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t itemsize = view.itemsize + * cdef char *resultp + */ + __pyx_v_suboffset = -1L; + + /* "View.MemoryView":908 + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< + * cdef char *resultp + * + */ + __pyx_t_1 = __pyx_v_view->itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":911 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize + */ + __pyx_t_2 = ((__pyx_v_view->ndim == 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":912 + * + * if view.ndim == 0: + * shape = view.len / itemsize # <<<<<<<<<<<<<< + * stride = itemsize + * else: + */ + if (unlikely(__pyx_v_itemsize == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); + __PYX_ERR(1, 912, __pyx_L1_error) + } + else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { + PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); + __PYX_ERR(1, 912, __pyx_L1_error) + } + __pyx_v_shape = (__pyx_v_view->len / __pyx_v_itemsize); + + /* "View.MemoryView":913 + * if view.ndim == 0: + * shape = view.len / itemsize + * stride = itemsize # <<<<<<<<<<<<<< + * else: + * shape = view.shape[dim] + */ + __pyx_v_stride = __pyx_v_itemsize; + + /* "View.MemoryView":911 + * cdef char *resultp + * + * if view.ndim == 0: # <<<<<<<<<<<<<< + * shape = view.len / itemsize + * stride = itemsize + */ + goto __pyx_L3; + } + + /* "View.MemoryView":915 + * stride = itemsize + * else: + * shape = view.shape[dim] # <<<<<<<<<<<<<< + * stride = view.strides[dim] + * if view.suboffsets != NULL: + */ + /*else*/ { + __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); + + /* "View.MemoryView":916 + * else: + * shape = view.shape[dim] + * stride = view.strides[dim] # <<<<<<<<<<<<<< + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] + */ + __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); + + /* "View.MemoryView":917 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + __pyx_t_2 = ((__pyx_v_view->suboffsets != NULL) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":918 + * stride = view.strides[dim] + * if view.suboffsets != NULL: + * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< + * + * if index < 0: + */ + __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); + + /* "View.MemoryView":917 + * shape = view.shape[dim] + * stride = view.strides[dim] + * if view.suboffsets != NULL: # <<<<<<<<<<<<<< + * suboffset = view.suboffsets[dim] + * + */ + } + } + __pyx_L3:; + + /* "View.MemoryView":920 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + __pyx_t_2 = ((__pyx_v_index < 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":921 + * + * if index < 0: + * index += view.shape[dim] # <<<<<<<<<<<<<< + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + */ + __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); + + /* "View.MemoryView":922 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + __pyx_t_2 = ((__pyx_v_index < 0) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":923 + * index += view.shape[dim] + * if index < 0: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + * + * if index >= shape: + */ + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 923, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 923, __pyx_L1_error) + + /* "View.MemoryView":922 + * if index < 0: + * index += view.shape[dim] + * if index < 0: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + } + + /* "View.MemoryView":920 + * suboffset = view.suboffsets[dim] + * + * if index < 0: # <<<<<<<<<<<<<< + * index += view.shape[dim] + * if index < 0: + */ + } + + /* "View.MemoryView":925 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + __pyx_t_2 = ((__pyx_v_index >= __pyx_v_shape) != 0); + if (unlikely(__pyx_t_2)) { + + /* "View.MemoryView":926 + * + * if index >= shape: + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< + * + * resultp = bufp + index * stride + */ + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 926, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 926, __pyx_L1_error) + + /* "View.MemoryView":925 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * if index >= shape: # <<<<<<<<<<<<<< + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + */ + } + + /* "View.MemoryView":928 + * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) + * + * resultp = bufp + index * stride # <<<<<<<<<<<<<< + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset + */ + __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); + + /* "View.MemoryView":929 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":930 + * resultp = bufp + index * stride + * if suboffset >= 0: + * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< + * + * return resultp + */ + __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); + + /* "View.MemoryView":929 + * + * resultp = bufp + index * stride + * if suboffset >= 0: # <<<<<<<<<<<<<< + * resultp = ( resultp)[0] + suboffset + * + */ + } + + /* "View.MemoryView":932 + * resultp = ( resultp)[0] + suboffset + * + * return resultp # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_resultp; + goto __pyx_L0; + + /* "View.MemoryView":905 + * + * @cname('__pyx_pybuffer_index') + * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< + * Py_ssize_t dim) except NULL: + * cdef Py_ssize_t shape, stride, suboffset = -1 + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView.pybuffer_index", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":938 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + +static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { + int __pyx_v_ndim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_r; + int __pyx_t_1; + Py_ssize_t *__pyx_t_2; + long __pyx_t_3; + long __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + + /* "View.MemoryView":939 + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: + * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t *shape = memslice.shape + */ + __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; + __pyx_v_ndim = __pyx_t_1; + + /* "View.MemoryView":941 + * cdef int ndim = memslice.memview.view.ndim + * + * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< + * cdef Py_ssize_t *strides = memslice.strides + * + */ + __pyx_t_2 = __pyx_v_memslice->shape; + __pyx_v_shape = __pyx_t_2; + + /* "View.MemoryView":942 + * + * cdef Py_ssize_t *shape = memslice.shape + * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_v_memslice->strides; + __pyx_v_strides = __pyx_t_2; + + /* "View.MemoryView":946 + * + * cdef int i, j + * for i in range(ndim / 2): # <<<<<<<<<<<<<< + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + */ + __pyx_t_3 = (__pyx_v_ndim / 2); + __pyx_t_4 = __pyx_t_3; + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":947 + * cdef int i, j + * for i in range(ndim / 2): + * j = ndim - 1 - i # <<<<<<<<<<<<<< + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] + */ + __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); + + /* "View.MemoryView":948 + * for i in range(ndim / 2): + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< + * shape[i], shape[j] = shape[j], shape[i] + * + */ + __pyx_t_5 = (__pyx_v_strides[__pyx_v_j]); + __pyx_t_6 = (__pyx_v_strides[__pyx_v_i]); + (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; + (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; + + /* "View.MemoryView":949 + * j = ndim - 1 - i + * strides[i], strides[j] = strides[j], strides[i] + * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + */ + __pyx_t_6 = (__pyx_v_shape[__pyx_v_j]); + __pyx_t_5 = (__pyx_v_shape[__pyx_v_i]); + (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; + (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; + + /* "View.MemoryView":951 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_i]) >= 0) != 0); + if (!__pyx_t_8) { + } else { + __pyx_t_7 = __pyx_t_8; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_8 = (((__pyx_v_memslice->suboffsets[__pyx_v_j]) >= 0) != 0); + __pyx_t_7 = __pyx_t_8; + __pyx_L6_bool_binop_done:; + if (__pyx_t_7) { + + /* "View.MemoryView":952 + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< + * + * return 1 + */ + __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(1, 952, __pyx_L1_error) + + /* "View.MemoryView":951 + * shape[i], shape[j] = shape[j], shape[i] + * + * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + */ + } + } + + /* "View.MemoryView":954 + * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") + * + * return 1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "View.MemoryView":938 + * + * @cname('__pyx_memslice_transpose') + * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< + * cdef int ndim = memslice.memview.view.ndim + * + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.transpose_memslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = 0; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":971 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + */ + +/* Python wrapper */ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "View.MemoryView":972 + * + * def __dealloc__(self): + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< + * + * cdef convert_item_to_object(self, char *itemp): + */ + __PYX_XDEC_MEMVIEW((&__pyx_v_self->from_slice), 1); + + /* "View.MemoryView":971 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":974 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + +static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("convert_item_to_object", 0); + + /* "View.MemoryView":975 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + __pyx_t_1 = ((__pyx_v_self->to_object_func != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":976 + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) # <<<<<<<<<<<<<< + * else: + * return memoryview.convert_item_to_object(self, itemp) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 976, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + /* "View.MemoryView":975 + * + * cdef convert_item_to_object(self, char *itemp): + * if self.to_object_func != NULL: # <<<<<<<<<<<<<< + * return self.to_object_func(itemp) + * else: + */ + } + + /* "View.MemoryView":978 + * return self.to_object_func(itemp) + * else: + * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< + * + * cdef assign_item_from_object(self, char *itemp, object value): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 978, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "View.MemoryView":974 + * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) + * + * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< + * if self.to_object_func != NULL: + * return self.to_object_func(itemp) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":980 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + +static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memoryviewslice_obj *__pyx_v_self, char *__pyx_v_itemp, PyObject *__pyx_v_value) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("assign_item_from_object", 0); + + /* "View.MemoryView":981 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + __pyx_t_1 = ((__pyx_v_self->to_dtype_func != NULL) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":982 + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< + * else: + * memoryview.assign_item_from_object(self, itemp, value) + */ + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(1, 982, __pyx_L1_error) + + /* "View.MemoryView":981 + * + * cdef assign_item_from_object(self, char *itemp, object value): + * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< + * self.to_dtype_func(itemp, value) + * else: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":984 + * self.to_dtype_func(itemp, value) + * else: + * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< + * + * @property + */ + /*else*/ { + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 984, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "View.MemoryView":980 + * return memoryview.convert_item_to_object(self, itemp) + * + * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< + * if self.to_dtype_func != NULL: + * self.to_dtype_func(itemp, value) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.assign_item_from_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":987 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__(struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + + /* "View.MemoryView":988 + * @property + * def base(self): + * return self.from_object # <<<<<<<<<<<<<< + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->from_object); + __pyx_r = __pyx_v_self->from_object; + goto __pyx_L0; + + /* "View.MemoryView":987 + * + * @property + * def base(self): # <<<<<<<<<<<<<< + * return self.from_object + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice___reduce_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf___pyx_memoryviewslice_2__setstate_cython__(((struct __pyx_memoryviewslice_obj *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUSED struct __pyx_memoryviewslice_obj *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__40, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView._memoryviewslice.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":994 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + +static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewslice, int __pyx_v_ndim, PyObject *(*__pyx_v_to_object_func)(char *), int (*__pyx_v_to_dtype_func)(char *, PyObject *), int __pyx_v_dtype_is_object) { + struct __pyx_memoryviewslice_obj *__pyx_v_result = 0; + Py_ssize_t __pyx_v_suboffset; + PyObject *__pyx_v_length = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + __Pyx_TypeInfo *__pyx_t_4; + Py_buffer __pyx_t_5; + Py_ssize_t *__pyx_t_6; + Py_ssize_t *__pyx_t_7; + Py_ssize_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + __Pyx_RefNannySetupContext("memoryview_fromslice", 0); + + /* "View.MemoryView":1002 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + __pyx_t_1 = ((((PyObject *)__pyx_v_memviewslice.memview) == Py_None) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1003 + * + * if memviewslice.memview == Py_None: + * return None # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "View.MemoryView":1002 + * cdef _memoryviewslice result + * + * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< + * return None + * + */ + } + + /* "View.MemoryView":1008 + * + * + * result = _memoryviewslice(None, 0, dtype_is_object) # <<<<<<<<<<<<<< + * + * result.from_slice = memviewslice + */ + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_3, 0, Py_None); + __Pyx_INCREF(__pyx_int_0); + __Pyx_GIVEREF(__pyx_int_0); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_int_0); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1008, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1010 + * result = _memoryviewslice(None, 0, dtype_is_object) + * + * result.from_slice = memviewslice # <<<<<<<<<<<<<< + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + */ + __pyx_v_result->from_slice = __pyx_v_memviewslice; + + /* "View.MemoryView":1011 + * + * result.from_slice = memviewslice + * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< + * + * result.from_object = ( memviewslice.memview).base + */ + __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); + + /* "View.MemoryView":1013 + * __PYX_INC_MEMVIEW(&memviewslice, 1) + * + * result.from_object = ( memviewslice.memview).base # <<<<<<<<<<<<<< + * result.typeinfo = memviewslice.memview.typeinfo + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1013, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_result->from_object); + __Pyx_DECREF(__pyx_v_result->from_object); + __pyx_v_result->from_object = __pyx_t_2; + __pyx_t_2 = 0; + + /* "View.MemoryView":1014 + * + * result.from_object = ( memviewslice.memview).base + * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< + * + * result.view = memviewslice.memview.view + */ + __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; + __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; + + /* "View.MemoryView":1016 + * result.typeinfo = memviewslice.memview.typeinfo + * + * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + */ + __pyx_t_5 = __pyx_v_memviewslice.memview->view; + __pyx_v_result->__pyx_base.view = __pyx_t_5; + + /* "View.MemoryView":1017 + * + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + */ + __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); + + /* "View.MemoryView":1018 + * result.view = memviewslice.memview.view + * result.view.buf = memviewslice.data + * result.view.ndim = ndim # <<<<<<<<<<<<<< + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) + */ + __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; + + /* "View.MemoryView":1019 + * result.view.buf = memviewslice.data + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< + * Py_INCREF(Py_None) + * + */ + ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; + + /* "View.MemoryView":1020 + * result.view.ndim = ndim + * (<__pyx_buffer *> &result.view).obj = Py_None + * Py_INCREF(Py_None) # <<<<<<<<<<<<<< + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + */ + Py_INCREF(Py_None); + + /* "View.MemoryView":1022 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1023 + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: + * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< + * else: + * result.flags = PyBUF_RECORDS_RO + */ + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; + + /* "View.MemoryView":1022 + * Py_INCREF(Py_None) + * + * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< + * result.flags = PyBUF_RECORDS + * else: + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1025 + * result.flags = PyBUF_RECORDS + * else: + * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< + * + * result.view.shape = result.from_slice.shape + */ + /*else*/ { + __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS_RO; + } + __pyx_L4:; + + /* "View.MemoryView":1027 + * result.flags = PyBUF_RECORDS_RO + * + * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< + * result.view.strides = result.from_slice.strides + * + */ + __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); + + /* "View.MemoryView":1028 + * + * result.view.shape = result.from_slice.shape + * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); + + /* "View.MemoryView":1031 + * + * + * result.view.suboffsets = NULL # <<<<<<<<<<<<<< + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + */ + __pyx_v_result->__pyx_base.view.suboffsets = NULL; + + /* "View.MemoryView":1032 + * + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + */ + __pyx_t_7 = (__pyx_v_result->from_slice.suboffsets + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->from_slice.suboffsets; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_v_suboffset = (__pyx_t_6[0]); + + /* "View.MemoryView":1033 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + __pyx_t_1 = ((__pyx_v_suboffset >= 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1034 + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); + + /* "View.MemoryView":1035 + * if suboffset >= 0: + * result.view.suboffsets = result.from_slice.suboffsets + * break # <<<<<<<<<<<<<< + * + * result.view.len = result.view.itemsize + */ + goto __pyx_L6_break; + + /* "View.MemoryView":1033 + * result.view.suboffsets = NULL + * for suboffset in result.from_slice.suboffsets[:ndim]: + * if suboffset >= 0: # <<<<<<<<<<<<<< + * result.view.suboffsets = result.from_slice.suboffsets + * break + */ + } + } + __pyx_L6_break:; + + /* "View.MemoryView":1037 + * break + * + * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< + * for length in result.view.shape[:ndim]: + * result.view.len *= length + */ + __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + + /* "View.MemoryView":1038 + * + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< + * result.view.len *= length + * + */ + __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); + for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { + __pyx_t_6 = __pyx_t_8; + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1038, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); + __pyx_t_2 = 0; + + /* "View.MemoryView":1039 + * result.view.len = result.view.itemsize + * for length in result.view.shape[:ndim]: + * result.view.len *= length # <<<<<<<<<<<<<< + * + * result.to_object_func = to_object_func + */ + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1039, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1039, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 1039, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_result->__pyx_base.view.len = __pyx_t_9; + } + + /* "View.MemoryView":1041 + * result.view.len *= length + * + * result.to_object_func = to_object_func # <<<<<<<<<<<<<< + * result.to_dtype_func = to_dtype_func + * + */ + __pyx_v_result->to_object_func = __pyx_v_to_object_func; + + /* "View.MemoryView":1042 + * + * result.to_object_func = to_object_func + * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< + * + * return result + */ + __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; + + /* "View.MemoryView":1044 + * result.to_dtype_func = to_dtype_func + * + * return result # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_result)); + __pyx_r = ((PyObject *)__pyx_v_result); + goto __pyx_L0; + + /* "View.MemoryView":994 + * + * @cname('__pyx_memoryview_fromslice') + * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< + * int ndim, + * object (*to_object_func)(char *), + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("View.MemoryView.memoryview_fromslice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_result); + __Pyx_XDECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1047 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + */ + +static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_mslice) { + struct __pyx_memoryviewslice_obj *__pyx_v_obj = 0; + __Pyx_memviewslice *__pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("get_slice_from_memview", 0); + + /* "View.MemoryView":1050 + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1051 + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): + * obj = memview # <<<<<<<<<<<<<< + * return &obj.from_slice + * else: + */ + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(1, 1051, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_v_memview); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "View.MemoryView":1052 + * if isinstance(memview, _memoryviewslice): + * obj = memview + * return &obj.from_slice # <<<<<<<<<<<<<< + * else: + * slice_copy(memview, mslice) + */ + __pyx_r = (&__pyx_v_obj->from_slice); + goto __pyx_L0; + + /* "View.MemoryView":1050 + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * obj = memview + * return &obj.from_slice + */ + } + + /* "View.MemoryView":1054 + * return &obj.from_slice + * else: + * slice_copy(memview, mslice) # <<<<<<<<<<<<<< + * return mslice + * + */ + /*else*/ { + __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); + + /* "View.MemoryView":1055 + * else: + * slice_copy(memview, mslice) + * return mslice # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_slice_copy') + */ + __pyx_r = __pyx_v_mslice; + goto __pyx_L0; + } + + /* "View.MemoryView":1047 + * + * @cname('__pyx_memoryview_get_slice_from_memoryview') + * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *mslice): + * cdef _memoryviewslice obj + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_WriteUnraisable("View.MemoryView.get_slice_from_memview", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_obj); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1058 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + +static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_dst) { + int __pyx_v_dim; + Py_ssize_t *__pyx_v_shape; + Py_ssize_t *__pyx_v_strides; + Py_ssize_t *__pyx_v_suboffsets; + __Pyx_RefNannyDeclarations + Py_ssize_t *__pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + __Pyx_RefNannySetupContext("slice_copy", 0); + + /* "View.MemoryView":1062 + * cdef (Py_ssize_t*) shape, strides, suboffsets + * + * shape = memview.view.shape # <<<<<<<<<<<<<< + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets + */ + __pyx_t_1 = __pyx_v_memview->view.shape; + __pyx_v_shape = __pyx_t_1; + + /* "View.MemoryView":1063 + * + * shape = memview.view.shape + * strides = memview.view.strides # <<<<<<<<<<<<<< + * suboffsets = memview.view.suboffsets + * + */ + __pyx_t_1 = __pyx_v_memview->view.strides; + __pyx_v_strides = __pyx_t_1; + + /* "View.MemoryView":1064 + * shape = memview.view.shape + * strides = memview.view.strides + * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< + * + * dst.memview = <__pyx_memoryview *> memview + */ + __pyx_t_1 = __pyx_v_memview->view.suboffsets; + __pyx_v_suboffsets = __pyx_t_1; + + /* "View.MemoryView":1066 + * suboffsets = memview.view.suboffsets + * + * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< + * dst.data = memview.view.buf + * + */ + __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); + + /* "View.MemoryView":1067 + * + * dst.memview = <__pyx_memoryview *> memview + * dst.data = memview.view.buf # <<<<<<<<<<<<<< + * + * for dim in range(memview.view.ndim): + */ + __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); + + /* "View.MemoryView":1069 + * dst.data = memview.view.buf + * + * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + */ + __pyx_t_2 = __pyx_v_memview->view.ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_dim = __pyx_t_4; + + /* "View.MemoryView":1070 + * + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + */ + (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); + + /* "View.MemoryView":1071 + * for dim in range(memview.view.ndim): + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 + * + */ + (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); + + /* "View.MemoryView":1072 + * dst.shape[dim] = shape[dim] + * dst.strides[dim] = strides[dim] + * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object') + */ + if ((__pyx_v_suboffsets != 0)) { + __pyx_t_5 = (__pyx_v_suboffsets[__pyx_v_dim]); + } else { + __pyx_t_5 = -1L; + } + (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; + } + + /* "View.MemoryView":1058 + * + * @cname('__pyx_memoryview_slice_copy') + * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< + * cdef int dim + * cdef (Py_ssize_t*) shape, strides, suboffsets + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":1075 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + +static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx_v_memview) { + __Pyx_memviewslice __pyx_v_memviewslice; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy", 0); + + /* "View.MemoryView":1078 + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< + * return memoryview_copy_from_slice(memview, &memviewslice) + * + */ + __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); + + /* "View.MemoryView":1079 + * cdef __Pyx_memviewslice memviewslice + * slice_copy(memview, &memviewslice) + * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_object_from_slice') + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1079, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1075 + * + * @cname('__pyx_memoryview_copy_object') + * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< + * "Create a new memoryview object" + * cdef __Pyx_memviewslice memviewslice + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1082 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + +static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview_obj *__pyx_v_memview, __Pyx_memviewslice *__pyx_v_memviewslice) { + PyObject *(*__pyx_v_to_object_func)(char *); + int (*__pyx_v_to_dtype_func)(char *, PyObject *); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *(*__pyx_t_3)(char *); + int (*__pyx_t_4)(char *, PyObject *); + PyObject *__pyx_t_5 = NULL; + __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 0); + + /* "View.MemoryView":1089 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1090 + * + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + */ + __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; + __pyx_v_to_object_func = __pyx_t_3; + + /* "View.MemoryView":1091 + * if isinstance(memview, _memoryviewslice): + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< + * else: + * to_object_func = NULL + */ + __pyx_t_4 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; + __pyx_v_to_dtype_func = __pyx_t_4; + + /* "View.MemoryView":1089 + * cdef int (*to_dtype_func)(char *, object) except 0 + * + * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< + * to_object_func = (<_memoryviewslice> memview).to_object_func + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1093 + * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func + * else: + * to_object_func = NULL # <<<<<<<<<<<<<< + * to_dtype_func = NULL + * + */ + /*else*/ { + __pyx_v_to_object_func = NULL; + + /* "View.MemoryView":1094 + * else: + * to_object_func = NULL + * to_dtype_func = NULL # <<<<<<<<<<<<<< + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + */ + __pyx_v_to_dtype_func = NULL; + } + __pyx_L3:; + + /* "View.MemoryView":1096 + * to_dtype_func = NULL + * + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< + * to_object_func, to_dtype_func, + * memview.dtype_is_object) + */ + __Pyx_XDECREF(__pyx_r); + + /* "View.MemoryView":1098 + * return memoryview_fromslice(memviewslice[0], memview.view.ndim, + * to_object_func, to_dtype_func, + * memview.dtype_is_object) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 1096, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "View.MemoryView":1082 + * + * @cname('__pyx_memoryview_copy_object_from_slice') + * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< + * """ + * Create a new memoryview object from a given memoryview object and slice. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_from_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "View.MemoryView":1104 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg + */ + +static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { + Py_ssize_t __pyx_r; + int __pyx_t_1; + + /* "View.MemoryView":1105 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: + */ + __pyx_t_1 = ((__pyx_v_arg < 0) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1106 + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: + * return -arg # <<<<<<<<<<<<<< + * else: + * return arg + */ + __pyx_r = (-__pyx_v_arg); + goto __pyx_L0; + + /* "View.MemoryView":1105 + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: + * if arg < 0: # <<<<<<<<<<<<<< + * return -arg + * else: + */ + } + + /* "View.MemoryView":1108 + * return -arg + * else: + * return arg # <<<<<<<<<<<<<< + * + * @cname('__pyx_get_best_slice_order') + */ + /*else*/ { + __pyx_r = __pyx_v_arg; + goto __pyx_L0; + } + + /* "View.MemoryView":1104 + * + * + * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< + * if arg < 0: + * return -arg + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1111 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + +static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_c_stride; + Py_ssize_t __pyx_v_f_stride; + char __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1116 + * """ + * cdef int i + * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t f_stride = 0 + * + */ + __pyx_v_c_stride = 0; + + /* "View.MemoryView":1117 + * cdef int i + * cdef Py_ssize_t c_stride = 0 + * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_f_stride = 0; + + /* "View.MemoryView":1119 + * cdef Py_ssize_t f_stride = 0 + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1120 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1121 + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1122 + * if mslice.shape[i] > 1: + * c_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + goto __pyx_L4_break; + + /* "View.MemoryView":1120 + * + * for i in range(ndim - 1, -1, -1): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * c_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L4_break:; + + /* "View.MemoryView":1124 + * break + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + */ + __pyx_t_1 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_1; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1125 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1126 + * for i in range(ndim): + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< + * break + * + */ + __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1127 + * if mslice.shape[i] > 1: + * f_stride = mslice.strides[i] + * break # <<<<<<<<<<<<<< + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + */ + goto __pyx_L7_break; + + /* "View.MemoryView":1125 + * + * for i in range(ndim): + * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< + * f_stride = mslice.strides[i] + * break + */ + } + } + __pyx_L7_break:; + + /* "View.MemoryView":1129 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + __pyx_t_2 = ((abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1130 + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): + * return 'C' # <<<<<<<<<<<<<< + * else: + * return 'F' + */ + __pyx_r = 'C'; + goto __pyx_L0; + + /* "View.MemoryView":1129 + * break + * + * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< + * return 'C' + * else: + */ + } + + /* "View.MemoryView":1132 + * return 'C' + * else: + * return 'F' # <<<<<<<<<<<<<< + * + * @cython.cdivision(True) + */ + /*else*/ { + __pyx_r = 'F'; + goto __pyx_L0; + } + + /* "View.MemoryView":1111 + * + * @cname('__pyx_get_best_slice_order') + * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< + * """ + * Figure out the best memory access order for a given slice. + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1135 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + +static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v_src_strides, char *__pyx_v_dst_data, Py_ssize_t *__pyx_v_dst_strides, Py_ssize_t *__pyx_v_src_shape, Py_ssize_t *__pyx_v_dst_shape, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + CYTHON_UNUSED Py_ssize_t __pyx_v_src_extent; + Py_ssize_t __pyx_v_dst_extent; + Py_ssize_t __pyx_v_src_stride; + Py_ssize_t __pyx_v_dst_stride; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + Py_ssize_t __pyx_t_6; + + /* "View.MemoryView":1142 + * + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + */ + __pyx_v_src_extent = (__pyx_v_src_shape[0]); + + /* "View.MemoryView":1143 + * cdef Py_ssize_t i + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] + */ + __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); + + /* "View.MemoryView":1144 + * cdef Py_ssize_t src_extent = src_shape[0] + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + */ + __pyx_v_src_stride = (__pyx_v_src_strides[0]); + + /* "View.MemoryView":1145 + * cdef Py_ssize_t dst_extent = dst_shape[0] + * cdef Py_ssize_t src_stride = src_strides[0] + * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + __pyx_t_2 = ((__pyx_v_src_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + __pyx_t_2 = ((__pyx_v_dst_stride > 0) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L5_bool_binop_done; + } + + /* "View.MemoryView":1149 + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + */ + __pyx_t_2 = (((size_t)__pyx_v_src_stride) == __pyx_v_itemsize); + if (__pyx_t_2) { + __pyx_t_2 = (__pyx_v_itemsize == ((size_t)__pyx_v_dst_stride)); + } + __pyx_t_3 = (__pyx_t_2 != 0); + __pyx_t_1 = __pyx_t_3; + __pyx_L5_bool_binop_done:; + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + if (__pyx_t_1) { + + /* "View.MemoryView":1150 + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); + + /* "View.MemoryView":1148 + * + * if ndim == 1: + * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< + * src_stride == itemsize == dst_stride): + * memcpy(dst_data, src_data, itemsize * dst_extent) + */ + goto __pyx_L4; + } + + /* "View.MemoryView":1152 + * memcpy(dst_data, src_data, itemsize * dst_extent) + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + */ + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1153 + * else: + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< + * src_data += src_stride + * dst_data += dst_stride + */ + (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); + + /* "View.MemoryView":1154 + * for i in range(dst_extent): + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * else: + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1155 + * memcpy(dst_data, src_data, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * else: + * for i in range(dst_extent): + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L4:; + + /* "View.MemoryView":1147 + * cdef Py_ssize_t dst_stride = dst_strides[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * if (src_stride > 0 and dst_stride > 0 and + * src_stride == itemsize == dst_stride): + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1157 + * dst_data += dst_stride + * else: + * for i in range(dst_extent): # <<<<<<<<<<<<<< + * _copy_strided_to_strided(src_data, src_strides + 1, + * dst_data, dst_strides + 1, + */ + /*else*/ { + __pyx_t_4 = __pyx_v_dst_extent; + __pyx_t_5 = __pyx_t_4; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1158 + * else: + * for i in range(dst_extent): + * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< + * dst_data, dst_strides + 1, + * src_shape + 1, dst_shape + 1, + */ + _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); + + /* "View.MemoryView":1162 + * src_shape + 1, dst_shape + 1, + * ndim - 1, itemsize) + * src_data += src_stride # <<<<<<<<<<<<<< + * dst_data += dst_stride + * + */ + __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); + + /* "View.MemoryView":1163 + * ndim - 1, itemsize) + * src_data += src_stride + * dst_data += dst_stride # <<<<<<<<<<<<<< + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, + */ + __pyx_v_dst_data = (__pyx_v_dst_data + __pyx_v_dst_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1135 + * + * @cython.cdivision(True) + * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< + * char *dst_data, Py_ssize_t *dst_strides, + * Py_ssize_t *src_shape, Py_ssize_t *dst_shape, + */ + + /* function exit code */ +} + +/* "View.MemoryView":1165 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + */ + +static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { + + /* "View.MemoryView":1168 + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< + * src.shape, dst.shape, ndim, itemsize) + * + */ + _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1165 + * dst_data += dst_stride + * + * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *dst, + * int ndim, size_t itemsize) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1172 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + */ + +static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_src, int __pyx_v_ndim) { + int __pyx_v_i; + Py_ssize_t __pyx_v_size; + Py_ssize_t __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1175 + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + * cdef Py_ssize_t size = src.memview.view.itemsize # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_size = __pyx_t_1; + + /* "View.MemoryView":1177 + * cdef Py_ssize_t size = src.memview.view.itemsize + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * size *= src.shape[i] + * + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1178 + * + * for i in range(ndim): + * size *= src.shape[i] # <<<<<<<<<<<<<< + * + * return size + */ + __pyx_v_size = (__pyx_v_size * (__pyx_v_src->shape[__pyx_v_i])); + } + + /* "View.MemoryView":1180 + * size *= src.shape[i] + * + * return size # <<<<<<<<<<<<<< + * + * @cname('__pyx_fill_contig_strides_array') + */ + __pyx_r = __pyx_v_size; + goto __pyx_L0; + + /* "View.MemoryView":1172 + * + * @cname('__pyx_memoryview_slice_get_size') + * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< + * "Return the size of the memory occupied by the slice in number of bytes" + * cdef int i + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1183 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: + */ + +static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, Py_ssize_t __pyx_v_stride, int __pyx_v_ndim, char __pyx_v_order) { + int __pyx_v_idx; + Py_ssize_t __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "View.MemoryView":1192 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + __pyx_t_1 = ((__pyx_v_order == 'F') != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1193 + * + * if order == 'F': + * for idx in range(ndim): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride = stride * shape[idx] + */ + __pyx_t_2 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_idx = __pyx_t_4; + + /* "View.MemoryView":1194 + * if order == 'F': + * for idx in range(ndim): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride = stride * shape[idx] + * else: + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1195 + * for idx in range(ndim): + * strides[idx] = stride + * stride = stride * shape[idx] # <<<<<<<<<<<<<< + * else: + * for idx in range(ndim - 1, -1, -1): + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + + /* "View.MemoryView":1192 + * cdef int idx + * + * if order == 'F': # <<<<<<<<<<<<<< + * for idx in range(ndim): + * strides[idx] = stride + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1197 + * stride = stride * shape[idx] + * else: + * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * strides[idx] = stride + * stride = stride * shape[idx] + */ + /*else*/ { + for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { + __pyx_v_idx = __pyx_t_2; + + /* "View.MemoryView":1198 + * else: + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride # <<<<<<<<<<<<<< + * stride = stride * shape[idx] + * + */ + (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; + + /* "View.MemoryView":1199 + * for idx in range(ndim - 1, -1, -1): + * strides[idx] = stride + * stride = stride * shape[idx] # <<<<<<<<<<<<<< + * + * return stride + */ + __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); + } + } + __pyx_L3:; + + /* "View.MemoryView":1201 + * stride = stride * shape[idx] + * + * return stride # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_data_to_temp') + */ + __pyx_r = __pyx_v_stride; + goto __pyx_L0; + + /* "View.MemoryView":1183 + * + * @cname('__pyx_fill_contig_strides_array') + * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< + * Py_ssize_t *shape, Py_ssize_t *strides, Py_ssize_t stride, + * int ndim, char order) nogil: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1204 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + +static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_tmpslice, char __pyx_v_order, int __pyx_v_ndim) { + int __pyx_v_i; + void *__pyx_v_result; + size_t __pyx_v_itemsize; + size_t __pyx_v_size; + void *__pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + struct __pyx_memoryview_obj *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + + /* "View.MemoryView":1215 + * cdef void *result + * + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef size_t size = slice_get_size(src, ndim) + * + */ + __pyx_t_1 = __pyx_v_src->memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1216 + * + * cdef size_t itemsize = src.memview.view.itemsize + * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< + * + * result = malloc(size) + */ + __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); + + /* "View.MemoryView":1218 + * cdef size_t size = slice_get_size(src, ndim) + * + * result = malloc(size) # <<<<<<<<<<<<<< + * if not result: + * _err(MemoryError, NULL) + */ + __pyx_v_result = malloc(__pyx_v_size); + + /* "View.MemoryView":1219 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) + * + */ + __pyx_t_2 = ((!(__pyx_v_result != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1220 + * result = malloc(size) + * if not result: + * _err(MemoryError, NULL) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 1220, __pyx_L1_error) + + /* "View.MemoryView":1219 + * + * result = malloc(size) + * if not result: # <<<<<<<<<<<<<< + * _err(MemoryError, NULL) + * + */ + } + + /* "View.MemoryView":1223 + * + * + * tmpslice.data = result # <<<<<<<<<<<<<< + * tmpslice.memview = src.memview + * for i in range(ndim): + */ + __pyx_v_tmpslice->data = ((char *)__pyx_v_result); + + /* "View.MemoryView":1224 + * + * tmpslice.data = result + * tmpslice.memview = src.memview # <<<<<<<<<<<<<< + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + */ + __pyx_t_4 = __pyx_v_src->memview; + __pyx_v_tmpslice->memview = __pyx_t_4; + + /* "View.MemoryView":1225 + * tmpslice.data = result + * tmpslice.memview = src.memview + * for i in range(ndim): # <<<<<<<<<<<<<< + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1226 + * tmpslice.memview = src.memview + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< + * tmpslice.suboffsets[i] = -1 + * + */ + (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); + + /* "View.MemoryView":1227 + * for i in range(ndim): + * tmpslice.shape[i] = src.shape[i] + * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, + */ + (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1229 + * tmpslice.suboffsets[i] = -1 + * + * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, # <<<<<<<<<<<<<< + * ndim, order) + * + */ + (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); + + /* "View.MemoryView":1233 + * + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 + */ + __pyx_t_3 = __pyx_v_ndim; + __pyx_t_5 = __pyx_t_3; + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { + __pyx_v_i = __pyx_t_6; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + __pyx_t_2 = (((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1235 + * for i in range(ndim): + * if tmpslice.shape[i] == 1: + * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< + * + * if slice_is_contig(src[0], order, ndim): + */ + (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1234 + * + * for i in range(ndim): + * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< + * tmpslice.strides[i] = 0 + * + */ + } + } + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1238 + * + * if slice_is_contig(src[0], order, ndim): + * memcpy(result, src.data, size) # <<<<<<<<<<<<<< + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + */ + (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); + + /* "View.MemoryView":1237 + * tmpslice.strides[i] = 0 + * + * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< + * memcpy(result, src.data, size) + * else: + */ + goto __pyx_L9; + } + + /* "View.MemoryView":1240 + * memcpy(result, src.data, size) + * else: + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< + * + * return result + */ + /*else*/ { + copy_strided_to_strided(__pyx_v_src, __pyx_v_tmpslice, __pyx_v_ndim, __pyx_v_itemsize); + } + __pyx_L9:; + + /* "View.MemoryView":1242 + * copy_strided_to_strided(src, tmpslice, ndim, itemsize) + * + * return result # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_result; + goto __pyx_L0; + + /* "View.MemoryView":1204 + * + * @cname('__pyx_memoryview_copy_data_to_temp') + * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice *tmpslice, + * char order, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.copy_data_to_temp", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = NULL; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + */ + +static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent1, Py_ssize_t __pyx_v_extent2) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_extents", 0); + + /* "View.MemoryView":1250 + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + * (i, extent1, extent2)) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err_dim') + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + + /* "View.MemoryView":1249 + * cdef int _err_extents(int i, Py_ssize_t extent1, + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % # <<<<<<<<<<<<<< + * (i, extent1, extent2)) + * + */ + __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 1249, __pyx_L1_error) + + /* "View.MemoryView":1247 + * + * @cname('__pyx_memoryview_err_extents') + * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< + * Py_ssize_t extent2) except -1 with gil: + * raise ValueError("got differing extents in dimension %d (got %d and %d)" % + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("View.MemoryView._err_extents", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1253 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) + * + */ + +static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, int __pyx_v_dim) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err_dim", 0); + __Pyx_INCREF(__pyx_v_error); + + /* "View.MemoryView":1254 + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: + * raise error(msg.decode('ascii') % dim) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_err') + */ + __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_INCREF(__pyx_v_error); + __pyx_t_3 = __pyx_v_error; __pyx_t_2 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_2)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_2); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + if (!__pyx_t_2) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[2] = {__pyx_t_2, __pyx_t_4}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 1254, __pyx_L1_error) + + /* "View.MemoryView":1253 + * + * @cname('__pyx_memoryview_err_dim') + * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii') % dim) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("View.MemoryView._err_dim", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1257 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) + */ + +static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("_err", 0); + __Pyx_INCREF(__pyx_v_error); + + /* "View.MemoryView":1258 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) + * else: + */ + __pyx_t_1 = ((__pyx_v_msg != NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":1259 + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: + * raise error(msg.decode('ascii')) # <<<<<<<<<<<<<< + * else: + * raise error + */ + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_error); + __pyx_t_4 = __pyx_v_error; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + if (!__pyx_t_5) { + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1259, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1259, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_3}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1259, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __PYX_ERR(1, 1259, __pyx_L1_error) + + /* "View.MemoryView":1258 + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: + * if msg != NULL: # <<<<<<<<<<<<<< + * raise error(msg.decode('ascii')) + * else: + */ + } + + /* "View.MemoryView":1261 + * raise error(msg.decode('ascii')) + * else: + * raise error # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_copy_contents') + */ + /*else*/ { + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + __PYX_ERR(1, 1261, __pyx_L1_error) + } + + /* "View.MemoryView":1257 + * + * @cname('__pyx_memoryview_err') + * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< + * if msg != NULL: + * raise error(msg.decode('ascii')) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView._err", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + return __pyx_r; +} + +/* "View.MemoryView":1264 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + +static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_memviewslice __pyx_v_dst, int __pyx_v_src_ndim, int __pyx_v_dst_ndim, int __pyx_v_dtype_is_object) { + void *__pyx_v_tmpdata; + size_t __pyx_v_itemsize; + int __pyx_v_i; + char __pyx_v_order; + int __pyx_v_broadcasting; + int __pyx_v_direct_copy; + __Pyx_memviewslice __pyx_v_tmp; + int __pyx_v_ndim; + int __pyx_r; + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + void *__pyx_t_7; + int __pyx_t_8; + + /* "View.MemoryView":1272 + * Check for overlapping memory and verify the shapes. + * """ + * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + */ + __pyx_v_tmpdata = NULL; + + /* "View.MemoryView":1273 + * """ + * cdef void *tmpdata = NULL + * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + */ + __pyx_t_1 = __pyx_v_src.memview->view.itemsize; + __pyx_v_itemsize = __pyx_t_1; + + /* "View.MemoryView":1275 + * cdef size_t itemsize = src.memview.view.itemsize + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< + * cdef bint broadcasting = False + * cdef bint direct_copy = False + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); + + /* "View.MemoryView":1276 + * cdef int i + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False # <<<<<<<<<<<<<< + * cdef bint direct_copy = False + * cdef __Pyx_memviewslice tmp + */ + __pyx_v_broadcasting = 0; + + /* "View.MemoryView":1277 + * cdef char order = get_best_order(&src, src_ndim) + * cdef bint broadcasting = False + * cdef bint direct_copy = False # <<<<<<<<<<<<<< + * cdef __Pyx_memviewslice tmp + * + */ + __pyx_v_direct_copy = 0; + + /* "View.MemoryView":1280 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + __pyx_t_2 = ((__pyx_v_src_ndim < __pyx_v_dst_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1281 + * + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); + + /* "View.MemoryView":1280 + * cdef __Pyx_memviewslice tmp + * + * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1282 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + __pyx_t_2 = ((__pyx_v_dst_ndim < __pyx_v_src_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1283 + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: + * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< + * + * cdef int ndim = max(src_ndim, dst_ndim) + */ + __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); + + /* "View.MemoryView":1282 + * if src_ndim < dst_ndim: + * broadcast_leading(&src, src_ndim, dst_ndim) + * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + */ + } + __pyx_L3:; + + /* "View.MemoryView":1285 + * broadcast_leading(&dst, dst_ndim, src_ndim) + * + * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< + * + * for i in range(ndim): + */ + __pyx_t_3 = __pyx_v_dst_ndim; + __pyx_t_4 = __pyx_v_src_ndim; + if (((__pyx_t_3 > __pyx_t_4) != 0)) { + __pyx_t_5 = __pyx_t_3; + } else { + __pyx_t_5 = __pyx_t_4; + } + __pyx_v_ndim = __pyx_t_5; + + /* "View.MemoryView":1287 + * cdef int ndim = max(src_ndim, dst_ndim) + * + * for i in range(ndim): # <<<<<<<<<<<<<< + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + */ + __pyx_t_5 = __pyx_v_ndim; + __pyx_t_3 = __pyx_t_5; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1288 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1289 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) == 1) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1290 + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: + * broadcasting = True # <<<<<<<<<<<<<< + * src.strides[i] = 0 + * else: + */ + __pyx_v_broadcasting = 1; + + /* "View.MemoryView":1291 + * if src.shape[i] == 1: + * broadcasting = True + * src.strides[i] = 0 # <<<<<<<<<<<<<< + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) + */ + (__pyx_v_src.strides[__pyx_v_i]) = 0; + + /* "View.MemoryView":1289 + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: + * if src.shape[i] == 1: # <<<<<<<<<<<<<< + * broadcasting = True + * src.strides[i] = 0 + */ + goto __pyx_L7; + } + + /* "View.MemoryView":1293 + * src.strides[i] = 0 + * else: + * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< + * + * if src.suboffsets[i] >= 0: + */ + /*else*/ { + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1293, __pyx_L1_error) + } + __pyx_L7:; + + /* "View.MemoryView":1288 + * + * for i in range(ndim): + * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< + * if src.shape[i] == 1: + * broadcasting = True + */ + } + + /* "View.MemoryView":1295 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + */ + __pyx_t_2 = (((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1296 + * + * if src.suboffsets[i] >= 0: + * _err_dim(ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< + * + * if slices_overlap(&src, &dst, ndim, itemsize): + */ + __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 1296, __pyx_L1_error) + + /* "View.MemoryView":1295 + * _err_extents(i, dst.shape[i], src.shape[i]) + * + * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + */ + } + } + + /* "View.MemoryView":1298 + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + __pyx_t_2 = (__pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1300 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + __pyx_t_2 = ((!(__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim) != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1301 + * + * if not slice_is_contig(src, order, ndim): + * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + */ + __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); + + /* "View.MemoryView":1300 + * if slices_overlap(&src, &dst, ndim, itemsize): + * + * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< + * order = get_best_order(&dst, ndim) + * + */ + } + + /* "View.MemoryView":1303 + * order = get_best_order(&dst, ndim) + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< + * src = tmp + * + */ + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(1, 1303, __pyx_L1_error) + __pyx_v_tmpdata = __pyx_t_7; + + /* "View.MemoryView":1304 + * + * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) + * src = tmp # <<<<<<<<<<<<<< + * + * if not broadcasting: + */ + __pyx_v_src = __pyx_v_tmp; + + /* "View.MemoryView":1298 + * _err_dim(ValueError, "Dimension %d is not direct", i) + * + * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< + * + * if not slice_is_contig(src, order, ndim): + */ + } + + /* "View.MemoryView":1306 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = ((!(__pyx_v_broadcasting != 0)) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1309 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1310 + * + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); + + /* "View.MemoryView":1309 + * + * + * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + */ + goto __pyx_L12; + } + + /* "View.MemoryView":1311 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim) != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1312 + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): + * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< + * + * if direct_copy: + */ + __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); + + /* "View.MemoryView":1311 + * if slice_is_contig(src, 'C', ndim): + * direct_copy = slice_is_contig(dst, 'C', ndim) + * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + */ + } + __pyx_L12:; + + /* "View.MemoryView":1314 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + __pyx_t_2 = (__pyx_v_direct_copy != 0); + if (__pyx_t_2) { + + /* "View.MemoryView":1316 + * if direct_copy: + * + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1317 + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) + */ + (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); + + /* "View.MemoryView":1318 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * free(tmpdata) + * return 0 + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1319 + * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1320 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * if order == 'F' == get_best_order(&dst, ndim): + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1314 + * direct_copy = slice_is_contig(dst, 'F', ndim) + * + * if direct_copy: # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + } + + /* "View.MemoryView":1306 + * src = tmp + * + * if not broadcasting: # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1322 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = (__pyx_v_order == 'F'); + if (__pyx_t_2) { + __pyx_t_2 = ('F' == __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim)); + } + __pyx_t_8 = (__pyx_t_2 != 0); + if (__pyx_t_8) { + + /* "View.MemoryView":1325 + * + * + * transpose_memslice(&src) # <<<<<<<<<<<<<< + * transpose_memslice(&dst) + * + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(1, 1325, __pyx_L1_error) + + /* "View.MemoryView":1326 + * + * transpose_memslice(&src) + * transpose_memslice(&dst) # <<<<<<<<<<<<<< + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + */ + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(1, 1326, __pyx_L1_error) + + /* "View.MemoryView":1322 + * return 0 + * + * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< + * + * + */ + } + + /* "View.MemoryView":1328 + * transpose_memslice(&dst) + * + * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1329 + * + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< + * refcount_copying(&dst, dtype_is_object, ndim, True) + * + */ + copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); + + /* "View.MemoryView":1330 + * refcount_copying(&dst, dtype_is_object, ndim, False) + * copy_strided_to_strided(&src, &dst, ndim, itemsize) + * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * + * free(tmpdata) + */ + __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1332 + * refcount_copying(&dst, dtype_is_object, ndim, True) + * + * free(tmpdata) # <<<<<<<<<<<<<< + * return 0 + * + */ + free(__pyx_v_tmpdata); + + /* "View.MemoryView":1333 + * + * free(tmpdata) + * return 0 # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_broadcast_leading') + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "View.MemoryView":1264 + * + * @cname('__pyx_memoryview_copy_contents') + * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< + * __Pyx_memviewslice dst, + * int src_ndim, int dst_ndim, + */ + + /* function exit code */ + __pyx_L1_error:; + { + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_AddTraceback("View.MemoryView.memoryview_copy_contents", __pyx_clineno, __pyx_lineno, __pyx_filename); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif + } + __pyx_r = -1; + __pyx_L0:; + return __pyx_r; +} + +/* "View.MemoryView":1336 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: + */ + +static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslice, int __pyx_v_ndim, int __pyx_v_ndim_other) { + int __pyx_v_i; + int __pyx_v_offset; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + + /* "View.MemoryView":1340 + * int ndim_other) nogil: + * cdef int i + * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< + * + * for i in range(ndim - 1, -1, -1): + */ + __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); + + /* "View.MemoryView":1342 + * cdef int offset = ndim_other - ndim + * + * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + */ + for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { + __pyx_v_i = __pyx_t_1; + + /* "View.MemoryView":1343 + * + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + */ + (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); + + /* "View.MemoryView":1344 + * for i in range(ndim - 1, -1, -1): + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + */ + (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); + + /* "View.MemoryView":1345 + * mslice.shape[i + offset] = mslice.shape[i] + * mslice.strides[i + offset] = mslice.strides[i] + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< + * + * for i in range(offset): + */ + (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); + } + + /* "View.MemoryView":1347 + * mslice.suboffsets[i + offset] = mslice.suboffsets[i] + * + * for i in range(offset): # <<<<<<<<<<<<<< + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + */ + __pyx_t_1 = __pyx_v_offset; + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1348 + * + * for i in range(offset): + * mslice.shape[i] = 1 # <<<<<<<<<<<<<< + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 + */ + (__pyx_v_mslice->shape[__pyx_v_i]) = 1; + + /* "View.MemoryView":1349 + * for i in range(offset): + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< + * mslice.suboffsets[i] = -1 + * + */ + (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); + + /* "View.MemoryView":1350 + * mslice.shape[i] = 1 + * mslice.strides[i] = mslice.strides[0] + * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< + * + * + */ + (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; + } + + /* "View.MemoryView":1336 + * + * @cname('__pyx_memoryview_broadcast_leading') + * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< + * int ndim, + * int ndim_other) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1358 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: + * + */ + +static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { + int __pyx_t_1; + + /* "View.MemoryView":1362 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) + */ + __pyx_t_1 = (__pyx_v_dtype_is_object != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1363 + * + * if dtype_is_object: + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, # <<<<<<<<<<<<<< + * dst.strides, ndim, inc) + * + */ + __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1362 + * + * + * if dtype_is_object: # <<<<<<<<<<<<<< + * refcount_objects_in_slice_with_gil(dst.data, dst.shape, + * dst.strides, ndim, inc) + */ + } + + /* "View.MemoryView":1358 + * + * @cname('__pyx_memoryview_refcount_copying') + * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< + * int ndim, bint inc) nogil: + * + */ + + /* function exit code */ +} + +/* "View.MemoryView":1367 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + */ + +static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + __Pyx_RefNannyDeclarations + #ifdef WITH_THREAD + PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); + #endif + __Pyx_RefNannySetupContext("refcount_objects_in_slice_with_gil", 0); + + /* "View.MemoryView":1370 + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); + + /* "View.MemoryView":1367 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') + * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * bint inc) with gil: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + #ifdef WITH_THREAD + __Pyx_PyGILState_Release(__pyx_gilstate_save); + #endif +} + +/* "View.MemoryView":1373 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i + */ + +static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, int __pyx_v_inc) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("refcount_objects_in_slice", 0); + + /* "View.MemoryView":1377 + * cdef Py_ssize_t i + * + * for i in range(shape[0]): # <<<<<<<<<<<<<< + * if ndim == 1: + * if inc: + */ + __pyx_t_1 = (__pyx_v_shape[0]); + __pyx_t_2 = __pyx_t_1; + for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "View.MemoryView":1378 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + __pyx_t_4 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":1379 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + __pyx_t_4 = (__pyx_v_inc != 0); + if (__pyx_t_4) { + + /* "View.MemoryView":1380 + * if ndim == 1: + * if inc: + * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * Py_DECREF(( data)[0]) + */ + Py_INCREF((((PyObject **)__pyx_v_data)[0])); + + /* "View.MemoryView":1379 + * for i in range(shape[0]): + * if ndim == 1: + * if inc: # <<<<<<<<<<<<<< + * Py_INCREF(( data)[0]) + * else: + */ + goto __pyx_L6; + } + + /* "View.MemoryView":1382 + * Py_INCREF(( data)[0]) + * else: + * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, + */ + /*else*/ { + Py_DECREF((((PyObject **)__pyx_v_data)[0])); + } + __pyx_L6:; + + /* "View.MemoryView":1378 + * + * for i in range(shape[0]): + * if ndim == 1: # <<<<<<<<<<<<<< + * if inc: + * Py_INCREF(( data)[0]) + */ + goto __pyx_L5; + } + + /* "View.MemoryView":1384 + * Py_DECREF(( data)[0]) + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, inc) + * + */ + /*else*/ { + + /* "View.MemoryView":1385 + * else: + * refcount_objects_in_slice(data, shape + 1, strides + 1, + * ndim - 1, inc) # <<<<<<<<<<<<<< + * + * data += strides[0] + */ + __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_inc); + } + __pyx_L5:; + + /* "View.MemoryView":1387 + * ndim - 1, inc) + * + * data += strides[0] # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + (__pyx_v_strides[0])); + } + + /* "View.MemoryView":1373 + * + * @cname('__pyx_memoryview_refcount_objects_in_slice') + * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, bint inc): + * cdef Py_ssize_t i + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "View.MemoryView":1393 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + */ + +static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { + + /* "View.MemoryView":1396 + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); + + /* "View.MemoryView":1397 + * bint dtype_is_object) nogil: + * refcount_copying(dst, dtype_is_object, ndim, False) + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, # <<<<<<<<<<<<<< + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1399 + * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, + * itemsize, item) + * refcount_copying(dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< + * + * + */ + __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); + + /* "View.MemoryView":1393 + * + * @cname('__pyx_memoryview_slice_assign_scalar') + * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< + * size_t itemsize, void *item, + * bint dtype_is_object) nogil: + */ + + /* function exit code */ +} + +/* "View.MemoryView":1403 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: + */ + +static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t *__pyx_v_shape, Py_ssize_t *__pyx_v_strides, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item) { + CYTHON_UNUSED Py_ssize_t __pyx_v_i; + Py_ssize_t __pyx_v_stride; + Py_ssize_t __pyx_v_extent; + int __pyx_t_1; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; + + /* "View.MemoryView":1407 + * size_t itemsize, void *item) nogil: + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< + * cdef Py_ssize_t extent = shape[0] + * + */ + __pyx_v_stride = (__pyx_v_strides[0]); + + /* "View.MemoryView":1408 + * cdef Py_ssize_t i + * cdef Py_ssize_t stride = strides[0] + * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< + * + * if ndim == 1: + */ + __pyx_v_extent = (__pyx_v_shape[0]); + + /* "View.MemoryView":1410 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); + if (__pyx_t_1) { + + /* "View.MemoryView":1411 + * + * if ndim == 1: + * for i in range(extent): # <<<<<<<<<<<<<< + * memcpy(data, item, itemsize) + * data += stride + */ + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1412 + * if ndim == 1: + * for i in range(extent): + * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< + * data += stride + * else: + */ + (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); + + /* "View.MemoryView":1413 + * for i in range(extent): + * memcpy(data, item, itemsize) + * data += stride # <<<<<<<<<<<<<< + * else: + * for i in range(extent): + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + + /* "View.MemoryView":1410 + * cdef Py_ssize_t extent = shape[0] + * + * if ndim == 1: # <<<<<<<<<<<<<< + * for i in range(extent): + * memcpy(data, item, itemsize) + */ + goto __pyx_L3; + } + + /* "View.MemoryView":1415 + * data += stride + * else: + * for i in range(extent): # <<<<<<<<<<<<<< + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) + */ + /*else*/ { + __pyx_t_2 = __pyx_v_extent; + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; + + /* "View.MemoryView":1416 + * else: + * for i in range(extent): + * _slice_assign_scalar(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< + * ndim - 1, itemsize, item) + * data += stride + */ + __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); + + /* "View.MemoryView":1418 + * _slice_assign_scalar(data, shape + 1, strides + 1, + * ndim - 1, itemsize, item) + * data += stride # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data = (__pyx_v_data + __pyx_v_stride); + } + } + __pyx_L3:; + + /* "View.MemoryView":1403 + * + * @cname('__pyx_memoryview__slice_assign_scalar') + * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< + * Py_ssize_t *strides, int ndim, + * size_t itemsize, void *item) nogil: + */ + + /* function exit code */ +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum = {"__pyx_unpickle_Enum", (PyCFunction)__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_Enum") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_Enum", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = NULL; + PyObject *__pyx_v___pyx_result = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 0); + + /* "(tree fragment)":2 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xb068931) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":3 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 3, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":4 + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_5) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } else + #endif + { + __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL; + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":2 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): + * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":5 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + if (!__pyx_t_6) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_v___pyx_type}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_3); + } else + #endif + { + __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL; + __Pyx_INCREF(__pyx_v___pyx_type); + __Pyx_GIVEREF(__pyx_v___pyx_type); + PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v___pyx_type); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_7 = (__pyx_t_1 != 0); + if (__pyx_t_7) { + + /* "(tree fragment)":7 + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 7, __pyx_L1_error) + __pyx_t_3 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * __pyx_result = Enum.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":8 + * if __pyx_state is not None: + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 0); + + /* "(tree fragment)":10 + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 10, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 11, __pyx_L1_error) + } + __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 11, __pyx_L1_error) + __pyx_t_4 = ((__pyx_t_3 > 1) != 0); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 11, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 != 0); + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":12 + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[1]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (!__pyx_t_8) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else { + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[2] = {__pyx_t_8, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8); __pyx_t_8 = NULL; + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[1]) + */ + } + + /* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_PBCBox __pyx_vtable_10MDAnalysis_3lib_6nsgrid_PBCBox; + +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_PBCBox(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)o); + p->__pyx_vtab = __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_PBCBox; + return o; +} + +static void __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_PBCBox(PyObject *o) { + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + (*Py_TYPE(o)->tp_free)(o); +} + +static PyMethodDef __pyx_methods_10MDAnalysis_3lib_6nsgrid_PBCBox[] = { + {"update", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_3update, METH_O, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox_2update}, + {"__reduce_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_5__reduce_cython__, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox_4__reduce_cython__}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_7__setstate_cython__, METH_O, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox_6__setstate_cython__}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid.PBCBox", /*tp_name*/ + sizeof(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_PBCBox, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "PBCBox(__Pyx_memviewslice box, bool periodic)\n\n Cython implementation of\n `PBC-related `_\n operations. This class is used by classes :class:`FastNS`\n and :class:`NSGrid` to put all particles inside a brick-shaped box\n and to compute PBC-aware distance. The class can also handle\n non-PBC aware distance evaluations through ``periodic`` argument.\n\n .. warning::\n This class is not meant to be used by end users.\n\n .. warning::\n Even if MD triclinic boxes can be handled by this class,\n internal optimization is made based on the assumption that\n particles are inside a brick-shaped box. When this is not\n the case, calculated distances are not\n warranted to be exact.\n ", /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_10MDAnalysis_3lib_6nsgrid_PBCBox, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_10MDAnalysis_3lib_6nsgrid_6PBCBox_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_10MDAnalysis_3lib_6nsgrid_PBCBox, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSResults __pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSResults; + +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_NSResults(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)o); + p->__pyx_vtab = __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSResults; + new((void*)&(p->indices_buffer)) std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_intvec> (); + new((void*)&(p->distances_buffer)) std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_realvec> (); + new((void*)&(p->pairs_buffer)) std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int> (); + new((void*)&(p->pair_distances_buffer)) std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> (); + new((void*)&(p->pair_distances2_buffer)) std::vector<__pyx_t_10MDAnalysis_3lib_6nsgrid_real> (); + p->coords.data = NULL; + p->coords.memview = NULL; + p->searchcoords.data = NULL; + p->searchcoords.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_NSResults(PyObject *o) { + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *p = (struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + __Pyx_call_destructor(p->indices_buffer); + __Pyx_call_destructor(p->distances_buffer); + __Pyx_call_destructor(p->pairs_buffer); + __Pyx_call_destructor(p->pair_distances_buffer); + __Pyx_call_destructor(p->pair_distances2_buffer); + __PYX_XDEC_MEMVIEW(&p->coords, 1); + __PYX_XDEC_MEMVIEW(&p->searchcoords, 1); + (*Py_TYPE(o)->tp_free)(o); +} + +static PyObject *__pyx_getprop_10MDAnalysis_3lib_6nsgrid_9NSResults_cutoff(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_6cutoff_1__get__(o); +} + +static PyMethodDef __pyx_methods_10MDAnalysis_3lib_6nsgrid_NSResults[] = { + {"get_pairs", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_3get_pairs, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_2get_pairs}, + {"get_pair_distances", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_5get_pair_distances, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_4get_pair_distances}, + {"get_indices", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_7get_indices, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_6get_indices}, + {"get_distances", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_9get_distances, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_8get_distances}, + {"__reduce_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_11__reduce_cython__, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_10__reduce_cython__}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_13__setstate_cython__, METH_O, __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults_12__setstate_cython__}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_10MDAnalysis_3lib_6nsgrid_NSResults[] = { + {(char *)"cutoff", __pyx_getprop_10MDAnalysis_3lib_6nsgrid_9NSResults_cutoff, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid.NSResults", /*tp_name*/ + sizeof(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_NSResults, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "NSResults(real cutoff, __Pyx_memviewslice coords, __Pyx_memviewslice searchcoords)\nClass to store the results\n\n All the required outputs from :class:`FastNS` is stored in the\n instance of this class. All the methods of :class:`FastNS` returns\n an instance of this class, which can be used to generate the desired\n results on demand.\n ", /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_10MDAnalysis_3lib_6nsgrid_NSResults, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_10MDAnalysis_3lib_6nsgrid_NSResults, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_10MDAnalysis_3lib_6nsgrid_9NSResults_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_10MDAnalysis_3lib_6nsgrid_NSResults, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_10MDAnalysis_3lib_6nsgrid_NSGrid __pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSGrid; + +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_NSGrid(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)o); + p->__pyx_vtab = __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSGrid; + return o; +} + +static void __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_NSGrid(PyObject *o) { + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_3__dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + (*Py_TYPE(o)->tp_free)(o); +} + +static PyObject *__pyx_getprop_10MDAnalysis_3lib_6nsgrid_6NSGrid_cutoff(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_6cutoff_1__get__(o); +} + +static PyMethodDef __pyx_methods_10MDAnalysis_3lib_6nsgrid_NSGrid[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_5__reduce_cython__, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6NSGrid_4__reduce_cython__}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_7__setstate_cython__, METH_O, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6NSGrid_6__setstate_cython__}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_10MDAnalysis_3lib_6nsgrid_NSGrid[] = { + {(char *)"cutoff", __pyx_getprop_10MDAnalysis_3lib_6nsgrid_6NSGrid_cutoff, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid.NSGrid", /*tp_name*/ + sizeof(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_NSGrid, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "NSGrid(ncoords, cutoff, PBCBox box, max_size, force=False)\nConstructs a uniform cuboidal grid for a brick-shaped box\n\n This class uses :class:`PBCBox` to define the brick shaped box\n It is essential to initialize the box with :class:`PBCBox`\n inorder to form the grid.\n\n The domain is subdivided into number of cells based on the desired search\n radius. Ideally cellsize should be equal to the search radius, but small\n search radius leads to large cell-list data strucutres.\n An optimization of cutoff is imposed to limit the size of data\n structure such that the cellsize is always greater than or\n equal to cutoff distance.\n\n Note\n ----\n This class assumes that all the coordinates are already\n inside the brick shaped box. Care must be taken to ensure\n all the particles are within the brick shaped box as\n defined by :class:`PBCBox`. This can be ensured by using\n :func:`~MDAnalysis.lib.nsgrid.PBCBox.fast_put_atoms_in_bbox`\n\n .. warning::\n This class is not meant to be used by end users.\n\n ", /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_10MDAnalysis_3lib_6nsgrid_NSGrid, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_10MDAnalysis_3lib_6nsgrid_NSGrid, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_10MDAnalysis_3lib_6nsgrid_6NSGrid_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_10MDAnalysis_3lib_6nsgrid_NSGrid, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyObject *__pyx_tp_new_10MDAnalysis_3lib_6nsgrid_FastNS(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)o); + p->box = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)Py_None); Py_INCREF(Py_None); + p->grid = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)Py_None); Py_INCREF(Py_None); + p->coords.data = NULL; + p->coords.memview = NULL; + p->coords_bbox.data = NULL; + p->coords_bbox.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_FastNS(PyObject *o) { + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *p = (struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->box); + Py_CLEAR(p->grid); + __PYX_XDEC_MEMVIEW(&p->coords, 1); + __PYX_XDEC_MEMVIEW(&p->coords_bbox, 1); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_10MDAnalysis_3lib_6nsgrid_FastNS(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *p = (struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)o; + if (p->box) { + e = (*v)(((PyObject *)p->box), a); if (e) return e; + } + if (p->grid) { + e = (*v)(((PyObject *)p->grid), a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_10MDAnalysis_3lib_6nsgrid_FastNS(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *p = (struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS *)o; + tmp = ((PyObject*)p->box); + p->box = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->grid); + p->grid = ((struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_10MDAnalysis_3lib_6nsgrid_6FastNS_cutoff(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_6cutoff_1__get__(o); +} + +static PyMethodDef __pyx_methods_10MDAnalysis_3lib_6nsgrid_FastNS[] = { + {"search", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_3search, METH_O, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_2search}, + {"self_search", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_5self_search, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_4self_search}, + {"__reduce_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_7__reduce_cython__, METH_NOARGS, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_6__reduce_cython__}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_9__setstate_cython__, METH_O, __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS_8__setstate_cython__}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_10MDAnalysis_3lib_6nsgrid_FastNS[] = { + {(char *)"cutoff", __pyx_getprop_10MDAnalysis_3lib_6nsgrid_6FastNS_cutoff, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid.FastNS", /*tp_name*/ + sizeof(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_FastNS), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_10MDAnalysis_3lib_6nsgrid_FastNS, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + "FastNS(cutoff, coords, box, max_gridsize=5000, pbc=True)\nGrid based search between two group of atoms\n\n Instantiates a class object which uses :class:`PBCBox` and\n :class:`NSGrid` to construct a cuboidal\n grid in an orthogonal brick shaped box.\n\n Minimum image convention is used for distance evaluations\n if pbc is set to ``True``.\n ", /*tp_doc*/ + __pyx_tp_traverse_10MDAnalysis_3lib_6nsgrid_FastNS, /*tp_traverse*/ + __pyx_tp_clear_10MDAnalysis_3lib_6nsgrid_FastNS, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_10MDAnalysis_3lib_6nsgrid_FastNS, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_10MDAnalysis_3lib_6nsgrid_FastNS, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_10MDAnalysis_3lib_6nsgrid_6FastNS_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_10MDAnalysis_3lib_6nsgrid_FastNS, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_array __pyx_vtable_array; + +static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_array_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_array_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_array; + p->mode = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_format = ((PyObject*)Py_None); Py_INCREF(Py_None); + if (unlikely(__pyx_array___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_array(PyObject *o) { + struct __pyx_array_obj *p = (struct __pyx_array_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_array___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->mode); + Py_CLEAR(p->_format); + (*Py_TYPE(o)->tp_free)(o); +} +static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_array___setitem__(o, i, v); + } + else { + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); + return -1; + } +} + +static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) { + PyObject *v = __Pyx_PyObject_GenericGetAttr(o, n); + if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + v = __pyx_array___getattr__(o, n); + } + return v; +} + +static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__(o); +} + +static PyMethodDef __pyx_methods_array[] = { + {"__getattr__", (PyCFunction)__pyx_array___getattr__, METH_O|METH_COEXIST, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_array_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_array_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_array[] = { + {(char *)"memview", __pyx_getprop___pyx_array_memview, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PySequenceMethods __pyx_tp_as_sequence_array = { + __pyx_array___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_array, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_array = { + __pyx_array___len__, /*mp_length*/ + __pyx_array___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_array, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_array = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_array_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_array = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid.array", /*tp_name*/ + sizeof(struct __pyx_array_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_array, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_array, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_array, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + __pyx_tp_getattro_array, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_array, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_array, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_array, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_array, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_MemviewEnum_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_MemviewEnum_obj *)o); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_Enum(PyObject *o) { + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_Enum(PyObject *o) { + PyObject* tmp; + struct __pyx_MemviewEnum_obj *p = (struct __pyx_MemviewEnum_obj *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyMethodDef __pyx_methods_Enum[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_MemviewEnum_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type___pyx_MemviewEnum = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid.Enum", /*tp_name*/ + sizeof(struct __pyx_MemviewEnum_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_Enum, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_MemviewEnum___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_Enum, /*tp_traverse*/ + __pyx_tp_clear_Enum, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_Enum, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_MemviewEnum___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_Enum, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; + +static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryview_obj *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryview_obj *)o); + p->__pyx_vtab = __pyx_vtabptr_memoryview; + p->obj = Py_None; Py_INCREF(Py_None); + p->_size = Py_None; Py_INCREF(Py_None); + p->_array_interface = Py_None; Py_INCREF(Py_None); + p->view.obj = NULL; + if (unlikely(__pyx_memoryview___cinit__(o, a, k) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_memoryview(PyObject *o) { + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_memoryview___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->obj); + Py_CLEAR(p->_size); + Py_CLEAR(p->_array_interface); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + if (p->obj) { + e = (*v)(p->obj, a); if (e) return e; + } + if (p->_size) { + e = (*v)(p->_size, a); if (e) return e; + } + if (p->_array_interface) { + e = (*v)(p->_array_interface, a); if (e) return e; + } + if (p->view.obj) { + e = (*v)(p->view.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_memoryview(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryview_obj *p = (struct __pyx_memoryview_obj *)o; + tmp = ((PyObject*)p->obj); + p->obj = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_size); + p->_size = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_array_interface); + p->_array_interface = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->view.obj); + return 0; +} +static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) { + PyObject *r; + PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0; + r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x); + Py_DECREF(x); + return r; +} + +static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_memoryview___setitem__(o, i, v); + } + else { + PyErr_Format(PyExc_NotImplementedError, + "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name); + return -1; + } +} + +static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_10suboffsets_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__get__(o); +} + +static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__get__(o); +} + +static PyMethodDef __pyx_methods_memoryview[] = { + {"is_c_contig", (PyCFunction)__pyx_memoryview_is_c_contig, METH_NOARGS, 0}, + {"is_f_contig", (PyCFunction)__pyx_memoryview_is_f_contig, METH_NOARGS, 0}, + {"copy", (PyCFunction)__pyx_memoryview_copy, METH_NOARGS, 0}, + {"copy_fortran", (PyCFunction)__pyx_memoryview_copy_fortran, METH_NOARGS, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryview_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_memoryview[] = { + {(char *)"T", __pyx_getprop___pyx_memoryview_T, 0, (char *)0, 0}, + {(char *)"base", __pyx_getprop___pyx_memoryview_base, 0, (char *)0, 0}, + {(char *)"shape", __pyx_getprop___pyx_memoryview_shape, 0, (char *)0, 0}, + {(char *)"strides", __pyx_getprop___pyx_memoryview_strides, 0, (char *)0, 0}, + {(char *)"suboffsets", __pyx_getprop___pyx_memoryview_suboffsets, 0, (char *)0, 0}, + {(char *)"ndim", __pyx_getprop___pyx_memoryview_ndim, 0, (char *)0, 0}, + {(char *)"itemsize", __pyx_getprop___pyx_memoryview_itemsize, 0, (char *)0, 0}, + {(char *)"nbytes", __pyx_getprop___pyx_memoryview_nbytes, 0, (char *)0, 0}, + {(char *)"size", __pyx_getprop___pyx_memoryview_size, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PySequenceMethods __pyx_tp_as_sequence_memoryview = { + __pyx_memoryview___len__, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + __pyx_sq_item_memoryview, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_memoryview = { + __pyx_memoryview___len__, /*mp_length*/ + __pyx_memoryview___getitem__, /*mp_subscript*/ + __pyx_mp_ass_subscript_memoryview, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_memoryview = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + __pyx_memoryview_getbuffer, /*bf_getbuffer*/ + 0, /*bf_releasebuffer*/ +}; + +static PyTypeObject __pyx_type___pyx_memoryview = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid.memoryview", /*tp_name*/ + sizeof(struct __pyx_memoryview_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_memoryview, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_memoryview___repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + &__pyx_tp_as_sequence_memoryview, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_memoryview, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_memoryview___str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_memoryview, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_memoryview, /*tp_traverse*/ + __pyx_tp_clear_memoryview, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_memoryview, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_memoryview, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_memoryview, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; + +static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_memoryviewslice_obj *p; + PyObject *o = __pyx_tp_new_memoryview(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_memoryviewslice_obj *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_memoryview*)__pyx_vtabptr__memoryviewslice; + p->from_object = Py_None; Py_INCREF(Py_None); + p->from_slice.memview = NULL; + return o; +} + +static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_memoryviewslice___dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->from_object); + PyObject_GC_Track(o); + __pyx_tp_dealloc_memoryview(o); +} + +static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + e = __pyx_tp_traverse_memoryview(o, v, a); if (e) return e; + if (p->from_object) { + e = (*v)(p->from_object, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear__memoryviewslice(PyObject *o) { + PyObject* tmp; + struct __pyx_memoryviewslice_obj *p = (struct __pyx_memoryviewslice_obj *)o; + __pyx_tp_clear_memoryview(o); + tmp = ((PyObject*)p->from_object); + p->from_object = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + __PYX_XDEC_MEMVIEW(&p->from_slice, 1); + return 0; +} + +static PyObject *__pyx_getprop___pyx_memoryviewslice_base(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base_1__get__(o); +} + +static PyMethodDef __pyx_methods__memoryviewslice[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_1__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw___pyx_memoryviewslice_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets__memoryviewslice[] = { + {(char *)"base", __pyx_getprop___pyx_memoryviewslice_base, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type___pyx_memoryviewslice = { + PyVarObject_HEAD_INIT(0, 0) + "MDAnalysis.lib.nsgrid._memoryviewslice", /*tp_name*/ + sizeof(struct __pyx_memoryviewslice_obj), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc__memoryviewslice, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + #if CYTHON_COMPILING_IN_PYPY + __pyx_memoryview___repr__, /*tp_repr*/ + #else + 0, /*tp_repr*/ + #endif + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + #if CYTHON_COMPILING_IN_PYPY + __pyx_memoryview___str__, /*tp_str*/ + #else + 0, /*tp_str*/ + #endif + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + "Internal class for passing memoryview slices to Python", /*tp_doc*/ + __pyx_tp_traverse__memoryviewslice, /*tp_traverse*/ + __pyx_tp_clear__memoryviewslice, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods__memoryviewslice, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets__memoryviewslice, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new__memoryviewslice, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_nsgrid(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_nsgrid}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "nsgrid", + __pyx_k_Neighbor_search_library_mod_MDA, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ASCII, __pyx_k_ASCII, sizeof(__pyx_k_ASCII), 0, 0, 1, 1}, + {&__pyx_kp_s_Any_of_the_box_dimensions_cannot, __pyx_k_Any_of_the_box_dimensions_cannot, sizeof(__pyx_k_Any_of_the_box_dimensions_cannot), 0, 0, 1, 0}, + {&__pyx_kp_s_Box_does_not_correspond_to_PBC_x, __pyx_k_Box_does_not_correspond_to_PBC_x, sizeof(__pyx_k_Box_does_not_correspond_to_PBC_x), 0, 0, 1, 0}, + {&__pyx_kp_s_Box_must_be_a_x_matrix_Got_x, __pyx_k_Box_must_be_a_x_matrix_Got_x, sizeof(__pyx_k_Box_must_be_a_x_matrix_Got_x), 0, 0, 1, 0}, + {&__pyx_kp_s_Buffer_view_does_not_expose_stri, __pyx_k_Buffer_view_does_not_expose_stri, sizeof(__pyx_k_Buffer_view_does_not_expose_stri), 0, 0, 1, 0}, + {&__pyx_n_s_C, __pyx_k_C, sizeof(__pyx_k_C), 0, 0, 1, 1}, + {&__pyx_kp_s_Can_only_create_a_buffer_that_is, __pyx_k_Can_only_create_a_buffer_that_is, sizeof(__pyx_k_Can_only_create_a_buffer_that_is), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_assign_to_read_only_memor, __pyx_k_Cannot_assign_to_read_only_memor, sizeof(__pyx_k_Cannot_assign_to_read_only_memor), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_create_writable_memory_vi, __pyx_k_Cannot_create_writable_memory_vi, sizeof(__pyx_k_Cannot_create_writable_memory_vi), 0, 0, 1, 0}, + {&__pyx_kp_s_Cannot_index_with_type_s, __pyx_k_Cannot_index_with_type_s, sizeof(__pyx_k_Cannot_index_with_type_s), 0, 0, 1, 0}, + {&__pyx_kp_s_Could_not_allocate_memory_for_NS, __pyx_k_Could_not_allocate_memory_for_NS, sizeof(__pyx_k_Could_not_allocate_memory_for_NS), 0, 0, 1, 0}, + {&__pyx_kp_s_Could_not_allocate_memory_from_N, __pyx_k_Could_not_allocate_memory_from_N, sizeof(__pyx_k_Could_not_allocate_memory_from_N), 0, 0, 1, 0}, + {&__pyx_kp_s_Could_not_allocate_memory_from_N_2, __pyx_k_Could_not_allocate_memory_from_N_2, sizeof(__pyx_k_Could_not_allocate_memory_from_N_2), 0, 0, 1, 0}, + {&__pyx_kp_s_Cutoff_greater_than_maximum_cuto, __pyx_k_Cutoff_greater_than_maximum_cuto, sizeof(__pyx_k_Cutoff_greater_than_maximum_cuto), 0, 0, 1, 0}, + {&__pyx_kp_s_Cutoff_must_be_positive, __pyx_k_Cutoff_must_be_positive, sizeof(__pyx_k_Cutoff_must_be_positive), 0, 0, 1, 0}, + {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, + {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0x29, __pyx_k_Incompatible_checksums_s_vs_0x29, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x29), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_k_Incompatible_checksums_s_vs_0xb0, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xb0), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0xd3, __pyx_k_Incompatible_checksums_s_vs_0xd3, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xd3), 0, 0, 1, 0}, + {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, + {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, + {&__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 0, 1, 0}, + {&__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_k_Invalid_shape_in_axis_d_d, sizeof(__pyx_k_Invalid_shape_in_axis_d_d), 0, 0, 1, 0}, + {&__pyx_n_s_MDAnalysis_lib_mdamath, __pyx_k_MDAnalysis_lib_mdamath, sizeof(__pyx_k_MDAnalysis_lib_mdamath), 0, 0, 1, 1}, + {&__pyx_n_s_MDAnalysis_lib_nsgrid, __pyx_k_MDAnalysis_lib_nsgrid, sizeof(__pyx_k_MDAnalysis_lib_nsgrid), 0, 0, 1, 1}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, + {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, + {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, + {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, + {&__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 0, 1, 0}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_kp_s_Pickling_of_struct_members_such, __pyx_k_Pickling_of_struct_members_such, sizeof(__pyx_k_Pickling_of_struct_members_such), 0, 0, 1, 0}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_View_MemoryView, __pyx_k_View_MemoryView, sizeof(__pyx_k_View_MemoryView), 0, 0, 1, 1}, + {&__pyx_n_s_allclose, __pyx_k_allclose, sizeof(__pyx_k_allclose), 0, 0, 1, 1}, + {&__pyx_n_s_allocate_buffer, __pyx_k_allocate_buffer, sizeof(__pyx_k_allocate_buffer), 0, 0, 1, 1}, + {&__pyx_n_s_asarray, __pyx_k_asarray, sizeof(__pyx_k_asarray), 0, 0, 1, 1}, + {&__pyx_n_s_astype, __pyx_k_astype, sizeof(__pyx_k_astype), 0, 0, 1, 1}, + {&__pyx_n_s_base, __pyx_k_base, sizeof(__pyx_k_base), 0, 0, 1, 1}, + {&__pyx_n_s_box, __pyx_k_box, sizeof(__pyx_k_box), 0, 0, 1, 1}, + {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, + {&__pyx_n_u_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 1, 0, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_kp_s_contiguous_and_direct, __pyx_k_contiguous_and_direct, sizeof(__pyx_k_contiguous_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_contiguous_and_indirect, __pyx_k_contiguous_and_indirect, sizeof(__pyx_k_contiguous_and_indirect), 0, 0, 1, 0}, + {&__pyx_n_s_coords, __pyx_k_coords, sizeof(__pyx_k_coords), 0, 0, 1, 1}, + {&__pyx_kp_s_coords_must_have_a_shape_of_n_3, __pyx_k_coords_must_have_a_shape_of_n_3, sizeof(__pyx_k_coords_must_have_a_shape_of_n_3), 0, 0, 1, 0}, + {&__pyx_n_s_copy, __pyx_k_copy, sizeof(__pyx_k_copy), 0, 0, 1, 1}, + {&__pyx_n_s_cutoff, __pyx_k_cutoff, sizeof(__pyx_k_cutoff), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_dtype_is_object, __pyx_k_dtype_is_object, sizeof(__pyx_k_dtype_is_object), 0, 0, 1, 1}, + {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, + {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 0, 0, 1, 1}, + {&__pyx_n_s_float32, __pyx_k_float32, sizeof(__pyx_k_float32), 0, 0, 1, 1}, + {&__pyx_n_s_force, __pyx_k_force, sizeof(__pyx_k_force), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 0, 1, 1}, + {&__pyx_n_u_fortran, __pyx_k_fortran, sizeof(__pyx_k_fortran), 0, 1, 0, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_k_got_differing_extents_in_dimensi, sizeof(__pyx_k_got_differing_extents_in_dimensi), 0, 0, 1, 0}, + {&__pyx_n_s_id, __pyx_k_id, sizeof(__pyx_k_id), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_int, __pyx_k_int, sizeof(__pyx_k_int), 0, 0, 1, 1}, + {&__pyx_n_s_int64, __pyx_k_int64, sizeof(__pyx_k_int64), 0, 0, 1, 1}, + {&__pyx_n_s_itemsize, __pyx_k_itemsize, sizeof(__pyx_k_itemsize), 0, 0, 1, 1}, + {&__pyx_kp_s_itemsize_0_for_cython_array, __pyx_k_itemsize_0_for_cython_array, sizeof(__pyx_k_itemsize_0_for_cython_array), 0, 0, 1, 0}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_max_gridsize, __pyx_k_max_gridsize, sizeof(__pyx_k_max_gridsize), 0, 0, 1, 1}, + {&__pyx_n_s_max_size, __pyx_k_max_size, sizeof(__pyx_k_max_size), 0, 0, 1, 1}, + {&__pyx_n_s_memview, __pyx_k_memview, sizeof(__pyx_k_memview), 0, 0, 1, 1}, + {&__pyx_n_s_mode, __pyx_k_mode, sizeof(__pyx_k_mode), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_ncoords, __pyx_k_ncoords, sizeof(__pyx_k_ncoords), 0, 0, 1, 1}, + {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, + {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, + {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, + {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, + {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, + {&__pyx_n_s_order, __pyx_k_order, sizeof(__pyx_k_order), 0, 0, 1, 1}, + {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, + {&__pyx_n_s_pbc, __pyx_k_pbc, sizeof(__pyx_k_pbc), 0, 0, 1, 1}, + {&__pyx_n_s_periodic, __pyx_k_periodic, sizeof(__pyx_k_periodic), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_getbuffer, __pyx_k_pyx_getbuffer, sizeof(__pyx_k_pyx_getbuffer), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_Enum, __pyx_k_pyx_unpickle_Enum, sizeof(__pyx_k_pyx_unpickle_Enum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_FastNS, __pyx_k_pyx_unpickle_FastNS, sizeof(__pyx_k_pyx_unpickle_FastNS), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_NSResults, __pyx_k_pyx_unpickle_NSResults, sizeof(__pyx_k_pyx_unpickle_NSResults), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_reshape, __pyx_k_reshape, sizeof(__pyx_k_reshape), 0, 0, 1, 1}, + {&__pyx_kp_s_search_coords_must_have_a_shape, __pyx_k_search_coords_must_have_a_shape, sizeof(__pyx_k_search_coords_must_have_a_shape), 0, 0, 1, 0}, + {&__pyx_n_s_searchcoords, __pyx_k_searchcoords, sizeof(__pyx_k_searchcoords), 0, 0, 1, 1}, + {&__pyx_kp_s_self_beadids_self_cellids_self_n, __pyx_k_self_beadids_self_cellids_self_n, sizeof(__pyx_k_self_beadids_self_cellids_self_n), 0, 0, 1, 0}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_sqrt, __pyx_k_sqrt, sizeof(__pyx_k_sqrt), 0, 0, 1, 1}, + {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1}, + {&__pyx_n_s_step, __pyx_k_step, sizeof(__pyx_k_step), 0, 0, 1, 1}, + {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1}, + {&__pyx_kp_s_strided_and_direct, __pyx_k_strided_and_direct, sizeof(__pyx_k_strided_and_direct), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_direct_or_indirect, __pyx_k_strided_and_direct_or_indirect, sizeof(__pyx_k_strided_and_direct_or_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_strided_and_indirect, __pyx_k_strided_and_indirect, sizeof(__pyx_k_strided_and_indirect), 0, 0, 1, 0}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_struct, __pyx_k_struct, sizeof(__pyx_k_struct), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_triclinic_vectors, __pyx_k_triclinic_vectors, sizeof(__pyx_k_triclinic_vectors), 0, 0, 1, 1}, + {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, + {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, + {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, + {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 172, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 225, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(0, 594, __pyx_L1_error) + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(2, 810, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 1000, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 150, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(1, 399, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(1, 608, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 827, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "MDAnalysis/lib/nsgrid.pyx":228 + * DIM, DIM, box.shape[0], box.shape[1])) + * if (box[XX, XX] == 0) or (box[YY, YY] == 0) or (box[ZZ, ZZ] == 0): + * raise ValueError("Box does not correspond to PBC=xyz") # <<<<<<<<<<<<<< + * self.fast_update(box) + * + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_Box_does_not_correspond_to_PBC_x); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 228, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_Pickling_of_struct_members_such); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "(tree fragment)":4 + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("Pickling of struct members such as self.c_pbcbox must be explicitly requested with @auto_pickle(True)") # <<<<<<<<<<<<<< + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_Pickling_of_struct_members_such); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + */ + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_self_beadids_self_cellids_self_n); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "(tree fragment)":4 + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("self.beadids,self.cellids,self.nbeads cannot be converted to a Python object for pickling") # <<<<<<<<<<<<<< + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_self_beadids_self_cellids_self_n); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "MDAnalysis/lib/nsgrid.pyx":772 + * "".format(coords.shape)) + * + * if np.allclose(box[:3], 0.0): # <<<<<<<<<<<<<< + * raise ValueError("Any of the box dimensions cannot be 0") + * + */ + __pyx_slice__6 = PySlice_New(Py_None, __pyx_int_3, Py_None); if (unlikely(!__pyx_slice__6)) __PYX_ERR(0, 772, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__6); + __Pyx_GIVEREF(__pyx_slice__6); + + /* "MDAnalysis/lib/nsgrid.pyx":773 + * + * if np.allclose(box[:3], 0.0): + * raise ValueError("Any of the box dimensions cannot be 0") # <<<<<<<<<<<<<< + * + * self.periodic = pbc + */ + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_Any_of_the_box_dimensions_cannot); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 773, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + + /* "MDAnalysis/lib/nsgrid.pyx":778 + * self.coords = coords.astype(np.float32, order='C', copy=True) + * + * if box.shape != (3, 3): # <<<<<<<<<<<<<< + * box = triclinic_vectors(box) + * + */ + __pyx_tuple__8 = PyTuple_Pack(2, __pyx_int_3, __pyx_int_3); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 778, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "MDAnalysis/lib/nsgrid.pyx":784 + * + * if cutoff < 0: + * raise ValueError("Cutoff must be positive!") # <<<<<<<<<<<<<< + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: + * raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_Cutoff_must_be_positive); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 784, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "MDAnalysis/lib/nsgrid.pyx":786 + * raise ValueError("Cutoff must be positive!") + * if cutoff * cutoff > self.box.c_pbcbox.max_cutoff2: + * raise ValueError("Cutoff greater than maximum cutoff ({:.3f}) given the PBC") # <<<<<<<<<<<<<< + * + * self.coords_bbox = self.box.fast_put_atoms_in_bbox(self.coords) + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Cutoff_greater_than_maximum_cuto); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 786, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(2, 229, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(2, 233, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(2, 263, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(2, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(2, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(2, 1000, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 1006, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(2, 1012, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + + /* "View.MemoryView":132 + * + * if not self.ndim: + * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< + * + * if itemsize <= 0: + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "View.MemoryView":135 + * + * if itemsize <= 0: + * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< + * + * if not isinstance(format, bytes): + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "View.MemoryView":138 + * + * if not isinstance(format, bytes): + * format = format.encode('ASCII') # <<<<<<<<<<<<<< + * self._format = format # keep a reference to the byte string + * self.format = self._format + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_n_s_ASCII); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "View.MemoryView":147 + * + * if not self._shape: + * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(1, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "View.MemoryView":175 + * self.data = malloc(self.len) + * if not self.data: + * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< + * + * if self.dtype_is_object: + */ + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + + /* "View.MemoryView":191 + * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS + * if not (flags & bufmode): + * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< + * info.buf = self.data + * info.len = self.len + */ + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(1, 191, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); + + /* "View.MemoryView":413 + * def __setitem__(memoryview self, object index, object value): + * if self.view.readonly: + * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< + * + * have_slices, index = _unellipsify(index, self.view.ndim) + */ + __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(1, 413, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + + /* "View.MemoryView":490 + * result = struct.unpack(self.view.format, bytesitem) + * except struct.error: + * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< + * else: + * if len(self.view.format) == 1: + */ + __pyx_tuple__29 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(1, 490, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + + /* "View.MemoryView":515 + * def __getbuffer__(self, Py_buffer *info, int flags): + * if flags & PyBUF_WRITABLE and self.view.readonly: + * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< + * + * if flags & PyBUF_STRIDES: + */ + __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(1, 515, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + + /* "View.MemoryView":565 + * if self.view.strides == NULL: + * + * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< + * + * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) + */ + __pyx_tuple__31 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(1, 565, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__31); + __Pyx_GIVEREF(__pyx_tuple__31); + + /* "View.MemoryView":572 + * def suboffsets(self): + * if self.view.suboffsets == NULL: + * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< + * + * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) + */ + __pyx_tuple__32 = PyTuple_New(1); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(1, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__32); + __Pyx_INCREF(__pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_int_neg_1); + PyTuple_SET_ITEM(__pyx_tuple__32, 0, __pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_tuple__32); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__33 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__33); + __Pyx_GIVEREF(__pyx_tuple__33); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__34); + __Pyx_GIVEREF(__pyx_tuple__34); + + /* "View.MemoryView":677 + * if item is Ellipsis: + * if not seen_ellipsis: + * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< + * seen_ellipsis = True + * else: + */ + __pyx_slice__35 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__35)) __PYX_ERR(1, 677, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__35); + __Pyx_GIVEREF(__pyx_slice__35); + + /* "View.MemoryView":680 + * seen_ellipsis = True + * else: + * result.append(slice(None)) # <<<<<<<<<<<<<< + * have_slices = True + * else: + */ + __pyx_slice__36 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__36)) __PYX_ERR(1, 680, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__36); + __Pyx_GIVEREF(__pyx_slice__36); + + /* "View.MemoryView":691 + * nslices = ndim - len(result) + * if nslices: + * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< + * + * return have_slices or nslices, tuple(result) + */ + __pyx_slice__37 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__37)) __PYX_ERR(1, 691, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__37); + __Pyx_GIVEREF(__pyx_slice__37); + + /* "View.MemoryView":698 + * for suboffset in suboffsets[:ndim]: + * if suboffset >= 0: + * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__38 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(1, 698, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__39); + __Pyx_GIVEREF(__pyx_tuple__39); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__40 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__40); + __Pyx_GIVEREF(__pyx_tuple__40); + + /* "(tree fragment)":1 + * def __pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0x294c292: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_tuple__41 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__41); + __Pyx_GIVEREF(__pyx_tuple__41); + __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__41, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_NSResults, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(1, 1, __pyx_L1_error) + __pyx_tuple__43 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__43); + __Pyx_GIVEREF(__pyx_tuple__43); + __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__43, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_FastNS, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(1, 1, __pyx_L1_error) + + /* "View.MemoryView":285 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_tuple__45 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(1, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__45); + __Pyx_GIVEREF(__pyx_tuple__45); + + /* "View.MemoryView":286 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_tuple__46 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(1, 286, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__46); + __Pyx_GIVEREF(__pyx_tuple__46); + + /* "View.MemoryView":287 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__47 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(1, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__47); + __Pyx_GIVEREF(__pyx_tuple__47); + + /* "View.MemoryView":290 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_tuple__48 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(1, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__48); + __Pyx_GIVEREF(__pyx_tuple__48); + + /* "View.MemoryView":291 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_tuple__49 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(1, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__49); + __Pyx_GIVEREF(__pyx_tuple__49); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_tuple__50 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__50); + __Pyx_GIVEREF(__pyx_tuple__50); + __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__50, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_float_0_0 = PyFloat_FromDouble(0.0); if (unlikely(!__pyx_float_0_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_5000 = PyInt_FromLong(5000); if (unlikely(!__pyx_int_5000)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_43303570 = PyInt_FromLong(43303570L); if (unlikely(!__pyx_int_43303570)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_221827040 = PyInt_FromLong(221827040L); if (unlikely(!__pyx_int_221827040)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_modinit_global_init_code(void); /*proto*/ +static int __Pyx_modinit_variable_export_code(void); /*proto*/ +static int __Pyx_modinit_function_export_code(void); /*proto*/ +static int __Pyx_modinit_type_init_code(void); /*proto*/ +static int __Pyx_modinit_type_import_code(void); /*proto*/ +static int __Pyx_modinit_variable_import_code(void); /*proto*/ +static int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + generic = Py_None; Py_INCREF(Py_None); + strided = Py_None; Py_INCREF(Py_None); + indirect = Py_None; Py_INCREF(Py_None); + contiguous = Py_None; Py_INCREF(Py_None); + indirect_contiguous = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_PBCBox = &__pyx_vtable_10MDAnalysis_3lib_6nsgrid_PBCBox; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_PBCBox.fast_update = (void (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __Pyx_memviewslice))__pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_update; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_PBCBox.fast_pbc_dx = (void (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *))__pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_pbc_dx; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_PBCBox.fast_distance2 = (__pyx_t_10MDAnalysis_3lib_6nsgrid_real (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *))__pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_distance2; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_PBCBox.fast_put_atoms_in_bbox = (__Pyx_memviewslice (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_PBCBox *, __Pyx_memviewslice))__pyx_f_10MDAnalysis_3lib_6nsgrid_6PBCBox_fast_put_atoms_in_bbox; + if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox) < 0) __PYX_ERR(0, 119, __pyx_L1_error) + __pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox.tp_dictoffset && __pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #if CYTHON_COMPILING_IN_CPYTHON + { + PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox, "__init__"); if (unlikely(!wrapper)) __PYX_ERR(0, 119, __pyx_L1_error) + if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) { + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__ = *((PyWrapperDescrObject *)wrapper)->d_base; + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__.doc = __pyx_doc_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__; + ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6PBCBox___init__; + } + } + #endif + if (__Pyx_SetVtable(__pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox.tp_dict, __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_PBCBox) < 0) __PYX_ERR(0, 119, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "PBCBox", (PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox) < 0) __PYX_ERR(0, 119, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox) < 0) __PYX_ERR(0, 119, __pyx_L1_error) + __pyx_ptype_10MDAnalysis_3lib_6nsgrid_PBCBox = &__pyx_type_10MDAnalysis_3lib_6nsgrid_PBCBox; + __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSResults = &__pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSResults; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSResults.add_neighbors = (void (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int, __pyx_t_10MDAnalysis_3lib_6nsgrid_real))__pyx_f_10MDAnalysis_3lib_6nsgrid_9NSResults_add_neighbors; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSResults.create_buffers = (void (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSResults *))__pyx_f_10MDAnalysis_3lib_6nsgrid_9NSResults_create_buffers; + if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults) < 0) __PYX_ERR(0, 310, __pyx_L1_error) + __pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults.tp_dictoffset && __pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #if CYTHON_COMPILING_IN_CPYTHON + { + PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults, "__init__"); if (unlikely(!wrapper)) __PYX_ERR(0, 310, __pyx_L1_error) + if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) { + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_9NSResults___init__ = *((PyWrapperDescrObject *)wrapper)->d_base; + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_9NSResults___init__.doc = __pyx_doc_10MDAnalysis_3lib_6nsgrid_9NSResults___init__; + ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_9NSResults___init__; + } + } + #endif + if (__Pyx_SetVtable(__pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults.tp_dict, __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSResults) < 0) __PYX_ERR(0, 310, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "NSResults", (PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults) < 0) __PYX_ERR(0, 310, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults) < 0) __PYX_ERR(0, 310, __pyx_L1_error) + __pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSResults = &__pyx_type_10MDAnalysis_3lib_6nsgrid_NSResults; + __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSGrid = &__pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSGrid; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSGrid.coord2cellid = (__pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *, __pyx_t_10MDAnalysis_3lib_6nsgrid_real *))__pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_coord2cellid; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSGrid.cellid2cellxyz = (int (*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int, __pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int *))__pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_cellid2cellxyz; + __pyx_vtable_10MDAnalysis_3lib_6nsgrid_NSGrid.fill_grid = (PyObject *(*)(struct __pyx_obj_10MDAnalysis_3lib_6nsgrid_NSGrid *, __Pyx_memviewslice))__pyx_f_10MDAnalysis_3lib_6nsgrid_6NSGrid_fill_grid; + if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid) < 0) __PYX_ERR(0, 510, __pyx_L1_error) + __pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid.tp_dictoffset && __pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #if CYTHON_COMPILING_IN_CPYTHON + { + PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid, "__init__"); if (unlikely(!wrapper)) __PYX_ERR(0, 510, __pyx_L1_error) + if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) { + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__ = *((PyWrapperDescrObject *)wrapper)->d_base; + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__.doc = __pyx_doc_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__; + ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6NSGrid___init__; + } + } + #endif + if (__Pyx_SetVtable(__pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid.tp_dict, __pyx_vtabptr_10MDAnalysis_3lib_6nsgrid_NSGrid) < 0) __PYX_ERR(0, 510, __pyx_L1_error) + if (PyObject_SetAttrString(__pyx_m, "NSGrid", (PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid) < 0) __PYX_ERR(0, 510, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid) < 0) __PYX_ERR(0, 510, __pyx_L1_error) + __pyx_ptype_10MDAnalysis_3lib_6nsgrid_NSGrid = &__pyx_type_10MDAnalysis_3lib_6nsgrid_NSGrid; + if (PyType_Ready(&__pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS) < 0) __PYX_ERR(0, 686, __pyx_L1_error) + __pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS.tp_dictoffset && __pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + #if CYTHON_COMPILING_IN_CPYTHON + { + PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS, "__init__"); if (unlikely(!wrapper)) __PYX_ERR(0, 686, __pyx_L1_error) + if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) { + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6FastNS___init__ = *((PyWrapperDescrObject *)wrapper)->d_base; + __pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6FastNS___init__.doc = __pyx_doc_10MDAnalysis_3lib_6nsgrid_6FastNS___init__; + ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_10MDAnalysis_3lib_6nsgrid_6FastNS___init__; + } + } + #endif + if (PyObject_SetAttrString(__pyx_m, "FastNS", (PyObject *)&__pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS) < 0) __PYX_ERR(0, 686, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS) < 0) __PYX_ERR(0, 686, __pyx_L1_error) + __pyx_ptype_10MDAnalysis_3lib_6nsgrid_FastNS = &__pyx_type_10MDAnalysis_3lib_6nsgrid_FastNS; + __pyx_vtabptr_array = &__pyx_vtable_array; + __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; + if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(1, 104, __pyx_L1_error) + __pyx_type___pyx_array.tp_print = 0; + if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(1, 104, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(1, 104, __pyx_L1_error) + __pyx_array_type = &__pyx_type___pyx_array; + if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(1, 278, __pyx_L1_error) + __pyx_type___pyx_MemviewEnum.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_MemviewEnum.tp_dictoffset && __pyx_type___pyx_MemviewEnum.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_MemviewEnum.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(1, 278, __pyx_L1_error) + __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; + __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; + __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; + __pyx_vtable_memoryview.is_slice = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_is_slice; + __pyx_vtable_memoryview.setitem_slice_assignment = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_slice_assignment; + __pyx_vtable_memoryview.setitem_slice_assign_scalar = (PyObject *(*)(struct __pyx_memoryview_obj *, struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_setitem_slice_assign_scalar; + __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; + __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; + __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; + if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(1, 329, __pyx_L1_error) + __pyx_type___pyx_memoryview.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryview.tp_dictoffset && __pyx_type___pyx_memoryview.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_memoryview.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(1, 329, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(1, 329, __pyx_L1_error) + __pyx_memoryview_type = &__pyx_type___pyx_memoryview; + __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; + __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; + __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; + __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; + __pyx_type___pyx_memoryviewslice.tp_base = __pyx_memoryview_type; + if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(1, 960, __pyx_L1_error) + __pyx_type___pyx_memoryviewslice.tp_print = 0; + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryviewslice.tp_dictoffset && __pyx_type___pyx_memoryviewslice.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type___pyx_memoryviewslice.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(1, 960, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(1, 960, __pyx_L1_error) + __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(3, 9, __pyx_L1_error) + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) __PYX_ERR(2, 164, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) __PYX_ERR(2, 186, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) __PYX_ERR(2, 190, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) __PYX_ERR(2, 199, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) __PYX_ERR(2, 872, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#if PY_MAJOR_VERSION < 3 +#ifdef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC void +#else +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#endif +#else +#ifdef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#endif +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initnsgrid(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initnsgrid(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_nsgrid(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_nsgrid(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + result = PyDict_SetItemString(moddict, to_name, value); + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__") < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__") < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static int __pyx_pymod_exec_nsgrid(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + static PyThread_type_lock __pyx_t_2[8]; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m && __pyx_m == __pyx_pyinit_module) return 0; + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_nsgrid(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("nsgrid", __pyx_methods, __pyx_k_Neighbor_search_library_mod_MDA, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_MDAnalysis__lib__nsgrid) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "MDAnalysis.lib.nsgrid")) { + if (unlikely(PyDict_SetItemString(modules, "MDAnalysis.lib.nsgrid", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely(__Pyx_modinit_type_init_code() != 0)) goto __pyx_L1_error; + if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "MDAnalysis/lib/nsgrid.pyx":78 + * from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free + * from libc.math cimport sqrt + * import numpy as np # <<<<<<<<<<<<<< + * from libcpp.vector cimport vector + * cimport numpy as np + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_NSResults(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0x294c292: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6nsgrid_1__pyx_unpickle_NSResults, NULL, __pyx_n_s_MDAnalysis_lib_nsgrid); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_NSResults, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":9 + * __pyx_unpickle_NSResults__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_NSResults__set_state(NSResults __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.coords = __pyx_state[0]; __pyx_result.cutoff = __pyx_state[1]; __pyx_result.distances_buffer = __pyx_state[2]; __pyx_result.indices_buffer = __pyx_state[3]; __pyx_result.npairs = __pyx_state[4]; __pyx_result.pair_distances2_buffer = __pyx_state[5]; __pyx_result.pair_distances_buffer = __pyx_state[6]; __pyx_result.pairs_buffer = __pyx_state[7]; __pyx_result.searchcoords = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6nsgrid_3__pyx_unpickle_FastNS, NULL, __pyx_n_s_MDAnalysis_lib_nsgrid); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_FastNS, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "MDAnalysis/lib/nsgrid.pyx":1 + * # -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; -*- # <<<<<<<<<<<<<< + * # vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 + * # + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "View.MemoryView":208 + * info.obj = self + * + * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * def __dealloc__(array self): + */ + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 208, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(1, 208, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + PyType_Modified(__pyx_array_type); + + /* "View.MemoryView":285 + * return self.name + * + * cdef generic = Enum("") # <<<<<<<<<<<<<< + * cdef strided = Enum("") # default + * cdef indirect = Enum("") + */ + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__45, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 285, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(generic); + __Pyx_DECREF_SET(generic, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":286 + * + * cdef generic = Enum("") + * cdef strided = Enum("") # default # <<<<<<<<<<<<<< + * cdef indirect = Enum("") + * + */ + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__46, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 286, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(strided); + __Pyx_DECREF_SET(strided, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":287 + * cdef generic = Enum("") + * cdef strided = Enum("") # default + * cdef indirect = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__47, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(indirect); + __Pyx_DECREF_SET(indirect, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":290 + * + * + * cdef contiguous = Enum("") # <<<<<<<<<<<<<< + * cdef indirect_contiguous = Enum("") + * + */ + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__48, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(contiguous); + __Pyx_DECREF_SET(contiguous, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":291 + * + * cdef contiguous = Enum("") + * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__49, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 291, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(indirect_contiguous); + __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "View.MemoryView":315 + * + * DEF THREAD_LOCKS_PREALLOCATED = 8 + * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< + * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ + * PyThread_allocate_lock(), + */ + __pyx_memoryview_thread_locks_used = 0; + + /* "View.MemoryView":316 + * DEF THREAD_LOCKS_PREALLOCATED = 8 + * cdef int __pyx_memoryview_thread_locks_used = 0 + * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< + * PyThread_allocate_lock(), + * PyThread_allocate_lock(), + */ + __pyx_t_2[0] = PyThread_allocate_lock(); + __pyx_t_2[1] = PyThread_allocate_lock(); + __pyx_t_2[2] = PyThread_allocate_lock(); + __pyx_t_2[3] = PyThread_allocate_lock(); + __pyx_t_2[4] = PyThread_allocate_lock(); + __pyx_t_2[5] = PyThread_allocate_lock(); + __pyx_t_2[6] = PyThread_allocate_lock(); + __pyx_t_2[7] = PyThread_allocate_lock(); + memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_2, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); + + /* "View.MemoryView":544 + * info.obj = self + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 544, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(1, 544, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + PyType_Modified(__pyx_memoryview_type); + + /* "View.MemoryView":990 + * return self.from_object + * + * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 990, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(1, 990, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + PyType_Modified(__pyx_memoryviewslice_type); + + /* "(tree fragment)":1 + * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * if __pyx_checksum != 0xb068931: + * from pickle import PickleError as __pyx_PickleError + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_15View_dot_MemoryView_1__pyx_unpickle_Enum, NULL, __pyx_n_s_View_MemoryView); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_Enum, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":9 + * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0] + * if len(__pyx_state) > 1 and hasattr(__pyx_result, '__dict__'): + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init MDAnalysis.lib.nsgrid", 0, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init MDAnalysis.lib.nsgrid"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* PyCFunctionFastCall */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL +#include "frameobject.h" +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = f->f_localsplus; + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* MemviewSliceInit */ +static int +__Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, + int ndim, + __Pyx_memviewslice *memviewslice, + int memview_is_new_reference) +{ + __Pyx_RefNannyDeclarations + int i, retval=-1; + Py_buffer *buf = &memview->view; + __Pyx_RefNannySetupContext("init_memviewslice", 0); + if (!buf) { + PyErr_SetString(PyExc_ValueError, + "buf is NULL."); + goto fail; + } else if (memviewslice->memview || memviewslice->data) { + PyErr_SetString(PyExc_ValueError, + "memviewslice is already initialized!"); + goto fail; + } + if (buf->strides) { + for (i = 0; i < ndim; i++) { + memviewslice->strides[i] = buf->strides[i]; + } + } else { + Py_ssize_t stride = buf->itemsize; + for (i = ndim - 1; i >= 0; i--) { + memviewslice->strides[i] = stride; + stride *= buf->shape[i]; + } + } + for (i = 0; i < ndim; i++) { + memviewslice->shape[i] = buf->shape[i]; + if (buf->suboffsets) { + memviewslice->suboffsets[i] = buf->suboffsets[i]; + } else { + memviewslice->suboffsets[i] = -1; + } + } + memviewslice->memview = memview; + memviewslice->data = (char *)buf->buf; + if (__pyx_add_acquisition_count(memview) == 0 && !memview_is_new_reference) { + Py_INCREF(memview); + } + retval = 0; + goto no_fail; +fail: + memviewslice->memview = 0; + memviewslice->data = 0; + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} +#ifndef Py_NO_RETURN +#define Py_NO_RETURN +#endif +static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { + va_list vargs; + char msg[200]; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + vsnprintf(msg, 200, fmt, vargs); + va_end(vargs); + Py_FatalError(msg); +} +static CYTHON_INLINE int +__pyx_add_acquisition_count_locked(__pyx_atomic_int *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)++; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE int +__pyx_sub_acquisition_count_locked(__pyx_atomic_int *acquisition_count, + PyThread_type_lock lock) +{ + int result; + PyThread_acquire_lock(lock, 1); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + int first_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (!memview || (PyObject *) memview == Py_None) + return; + if (__pyx_get_slice_count(memview) < 0) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + first_time = __pyx_add_acquisition_count(memview) == 0; + if (first_time) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); + } + } +} +static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + int last_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (!memview ) { + return; + } else if ((PyObject *) memview == Py_None) { + memslice->memview = NULL; + return; + } + if (__pyx_get_slice_count(memview) <= 0) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + last_time = __pyx_sub_acquisition_count(memview) == 1; + memslice->data = NULL; + if (last_time) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); + } + } else { + memslice->memview = NULL; + } +} + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* WriteUnraisableException */ +static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, + CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, + int full_traceback, CYTHON_UNUSED int nogil) { + PyObject *old_exc, *old_val, *old_tb; + PyObject *ctx; + __Pyx_PyThreadState_declare +#ifdef WITH_THREAD + PyGILState_STATE state; + if (nogil) + state = PyGILState_Ensure(); +#ifdef _MSC_VER + else state = (PyGILState_STATE)-1; +#endif +#endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); + if (full_traceback) { + Py_XINCREF(old_exc); + Py_XINCREF(old_val); + Py_XINCREF(old_tb); + __Pyx_ErrRestore(old_exc, old_val, old_tb); + PyErr_PrintEx(1); + } + #if PY_MAJOR_VERSION < 3 + ctx = PyString_FromString(name); + #else + ctx = PyUnicode_FromString(name); + #endif + __Pyx_ErrRestore(old_exc, old_val, old_tb); + if (!ctx) { + PyErr_WriteUnraisable(Py_None); + } else { + PyErr_WriteUnraisable(ctx); + Py_DECREF(ctx); + } +#ifdef WITH_THREAD + if (nogil) + PyGILState_Release(state); +#endif +} + +/* GetModuleGlobalName */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + if (likely(result)) { + Py_INCREF(result); + } else if (unlikely(PyErr_Occurred())) { + result = NULL; + } else { +#else + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +/* PyErrExceptionMatches */ + #if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; icurexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + if (unlikely(PyTuple_Check(err))) + return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* GetAttr */ + static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetAttr3 */ + static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r = __Pyx_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +} + +/* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", + name, type->tp_name, Py_TYPE(obj)->tp_name); + return 0; +} + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ + static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* GetItemInt */ + static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* SliceObject */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + PyErr_Format(PyExc_TypeError, + "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); +bad: + return NULL; +} + +/* HasAttr */ + static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (unlikely(!r)) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +/* DictGetItem */ + #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) + PyErr_SetObject(PyExc_KeyError, args); + Py_XDECREF(args); + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* RaiseTooManyValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ + static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* SaveResetException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if PY_VERSION_HEX >= 0x030700A3 + *type = tstate->exc_state.exc_type; + *value = tstate->exc_state.exc_value; + *tb = tstate->exc_state.exc_traceback; + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + #endif + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = type; + tstate->exc_state.exc_value = value; + tstate->exc_state.exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* GetException */ + #if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { +#endif + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = local_type; + tstate->exc_state.exc_value = local_value; + tstate->exc_state.exc_traceback = local_tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* BytesEquals */ + static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ + static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* ObjectGetItem */ + #if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { + PyObject *runerr; + Py_ssize_t key_value; + PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; + if (unlikely(!(m && m->sq_item))) { + PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); + return NULL; + } + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { + PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; + if (likely(m && m->mp_subscript)) { + return m->mp_subscript(obj, key); + } + return __Pyx_PyObject_GetIndex(obj, key); +} +#endif + +/* decode_c_string */ + static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { + Py_ssize_t length; + if (unlikely((start < 0) | (stop < 0))) { + size_t slen = strlen(cstring); + if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, + "c-string too long to convert to Python"); + return NULL; + } + length = (Py_ssize_t) slen; + if (start < 0) { + start += length; + if (start < 0) + start = 0; + } + if (stop < 0) + stop += length; + } + length = stop - start; + if (unlikely(length <= 0)) + return PyUnicode_FromUnicode(NULL, 0); + cstring += start; + if (decode_func) { + return decode_func(cstring, length, errors); + } else { + return PyUnicode_Decode(cstring, length, encoding, errors); + } +} + +/* SwapException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if PY_VERSION_HEX >= 0x030700A3 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = *type; + tstate->exc_state.exc_value = *value; + tstate->exc_state.exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; +#ifdef HAVE_LONG_LONG + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; +#endif + const digit* digits = ((PyLongObject*)op1)->ob_digit; + const Py_ssize_t size = Py_SIZE(op1); + if (likely(__Pyx_sst_abs(size) <= 1)) { + a = likely(size) ? digits[0] : 0; + if (size == -1) a = -a; + } else { + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; +#ifdef HAVE_LONG_LONG + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; +#endif + } + CYTHON_FALLTHROUGH; + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); +#ifdef HAVE_LONG_LONG + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); +#endif + + + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; + double a = PyFloat_AS_DOUBLE(op1); + double result; + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* None */ + static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* PyObject_GenericGetAttrNoDict */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'%.50s' object has no attribute '%U'", + tp->tp_name, attr_name); +#else + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(attr_name)); +#endif + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ + #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* SetVTable */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX >= 0x02070000 + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#else + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* SetupReduce */ + static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name_2); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; +#else + if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; +#endif +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; + setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto GOOD; +BAD: + if (!PyErr_Occurred()) + PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); + ret = -1; +GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} + +/* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + use_cline = __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback); + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (PyObject_Not(use_cline) != 0) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ + static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); + if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); + PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if ((0)) {} + else if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); + view->obj = NULL; + Py_DECREF(obj); +} +#endif + + + /* MemviewSliceIsContig */ + static int +__pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) +{ + int i, index, step, start; + Py_ssize_t itemsize = mvs.memview->view.itemsize; + if (order == 'F') { + step = 1; + start = 0; + } else { + step = -1; + start = ndim - 1; + } + for (i = 0; i < ndim; i++) { + index = start + step * i; + if (mvs.suboffsets[index] >= 0 || mvs.strides[index] != itemsize) + return 0; + itemsize *= mvs.shape[index]; + } + return 1; +} + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* Capsule */ + static CYTHON_INLINE PyObject * +__pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) +{ + PyObject *cobj; +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(p, sig, NULL); +#else + cobj = PyCObject_FromVoidPtr(p, NULL); +#endif + return cobj; +} + +/* MemviewDtypeToObject */ + static CYTHON_INLINE PyObject *__pyx_memview_get_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(const char *itemp) { + return (PyObject *) PyFloat_FromDouble(*(__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) itemp); +} +static CYTHON_INLINE int __pyx_memview_set_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(const char *itemp, PyObject *obj) { + __pyx_t_10MDAnalysis_3lib_6nsgrid_real value = __pyx_PyFloat_AsFloat(obj); + if ((value == ((npy_float32)-1)) && PyErr_Occurred()) + return 0; + *(__pyx_t_10MDAnalysis_3lib_6nsgrid_real *) itemp = value; + return 1; +} + +/* IsLittleEndian */ + static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) +{ + union { + uint32_t u32; + uint8_t u8[4]; + } S; + S.u32 = 0x01020304; + return S.u8[0] == 4; +} + +/* BufferFormatCheck */ + static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t < '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparseable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static PyObject * +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number; + int ndim = ctx->head->field->type->ndim; +; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) + return PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + if (*ts != ',' && *ts != ')') + return PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + if (*ts == ',') ts++; + i++; + } + if (i != ndim) + return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return NULL; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return Py_None; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_Is_Little_Endian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + CYTHON_FALLTHROUGH; + case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if (ctx->enc_type == *ts && got_Z == ctx->is_complex && + ctx->enc_packmode == ctx->new_packmode) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + CYTHON_FALLTHROUGH; + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (buf->strides[dim] != sizeof(void *)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (buf->strides[dim] != buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (stride < buf->itemsize) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (spec & (__Pyx_MEMVIEW_PTR)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (buf->suboffsets) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) +{ + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (buf->suboffsets && buf->suboffsets[dim] >= 0) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (!buf->suboffsets || (buf->suboffsets && buf->suboffsets[dim] < 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) + { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (stride * buf->itemsize != buf->strides[i] && + buf->shape[i] > 1) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) +{ + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (buf->ndim != ndim) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if ((unsigned) buf->itemsize != dtype->size) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (!__pyx_check_strides(buf, i, ndim, spec)) + goto fail; + if (!__pyx_check_suboffsets(buf, i, ndim, spec)) + goto fail; + } + if (buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_d_dc_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_FOLLOW), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_CONTIG) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, __Pyx_IS_C_CONTIG, + (PyBUF_C_CONTIGUOUS | PyBUF_FORMAT) | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_real, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_long(npy_long value) { + const npy_long neg_one = (npy_long) -1, const_zero = (npy_long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(npy_long), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = 1.0 / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = 1.0 / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0, -1); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = 1.0 / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = 1.0 / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0, -1); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); + } +} + +/* MemviewSliceCopyTemplate */ + static __Pyx_memviewslice +__pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, + const char *mode, int ndim, + size_t sizeof_dtype, int contig_flag, + int dtype_is_object) +{ + __Pyx_RefNannyDeclarations + int i; + __Pyx_memviewslice new_mvs = { 0, 0, { 0 }, { 0 }, { 0 } }; + struct __pyx_memoryview_obj *from_memview = from_mvs->memview; + Py_buffer *buf = &from_memview->view; + PyObject *shape_tuple = NULL; + PyObject *temp_int = NULL; + struct __pyx_array_obj *array_obj = NULL; + struct __pyx_memoryview_obj *memview_obj = NULL; + __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); + for (i = 0; i < ndim; i++) { + if (from_mvs->suboffsets[i] >= 0) { + PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " + "indirect dimensions (axis %d)", i); + goto fail; + } + } + shape_tuple = PyTuple_New(ndim); + if (unlikely(!shape_tuple)) { + goto fail; + } + __Pyx_GOTREF(shape_tuple); + for(i = 0; i < ndim; i++) { + temp_int = PyInt_FromSsize_t(from_mvs->shape[i]); + if(unlikely(!temp_int)) { + goto fail; + } else { + PyTuple_SET_ITEM(shape_tuple, i, temp_int); + temp_int = NULL; + } + } + array_obj = __pyx_array_new(shape_tuple, sizeof_dtype, buf->format, (char *) mode, NULL); + if (unlikely(!array_obj)) { + goto fail; + } + __Pyx_GOTREF(array_obj); + memview_obj = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + (PyObject *) array_obj, contig_flag, + dtype_is_object, + from_mvs->memview->typeinfo); + if (unlikely(!memview_obj)) + goto fail; + if (unlikely(__Pyx_init_memviewslice(memview_obj, ndim, &new_mvs, 1) < 0)) + goto fail; + if (unlikely(__pyx_memoryview_copy_contents(*from_mvs, new_mvs, ndim, ndim, + dtype_is_object) < 0)) + goto fail; + goto no_fail; +fail: + __Pyx_XDECREF(new_mvs.memview); + new_mvs.memview = NULL; + new_mvs.data = NULL; +no_fail: + __Pyx_XDECREF(shape_tuple); + __Pyx_XDECREF(temp_int); + __Pyx_XDECREF(array_obj); + __Pyx_RefNannyFinishContext(); + return new_mvs; +} + +/* CIntFromPy */ + static CYTHON_INLINE npy_long __Pyx_PyInt_As_npy_long(PyObject *x) { + const npy_long neg_one = (npy_long) -1, const_zero = (npy_long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(npy_long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(npy_long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (npy_long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_long) 0; + case 1: __PYX_VERIFY_RETURN_INT(npy_long, digit, digits[0]) + case 2: + if (8 * sizeof(npy_long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) >= 2 * PyLong_SHIFT) { + return (npy_long) (((((npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(npy_long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) >= 3 * PyLong_SHIFT) { + return (npy_long) (((((((npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(npy_long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) >= 4 * PyLong_SHIFT) { + return (npy_long) (((((((((npy_long)digits[3]) << PyLong_SHIFT) | (npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(npy_long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_long) 0; + case -1: __PYX_VERIFY_RETURN_INT(npy_long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(npy_long, digit, +digits[0]) + case -2: + if (8 * sizeof(npy_long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) - 1 > 2 * PyLong_SHIFT) { + return (npy_long) (((npy_long)-1)*(((((npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(npy_long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) - 1 > 2 * PyLong_SHIFT) { + return (npy_long) ((((((npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(npy_long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) - 1 > 3 * PyLong_SHIFT) { + return (npy_long) (((npy_long)-1)*(((((((npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(npy_long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) - 1 > 3 * PyLong_SHIFT) { + return (npy_long) ((((((((npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(npy_long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) - 1 > 4 * PyLong_SHIFT) { + return (npy_long) (((npy_long)-1)*(((((((((npy_long)digits[3]) << PyLong_SHIFT) | (npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(npy_long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_long) - 1 > 4 * PyLong_SHIFT) { + return (npy_long) ((((((((((npy_long)digits[3]) << PyLong_SHIFT) | (npy_long)digits[2]) << PyLong_SHIFT) | (npy_long)digits[1]) << PyLong_SHIFT) | (npy_long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(npy_long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + npy_long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (npy_long) -1; + } + } else { + npy_long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (npy_long) -1; + val = __Pyx_PyInt_As_npy_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to npy_long"); + return (npy_long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to npy_long"); + return (npy_long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { + const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(size_t) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (size_t) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { + return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { + return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { + return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (size_t) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(size_t) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) + case -2: + if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + } +#endif + if (sizeof(size_t) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + size_t val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (size_t) -1; + } + } else { + size_t val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (size_t) -1; + val = __Pyx_PyInt_As_size_t(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to size_t"); + return (size_t) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to size_t"); + return (size_t) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { + const char neg_one = (char) -1, const_zero = (char) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(char) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (char) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case 1: __PYX_VERIFY_RETURN_INT(char, digit, digits[0]) + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 2 * PyLong_SHIFT) { + return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 3 * PyLong_SHIFT) { + return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) >= 4 * PyLong_SHIFT) { + return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (char) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(char) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (char) 0; + case -1: __PYX_VERIFY_RETURN_INT(char, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(char, digit, +digits[0]) + case -2: + if (8 * sizeof(char) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(char) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(char) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(char) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + } +#endif + if (sizeof(char) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (char) -1; + } + } else { + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; +} + +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 1, + &__Pyx_TypeInfo_nn___pyx_t_10MDAnalysis_3lib_6nsgrid_ns_int, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; +} + +/* CheckBinaryVersion */ + static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* ModuleImport */ + #ifndef __PYX_HAVE_RT_ImportModule +#define __PYX_HAVE_RT_ImportModule +static PyObject *__Pyx_ImportModule(const char *name) { + PyObject *py_name = 0; + PyObject *py_module = 0; + py_name = __Pyx_PyIdentifier_FromString(name); + if (!py_name) + goto bad; + py_module = PyImport_Import(py_name); + Py_DECREF(py_name); + return py_module; +bad: + Py_XDECREF(py_name); + return 0; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, + size_t size, int strict) +{ + PyObject *py_module = 0; + PyObject *result = 0; + PyObject *py_name = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + py_module = __Pyx_ImportModule(module_name); + if (!py_module) + goto bad; + py_name = __Pyx_PyIdentifier_FromString(class_name); + if (!py_name) + goto bad; + result = PyObject_GetAttr(py_module, py_name); + Py_DECREF(py_name); + py_name = 0; + Py_DECREF(py_module); + py_module = 0; + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (!strict && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + else if ((size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +/* InitStrings */ + static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/package/MDAnalysis/lib/qcprot.c b/package/MDAnalysis/lib/qcprot.c index 049857b3a93..c268ef9be1d 100644 --- a/package/MDAnalysis/lib/qcprot.c +++ b/package/MDAnalysis/lib/qcprot.c @@ -1,11 +1,11 @@ -/* Generated by Cython 0.28.2 */ +/* Generated by Cython 0.28.5 */ /* BEGIN: Cython Metadata { "distutils": { "depends": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h" + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h", + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include/numpy/ufuncobject.h" ], "extra_compile_args": [ "-std=c99", @@ -14,7 +14,7 @@ "-funroll-loops" ], "include_dirs": [ - "/home/richard/miniconda2/envs/mda3/lib/python3.6/site-packages/numpy/core/include" + "/Users/richardgowers/miniconda3/envs/mda/lib/python3.6/site-packages/numpy/core/include" ], "name": "MDAnalysis.lib.qcprot", "sources": [ @@ -32,7 +32,7 @@ END: Cython Metadata */ #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else -#define CYTHON_ABI "0_28_2" +#define CYTHON_ABI "0_28_5" #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof @@ -478,6 +478,7 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact + #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) @@ -675,7 +676,7 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ @@ -783,7 +784,7 @@ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime; +static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; @@ -857,7 +858,7 @@ typedef struct { } __Pyx_BufFmt_Context; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":730 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -866,7 +867,7 @@ typedef struct { */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":731 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -875,7 +876,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -884,7 +885,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -893,7 +894,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":737 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -902,7 +903,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":738 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -911,7 +912,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -920,7 +921,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -929,7 +930,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":744 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -938,7 +939,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":745 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -947,7 +948,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -956,7 +957,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -965,7 +966,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":756 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -974,7 +975,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -983,7 +984,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":759 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -992,7 +993,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1001,7 +1002,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1010,7 +1011,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":763 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1019,7 +1020,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1028,7 +1029,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1037,7 +1038,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":767 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1072,7 +1073,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do /*--- Type declarations ---*/ -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":769 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1081,7 +1082,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1090,7 +1091,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1099,7 +1100,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -1354,6 +1355,9 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) @@ -1623,6 +1627,7 @@ static const char __pyx_k_yz[] = "yz"; static const char __pyx_k_z1[] = "z1"; static const char __pyx_k_z2[] = "z2"; static const char __pyx_k_zx[] = "zx"; +static const char __pyx_k_Doi[] = "Doi"; static const char __pyx_k_Sxx[] = "Sxx"; static const char __pyx_k_Sxy[] = "Sxy"; static const char __pyx_k_Sxz[] = "Sxz"; @@ -1648,6 +1653,7 @@ static const char __pyx_k_a41[] = "a41"; static const char __pyx_k_a42[] = "a42"; static const char __pyx_k_a43[] = "a43"; static const char __pyx_k_a44[] = "a44"; +static const char __pyx_k_due[] = "due"; static const char __pyx_k_ref[] = "ref"; static const char __pyx_k_rms[] = "rms"; static const char __pyx_k_rot[] = "rot"; @@ -1660,18 +1666,22 @@ static const char __pyx_k_Syz2[] = "Syz2"; static const char __pyx_k_Szx2[] = "Szx2"; static const char __pyx_k_Szy2[] = "Szy2"; static const char __pyx_k_Szz2[] = "Szz2"; +static const char __pyx_k_cite[] = "cite"; static const char __pyx_k_conf[] = "conf"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_oldg[] = "oldg"; +static const char __pyx_k_path[] = "path"; static const char __pyx_k_qsqr[] = "qsqr"; static const char __pyx_k_rmsd[] = "rmsd"; static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_QCBIB[] = "_QCBIB"; static const char __pyx_k_delta[] = "delta"; static const char __pyx_k_dtype[] = "dtype"; static const char __pyx_k_normq[] = "normq"; static const char __pyx_k_numpy[] = "numpy"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_zeros[] = "zeros"; +static const char __pyx_k_BibTeX[] = "BibTeX"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_weight[] = "weight"; static const char __pyx_k_SxxmSyy[] = "SxxmSyy"; @@ -1703,6 +1713,8 @@ static const char __pyx_k_a3243_4233[] = "a3243_4233"; static const char __pyx_k_a3244_4234[] = "a3244_4234"; static const char __pyx_k_a3344_4334[] = "a3344_4334"; static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_cite_module[] = "cite_module"; +static const char __pyx_k_description[] = "description"; static const char __pyx_k_InnerProduct[] = "InnerProduct"; static const char __pyx_k_RuntimeError[] = "RuntimeError"; static const char __pyx_k_SyzSzymSyySzz2[] = "SyzSzymSyySzz2"; @@ -1710,11 +1722,14 @@ static const char __pyx_k_Sxy2Sxz2Syx2Szx2[] = "Sxy2Sxz2Syx2Szx2"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_Sxx2Syy2Szz2Syz2Szy2[] = "Sxx2Syy2Szz2Syz2Szy2"; static const char __pyx_k_MDAnalysis_lib_qcprot[] = "MDAnalysis.lib.qcprot"; +static const char __pyx_k_QCProt_implementation[] = "QCProt implementation"; static const char __pyx_k_FastCalcRMSDAndRotation[] = "FastCalcRMSDAndRotation"; static const char __pyx_k_CalcRMSDRotationalMatrix[] = "CalcRMSDRotationalMatrix"; +static const char __pyx_k_10_1107_s0108767305015266[] = "10.1107/s0108767305015266"; static const char __pyx_k_MDAnalysis_lib_qcprot_pyx[] = "MDAnalysis/lib/qcprot.pyx"; static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; static const char __pyx_k_Fast_QCP_RMSD_structure_alignme[] = "\nFast QCP RMSD structure alignment --- :mod:`MDAnalysis.lib.qcprot`\n==================================================================\n\n:Author: Joshua L. Adelman, University of Pittsburgh\n:Author: Robert R. Delgado, Cornell University and Arizona State University\n:Contact: jla65@pitt.edu\n:Year: 2011, 2016\n:Licence: BSD\n\nPyQCPROT_ is a python/cython implementation of Douglas Theobald's QCP\nmethod for calculating the minimum RMSD between two structures\n[Theobald2005]_ and determining the optimal least-squares rotation\nmatrix [Liu2010]_.\n\nA full description of the method, along with the original C implementation can\nbe found at http://theobald.brandeis.edu/qcp/\n\nSee Also\n--------\nMDAnalysis.analysis.align:\n Align structures using :func:`CalcRMSDRotationalMatrix`\nMDAnalysis.analysis.rms.rmsd:\n Calculate the RMSD between two structures using\n :func:`CalcRMSDRotationalMatrix`\n\n\n.. versionchanged:: 0.16.0\n Call signatures were changed to directly interface with MDAnalysis\n coordinate arrays: shape (N, 3)\n\nReferences\n----------\n\nIf you use this QCP rotation calculation method in a publication, please\nreference:\n\n.. [Theobald2005] Douglas L. Theobald (2005)\n \"Rapid calculation of RMSD using a quaternion-based characteristic\n polynomial.\" Acta Crystallographica A 61(4):478-480.\n\n.. [Liu2010] Pu Liu, Dmitris K. Agrafiotis, and Douglas L. Theobald (2010)\n \"Fast determination of the optimal rotational matrix for macromolecular\n superpositions.\" J. Comput. Chem. 31, 1561-1563.\n\n.. _PyQCPROT: https://github.com/synapticarbors/pyqcprot\n\n\nFunctions\n---------\n\nUsers will typically use the :func:`CalcRMSDRotationalMatrix` function.\n\n.. autofunction:: CalcRMSDRotationalMatrix\n\n.. autofunction:: InnerProduct\n\n.. autofunction:: FastCalcRMSDAndRotation\n\n"; +static const char __pyx_k_article_qcprot2_author_Pu_Liu_a[] = "@article{qcprot2,\nauthor = {Pu Liu and Dimitris K. Agrafiotis and Douglas L. Theobald},\ntitle = {Fast determination of the optimal rotational matrix for macromolecular superpositions},\njournal = {Journal of Computational Chemistry},\nvolume = {31},\nnumber = {7},\npages = {1561-1563},\ndoi = {10.1002/jcc.21439},\n}\n"; static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; @@ -1722,9 +1737,12 @@ static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_kp_s_10_1107_s0108767305015266; static PyObject *__pyx_n_s_A; +static PyObject *__pyx_n_s_BibTeX; static PyObject *__pyx_n_s_C; static PyObject *__pyx_n_s_CalcRMSDRotationalMatrix; +static PyObject *__pyx_n_s_Doi; static PyObject *__pyx_n_s_E0; static PyObject *__pyx_n_s_FastCalcRMSDAndRotation; static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; @@ -1733,10 +1751,12 @@ static PyObject *__pyx_n_s_G1; static PyObject *__pyx_n_s_G2; static PyObject *__pyx_n_s_ImportError; static PyObject *__pyx_n_s_InnerProduct; -static PyObject *__pyx_n_s_MDAnalysis_lib_qcprot; +static PyObject *__pyx_kp_s_MDAnalysis_lib_qcprot; static PyObject *__pyx_kp_s_MDAnalysis_lib_qcprot_pyx; static PyObject *__pyx_n_s_N; static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; +static PyObject *__pyx_n_s_QCBIB; +static PyObject *__pyx_kp_s_QCProt_implementation; static PyObject *__pyx_n_s_RuntimeError; static PyObject *__pyx_n_s_Sxx; static PyObject *__pyx_n_s_Sxx2; @@ -1798,16 +1818,21 @@ static PyObject *__pyx_n_s_a41; static PyObject *__pyx_n_s_a42; static PyObject *__pyx_n_s_a43; static PyObject *__pyx_n_s_a44; +static PyObject *__pyx_kp_s_article_qcprot2_author_Pu_Liu_a; static PyObject *__pyx_n_s_ax; static PyObject *__pyx_n_s_ay; static PyObject *__pyx_n_s_az; static PyObject *__pyx_n_s_b; +static PyObject *__pyx_n_s_cite; +static PyObject *__pyx_n_s_cite_module; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_conf; static PyObject *__pyx_n_s_coords1; static PyObject *__pyx_n_s_coords2; static PyObject *__pyx_n_s_delta; +static PyObject *__pyx_n_s_description; static PyObject *__pyx_n_s_dtype; +static PyObject *__pyx_n_s_due; static PyObject *__pyx_n_s_evalprec; static PyObject *__pyx_n_s_evecprec; static PyObject *__pyx_n_s_float64; @@ -1823,6 +1848,7 @@ static PyObject *__pyx_n_s_numpy; static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; static PyObject *__pyx_n_s_oldg; +static PyObject *__pyx_n_s_path; static PyObject *__pyx_n_s_q1; static PyObject *__pyx_n_s_q2; static PyObject *__pyx_n_s_q3; @@ -1866,14 +1892,15 @@ static PyObject *__pyx_tuple__9; static PyObject *__pyx_tuple__10; static PyObject *__pyx_tuple__11; static PyObject *__pyx_tuple__12; -static PyObject *__pyx_tuple__14; -static PyObject *__pyx_tuple__16; -static PyObject *__pyx_codeobj__13; -static PyObject *__pyx_codeobj__15; -static PyObject *__pyx_codeobj__17; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_tuple__15; +static PyObject *__pyx_tuple__17; +static PyObject *__pyx_codeobj__14; +static PyObject *__pyx_codeobj__16; +static PyObject *__pyx_codeobj__18; /* Late includes */ -/* "MDAnalysis/lib/qcprot.pyx":150 +/* "MDAnalysis/lib/qcprot.pyx":175 * @cython.boundscheck(False) * @cython.wraparound(False) * def InnerProduct(np.ndarray[np.float64_t, ndim=1] A, # <<<<<<<<<<<<<< @@ -1923,29 +1950,29 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_6qcprot_1InnerProduct(PyObject *__py case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords1)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 1); __PYX_ERR(0, 150, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 1); __PYX_ERR(0, 175, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_coords2)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 2); __PYX_ERR(0, 150, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 2); __PYX_ERR(0, 175, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_N)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 3); __PYX_ERR(0, 150, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 3); __PYX_ERR(0, 175, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_weight)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 4); __PYX_ERR(0, 150, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, 4); __PYX_ERR(0, 175, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "InnerProduct") < 0)) __PYX_ERR(0, 150, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "InnerProduct") < 0)) __PYX_ERR(0, 175, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; @@ -1959,21 +1986,21 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_6qcprot_1InnerProduct(PyObject *__py __pyx_v_A = ((PyArrayObject *)values[0]); __pyx_v_coords1 = ((PyArrayObject *)values[1]); __pyx_v_coords2 = ((PyArrayObject *)values[2]); - __pyx_v_N = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_N == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 153, __pyx_L3_error) + __pyx_v_N = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_N == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 178, __pyx_L3_error) __pyx_v_weight = ((PyArrayObject *)values[4]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 150, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("InnerProduct", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 175, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.qcprot.InnerProduct", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_A), __pyx_ptype_5numpy_ndarray, 1, "A", 0))) __PYX_ERR(0, 150, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 151, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 152, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_weight), __pyx_ptype_5numpy_ndarray, 1, "weight", 0))) __PYX_ERR(0, 154, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_A), __pyx_ptype_5numpy_ndarray, 1, "A", 0))) __PYX_ERR(0, 175, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords1), __pyx_ptype_5numpy_ndarray, 1, "coords1", 0))) __PYX_ERR(0, 176, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_coords2), __pyx_ptype_5numpy_ndarray, 1, "coords2", 0))) __PYX_ERR(0, 177, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_weight), __pyx_ptype_5numpy_ndarray, 1, "weight", 0))) __PYX_ERR(0, 179, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(__pyx_self, __pyx_v_A, __pyx_v_coords1, __pyx_v_coords2, __pyx_v_N, __pyx_v_weight); /* function exit code */ @@ -2091,26 +2118,26 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_pybuffernd_weight.rcbuffer = &__pyx_pybuffer_weight; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_A.rcbuffer->pybuffer, (PyObject*)__pyx_v_A, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_A.rcbuffer->pybuffer, (PyObject*)__pyx_v_A, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 175, __pyx_L1_error) } __pyx_pybuffernd_A.diminfo[0].strides = __pyx_pybuffernd_A.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_A.diminfo[0].shape = __pyx_pybuffernd_A.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_coords1.rcbuffer->pybuffer, (PyObject*)__pyx_v_coords1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_coords1.rcbuffer->pybuffer, (PyObject*)__pyx_v_coords1, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 175, __pyx_L1_error) } __pyx_pybuffernd_coords1.diminfo[0].strides = __pyx_pybuffernd_coords1.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_coords1.diminfo[0].shape = __pyx_pybuffernd_coords1.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_coords1.diminfo[1].strides = __pyx_pybuffernd_coords1.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_coords1.diminfo[1].shape = __pyx_pybuffernd_coords1.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_coords2.rcbuffer->pybuffer, (PyObject*)__pyx_v_coords2, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_coords2.rcbuffer->pybuffer, (PyObject*)__pyx_v_coords2, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 175, __pyx_L1_error) } __pyx_pybuffernd_coords2.diminfo[0].strides = __pyx_pybuffernd_coords2.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_coords2.diminfo[0].shape = __pyx_pybuffernd_coords2.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_coords2.diminfo[1].strides = __pyx_pybuffernd_coords2.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_coords2.diminfo[1].shape = __pyx_pybuffernd_coords2.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weight.rcbuffer->pybuffer, (PyObject*)__pyx_v_weight, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 150, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weight.rcbuffer->pybuffer, (PyObject*)__pyx_v_weight, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 175, __pyx_L1_error) } __pyx_pybuffernd_weight.diminfo[0].strides = __pyx_pybuffernd_weight.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_weight.diminfo[0].shape = __pyx_pybuffernd_weight.rcbuffer->pybuffer.shape[0]; - /* "MDAnalysis/lib/qcprot.pyx":192 + /* "MDAnalysis/lib/qcprot.pyx":217 * cdef double G1, G2 * * G1 = 0.0 # <<<<<<<<<<<<<< @@ -2119,7 +2146,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P */ __pyx_v_G1 = 0.0; - /* "MDAnalysis/lib/qcprot.pyx":193 + /* "MDAnalysis/lib/qcprot.pyx":218 * * G1 = 0.0 * G2 = 0.0 # <<<<<<<<<<<<<< @@ -2128,7 +2155,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P */ __pyx_v_G2 = 0.0; - /* "MDAnalysis/lib/qcprot.pyx":195 + /* "MDAnalysis/lib/qcprot.pyx":220 * G2 = 0.0 * * A[0] = A[1] = A[2] = A[3] = A[4] = A[5] = A[6] = A[7] = A[8] = 0.0 # <<<<<<<<<<<<<< @@ -2154,7 +2181,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_9 = 8; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_A.diminfo[0].strides) = 0.0; - /* "MDAnalysis/lib/qcprot.pyx":197 + /* "MDAnalysis/lib/qcprot.pyx":222 * A[0] = A[1] = A[2] = A[3] = A[4] = A[5] = A[6] = A[7] = A[8] = 0.0 * * if (weight is not None): # <<<<<<<<<<<<<< @@ -2165,7 +2192,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_11 = (__pyx_t_10 != 0); if (__pyx_t_11) { - /* "MDAnalysis/lib/qcprot.pyx":198 + /* "MDAnalysis/lib/qcprot.pyx":223 * * if (weight is not None): * for i in range(N): # <<<<<<<<<<<<<< @@ -2177,7 +2204,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { __pyx_v_i = __pyx_t_14; - /* "MDAnalysis/lib/qcprot.pyx":199 + /* "MDAnalysis/lib/qcprot.pyx":224 * if (weight is not None): * for i in range(N): * x1 = weight[i] * coords1[i, 0] # <<<<<<<<<<<<<< @@ -2189,7 +2216,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_17 = 0; __pyx_v_x1 = ((*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_weight.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_weight.diminfo[0].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_coords1.diminfo[1].strides))); - /* "MDAnalysis/lib/qcprot.pyx":200 + /* "MDAnalysis/lib/qcprot.pyx":225 * for i in range(N): * x1 = weight[i] * coords1[i, 0] * y1 = weight[i] * coords1[i, 1] # <<<<<<<<<<<<<< @@ -2201,7 +2228,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_20 = 1; __pyx_v_y1 = ((*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_weight.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_weight.diminfo[0].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_coords1.diminfo[1].strides))); - /* "MDAnalysis/lib/qcprot.pyx":201 + /* "MDAnalysis/lib/qcprot.pyx":226 * x1 = weight[i] * coords1[i, 0] * y1 = weight[i] * coords1[i, 1] * z1 = weight[i] * coords1[i, 2] # <<<<<<<<<<<<<< @@ -2213,7 +2240,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_23 = 2; __pyx_v_z1 = ((*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_weight.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_weight.diminfo[0].strides)) * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_coords1.diminfo[1].strides))); - /* "MDAnalysis/lib/qcprot.pyx":203 + /* "MDAnalysis/lib/qcprot.pyx":228 * z1 = weight[i] * coords1[i, 2] * * G1 += x1 * coords1[i, 0] + y1 * coords1[i, 1] + z1 * coords1[i, 2] # <<<<<<<<<<<<<< @@ -2228,7 +2255,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_29 = 2; __pyx_v_G1 = (__pyx_v_G1 + (((__pyx_v_x1 * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_coords1.diminfo[1].strides))) + (__pyx_v_y1 * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_27, __pyx_pybuffernd_coords1.diminfo[1].strides)))) + (__pyx_v_z1 * (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_28, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_29, __pyx_pybuffernd_coords1.diminfo[1].strides))))); - /* "MDAnalysis/lib/qcprot.pyx":205 + /* "MDAnalysis/lib/qcprot.pyx":230 * G1 += x1 * coords1[i, 0] + y1 * coords1[i, 1] + z1 * coords1[i, 2] * * x2 = coords2[i, 0] # <<<<<<<<<<<<<< @@ -2239,7 +2266,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_31 = 0; __pyx_v_x2 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords2.rcbuffer->pybuffer.buf, __pyx_t_30, __pyx_pybuffernd_coords2.diminfo[0].strides, __pyx_t_31, __pyx_pybuffernd_coords2.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":206 + /* "MDAnalysis/lib/qcprot.pyx":231 * * x2 = coords2[i, 0] * y2 = coords2[i, 1] # <<<<<<<<<<<<<< @@ -2250,7 +2277,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_33 = 1; __pyx_v_y2 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords2.rcbuffer->pybuffer.buf, __pyx_t_32, __pyx_pybuffernd_coords2.diminfo[0].strides, __pyx_t_33, __pyx_pybuffernd_coords2.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":207 + /* "MDAnalysis/lib/qcprot.pyx":232 * x2 = coords2[i, 0] * y2 = coords2[i, 1] * z2 = coords2[i, 2] # <<<<<<<<<<<<<< @@ -2261,7 +2288,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_35 = 2; __pyx_v_z2 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords2.rcbuffer->pybuffer.buf, __pyx_t_34, __pyx_pybuffernd_coords2.diminfo[0].strides, __pyx_t_35, __pyx_pybuffernd_coords2.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":209 + /* "MDAnalysis/lib/qcprot.pyx":234 * z2 = coords2[i, 2] * * G2 += weight[i] * (x2 * x2 + y2 * y2 + z2 * z2) # <<<<<<<<<<<<<< @@ -2271,7 +2298,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_36 = __pyx_v_i; __pyx_v_G2 = (__pyx_v_G2 + ((*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_weight.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_weight.diminfo[0].strides)) * (((__pyx_v_x2 * __pyx_v_x2) + (__pyx_v_y2 * __pyx_v_y2)) + (__pyx_v_z2 * __pyx_v_z2)))); - /* "MDAnalysis/lib/qcprot.pyx":211 + /* "MDAnalysis/lib/qcprot.pyx":236 * G2 += weight[i] * (x2 * x2 + y2 * y2 + z2 * z2) * * A[0] += (x1 * x2) # <<<<<<<<<<<<<< @@ -2281,7 +2308,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_37 = 0; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_37, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_x1 * __pyx_v_x2); - /* "MDAnalysis/lib/qcprot.pyx":212 + /* "MDAnalysis/lib/qcprot.pyx":237 * * A[0] += (x1 * x2) * A[1] += (x1 * y2) # <<<<<<<<<<<<<< @@ -2291,7 +2318,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_38 = 1; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_x1 * __pyx_v_y2); - /* "MDAnalysis/lib/qcprot.pyx":213 + /* "MDAnalysis/lib/qcprot.pyx":238 * A[0] += (x1 * x2) * A[1] += (x1 * y2) * A[2] += (x1 * z2) # <<<<<<<<<<<<<< @@ -2301,7 +2328,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_39 = 2; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_39, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_x1 * __pyx_v_z2); - /* "MDAnalysis/lib/qcprot.pyx":215 + /* "MDAnalysis/lib/qcprot.pyx":240 * A[2] += (x1 * z2) * * A[3] += (y1 * x2) # <<<<<<<<<<<<<< @@ -2311,7 +2338,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_40 = 3; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_40, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_y1 * __pyx_v_x2); - /* "MDAnalysis/lib/qcprot.pyx":216 + /* "MDAnalysis/lib/qcprot.pyx":241 * * A[3] += (y1 * x2) * A[4] += (y1 * y2) # <<<<<<<<<<<<<< @@ -2321,7 +2348,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_41 = 4; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_41, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_y1 * __pyx_v_y2); - /* "MDAnalysis/lib/qcprot.pyx":217 + /* "MDAnalysis/lib/qcprot.pyx":242 * A[3] += (y1 * x2) * A[4] += (y1 * y2) * A[5] += (y1 * z2) # <<<<<<<<<<<<<< @@ -2331,7 +2358,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_42 = 5; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_42, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_y1 * __pyx_v_z2); - /* "MDAnalysis/lib/qcprot.pyx":219 + /* "MDAnalysis/lib/qcprot.pyx":244 * A[5] += (y1 * z2) * * A[6] += (z1 * x2) # <<<<<<<<<<<<<< @@ -2341,7 +2368,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_43 = 6; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_43, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_z1 * __pyx_v_x2); - /* "MDAnalysis/lib/qcprot.pyx":220 + /* "MDAnalysis/lib/qcprot.pyx":245 * * A[6] += (z1 * x2) * A[7] += (z1 * y2) # <<<<<<<<<<<<<< @@ -2351,7 +2378,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_44 = 7; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_44, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_z1 * __pyx_v_y2); - /* "MDAnalysis/lib/qcprot.pyx":221 + /* "MDAnalysis/lib/qcprot.pyx":246 * A[6] += (z1 * x2) * A[7] += (z1 * y2) * A[8] += (z1 * z2) # <<<<<<<<<<<<<< @@ -2362,7 +2389,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_45, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_z1 * __pyx_v_z2); } - /* "MDAnalysis/lib/qcprot.pyx":197 + /* "MDAnalysis/lib/qcprot.pyx":222 * A[0] = A[1] = A[2] = A[3] = A[4] = A[5] = A[6] = A[7] = A[8] = 0.0 * * if (weight is not None): # <<<<<<<<<<<<<< @@ -2372,7 +2399,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P goto __pyx_L3; } - /* "MDAnalysis/lib/qcprot.pyx":224 + /* "MDAnalysis/lib/qcprot.pyx":249 * * else: * for i in range(N): # <<<<<<<<<<<<<< @@ -2385,7 +2412,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { __pyx_v_i = __pyx_t_14; - /* "MDAnalysis/lib/qcprot.pyx":225 + /* "MDAnalysis/lib/qcprot.pyx":250 * else: * for i in range(N): * x1 = coords1[i, 0] # <<<<<<<<<<<<<< @@ -2396,7 +2423,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_47 = 0; __pyx_v_x1 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_46, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_47, __pyx_pybuffernd_coords1.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":226 + /* "MDAnalysis/lib/qcprot.pyx":251 * for i in range(N): * x1 = coords1[i, 0] * y1 = coords1[i, 1] # <<<<<<<<<<<<<< @@ -2407,7 +2434,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_49 = 1; __pyx_v_y1 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_48, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_49, __pyx_pybuffernd_coords1.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":227 + /* "MDAnalysis/lib/qcprot.pyx":252 * x1 = coords1[i, 0] * y1 = coords1[i, 1] * z1 = coords1[i, 2] # <<<<<<<<<<<<<< @@ -2418,7 +2445,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_51 = 2; __pyx_v_z1 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords1.rcbuffer->pybuffer.buf, __pyx_t_50, __pyx_pybuffernd_coords1.diminfo[0].strides, __pyx_t_51, __pyx_pybuffernd_coords1.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":229 + /* "MDAnalysis/lib/qcprot.pyx":254 * z1 = coords1[i, 2] * * G1 += (x1 * x1 + y1 * y1 + z1 * z1) # <<<<<<<<<<<<<< @@ -2427,7 +2454,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P */ __pyx_v_G1 = (__pyx_v_G1 + (((__pyx_v_x1 * __pyx_v_x1) + (__pyx_v_y1 * __pyx_v_y1)) + (__pyx_v_z1 * __pyx_v_z1))); - /* "MDAnalysis/lib/qcprot.pyx":231 + /* "MDAnalysis/lib/qcprot.pyx":256 * G1 += (x1 * x1 + y1 * y1 + z1 * z1) * * x2 = coords2[i, 0] # <<<<<<<<<<<<<< @@ -2438,7 +2465,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_53 = 0; __pyx_v_x2 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords2.rcbuffer->pybuffer.buf, __pyx_t_52, __pyx_pybuffernd_coords2.diminfo[0].strides, __pyx_t_53, __pyx_pybuffernd_coords2.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":232 + /* "MDAnalysis/lib/qcprot.pyx":257 * * x2 = coords2[i, 0] * y2 = coords2[i, 1] # <<<<<<<<<<<<<< @@ -2449,7 +2476,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_55 = 1; __pyx_v_y2 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords2.rcbuffer->pybuffer.buf, __pyx_t_54, __pyx_pybuffernd_coords2.diminfo[0].strides, __pyx_t_55, __pyx_pybuffernd_coords2.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":233 + /* "MDAnalysis/lib/qcprot.pyx":258 * x2 = coords2[i, 0] * y2 = coords2[i, 1] * z2 = coords2[i, 2] # <<<<<<<<<<<<<< @@ -2460,7 +2487,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_57 = 2; __pyx_v_z2 = (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_coords2.rcbuffer->pybuffer.buf, __pyx_t_56, __pyx_pybuffernd_coords2.diminfo[0].strides, __pyx_t_57, __pyx_pybuffernd_coords2.diminfo[1].strides)); - /* "MDAnalysis/lib/qcprot.pyx":235 + /* "MDAnalysis/lib/qcprot.pyx":260 * z2 = coords2[i, 2] * * G2 += (x2 * x2 + y2 * y2 + z2 * z2) # <<<<<<<<<<<<<< @@ -2469,7 +2496,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P */ __pyx_v_G2 = (__pyx_v_G2 + (((__pyx_v_x2 * __pyx_v_x2) + (__pyx_v_y2 * __pyx_v_y2)) + (__pyx_v_z2 * __pyx_v_z2))); - /* "MDAnalysis/lib/qcprot.pyx":237 + /* "MDAnalysis/lib/qcprot.pyx":262 * G2 += (x2 * x2 + y2 * y2 + z2 * z2) * * A[0] += (x1 * x2) # <<<<<<<<<<<<<< @@ -2479,7 +2506,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_58 = 0; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_58, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_x1 * __pyx_v_x2); - /* "MDAnalysis/lib/qcprot.pyx":238 + /* "MDAnalysis/lib/qcprot.pyx":263 * * A[0] += (x1 * x2) * A[1] += (x1 * y2) # <<<<<<<<<<<<<< @@ -2489,7 +2516,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_59 = 1; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_59, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_x1 * __pyx_v_y2); - /* "MDAnalysis/lib/qcprot.pyx":239 + /* "MDAnalysis/lib/qcprot.pyx":264 * A[0] += (x1 * x2) * A[1] += (x1 * y2) * A[2] += (x1 * z2) # <<<<<<<<<<<<<< @@ -2499,7 +2526,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_60 = 2; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_60, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_x1 * __pyx_v_z2); - /* "MDAnalysis/lib/qcprot.pyx":241 + /* "MDAnalysis/lib/qcprot.pyx":266 * A[2] += (x1 * z2) * * A[3] += (y1 * x2) # <<<<<<<<<<<<<< @@ -2509,7 +2536,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_61 = 3; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_61, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_y1 * __pyx_v_x2); - /* "MDAnalysis/lib/qcprot.pyx":242 + /* "MDAnalysis/lib/qcprot.pyx":267 * * A[3] += (y1 * x2) * A[4] += (y1 * y2) # <<<<<<<<<<<<<< @@ -2519,7 +2546,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_62 = 4; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_62, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_y1 * __pyx_v_y2); - /* "MDAnalysis/lib/qcprot.pyx":243 + /* "MDAnalysis/lib/qcprot.pyx":268 * A[3] += (y1 * x2) * A[4] += (y1 * y2) * A[5] += (y1 * z2) # <<<<<<<<<<<<<< @@ -2529,7 +2556,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_63 = 5; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_63, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_y1 * __pyx_v_z2); - /* "MDAnalysis/lib/qcprot.pyx":245 + /* "MDAnalysis/lib/qcprot.pyx":270 * A[5] += (y1 * z2) * * A[6] += (z1 * x2) # <<<<<<<<<<<<<< @@ -2539,7 +2566,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_64 = 6; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_64, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_z1 * __pyx_v_x2); - /* "MDAnalysis/lib/qcprot.pyx":246 + /* "MDAnalysis/lib/qcprot.pyx":271 * * A[6] += (z1 * x2) * A[7] += (z1 * y2) # <<<<<<<<<<<<<< @@ -2549,7 +2576,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P __pyx_t_65 = 7; *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_65, __pyx_pybuffernd_A.diminfo[0].strides) += (__pyx_v_z1 * __pyx_v_y2); - /* "MDAnalysis/lib/qcprot.pyx":247 + /* "MDAnalysis/lib/qcprot.pyx":272 * A[6] += (z1 * x2) * A[7] += (z1 * y2) * A[8] += (z1 * z2) # <<<<<<<<<<<<<< @@ -2562,7 +2589,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P } __pyx_L3:; - /* "MDAnalysis/lib/qcprot.pyx":249 + /* "MDAnalysis/lib/qcprot.pyx":274 * A[8] += (z1 * z2) * * return (G1 + G2) * 0.5 # <<<<<<<<<<<<<< @@ -2570,13 +2597,13 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P * @cython.boundscheck(False) */ __Pyx_XDECREF(__pyx_r); - __pyx_t_67 = PyFloat_FromDouble(((__pyx_v_G1 + __pyx_v_G2) * 0.5)); if (unlikely(!__pyx_t_67)) __PYX_ERR(0, 249, __pyx_L1_error) + __pyx_t_67 = PyFloat_FromDouble(((__pyx_v_G1 + __pyx_v_G2) * 0.5)); if (unlikely(!__pyx_t_67)) __PYX_ERR(0, 274, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_67); __pyx_r = __pyx_t_67; __pyx_t_67 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/qcprot.pyx":150 + /* "MDAnalysis/lib/qcprot.pyx":175 * @cython.boundscheck(False) * @cython.wraparound(False) * def InnerProduct(np.ndarray[np.float64_t, ndim=1] A, # <<<<<<<<<<<<<< @@ -2610,7 +2637,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_InnerProduct(CYTHON_UNUSED P return __pyx_r; } -/* "MDAnalysis/lib/qcprot.pyx":253 +/* "MDAnalysis/lib/qcprot.pyx":278 * @cython.boundscheck(False) * @cython.wraparound(False) * def CalcRMSDRotationalMatrix(np.ndarray[np.float64_t, ndim=2] ref, # <<<<<<<<<<<<<< @@ -2660,29 +2687,29 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_6qcprot_3CalcRMSDRotationalMatrix(Py case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_conf)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 1); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 1); __PYX_ERR(0, 278, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_N)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 2); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 2); __PYX_ERR(0, 278, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_rot)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 3); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 3); __PYX_ERR(0, 278, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_weights)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 4); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, 4); __PYX_ERR(0, 278, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "CalcRMSDRotationalMatrix") < 0)) __PYX_ERR(0, 253, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "CalcRMSDRotationalMatrix") < 0)) __PYX_ERR(0, 278, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; @@ -2695,22 +2722,22 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_6qcprot_3CalcRMSDRotationalMatrix(Py } __pyx_v_ref = ((PyArrayObject *)values[0]); __pyx_v_conf = ((PyArrayObject *)values[1]); - __pyx_v_N = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_N == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 255, __pyx_L3_error) + __pyx_v_N = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_N == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 280, __pyx_L3_error) __pyx_v_rot = ((PyArrayObject *)values[3]); __pyx_v_weights = ((PyArrayObject *)values[4]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 253, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("CalcRMSDRotationalMatrix", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 278, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.qcprot.CalcRMSDRotationalMatrix", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_ref), __pyx_ptype_5numpy_ndarray, 1, "ref", 0))) __PYX_ERR(0, 253, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_conf), __pyx_ptype_5numpy_ndarray, 1, "conf", 0))) __PYX_ERR(0, 254, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rot), __pyx_ptype_5numpy_ndarray, 1, "rot", 0))) __PYX_ERR(0, 256, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_weights), __pyx_ptype_5numpy_ndarray, 1, "weights", 0))) __PYX_ERR(0, 257, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_ref), __pyx_ptype_5numpy_ndarray, 1, "ref", 0))) __PYX_ERR(0, 278, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_conf), __pyx_ptype_5numpy_ndarray, 1, "conf", 0))) __PYX_ERR(0, 279, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rot), __pyx_ptype_5numpy_ndarray, 1, "rot", 0))) __PYX_ERR(0, 281, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_weights), __pyx_ptype_5numpy_ndarray, 1, "weights", 0))) __PYX_ERR(0, 282, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(__pyx_self, __pyx_v_ref, __pyx_v_conf, __pyx_v_N, __pyx_v_rot, __pyx_v_weights); /* function exit code */ @@ -2769,57 +2796,57 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY __pyx_pybuffernd_weights.rcbuffer = &__pyx_pybuffer_weights; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_ref.rcbuffer->pybuffer, (PyObject*)__pyx_v_ref, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 253, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_ref.rcbuffer->pybuffer, (PyObject*)__pyx_v_ref, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 278, __pyx_L1_error) } __pyx_pybuffernd_ref.diminfo[0].strides = __pyx_pybuffernd_ref.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_ref.diminfo[0].shape = __pyx_pybuffernd_ref.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_ref.diminfo[1].strides = __pyx_pybuffernd_ref.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_ref.diminfo[1].shape = __pyx_pybuffernd_ref.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_conf.rcbuffer->pybuffer, (PyObject*)__pyx_v_conf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 253, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_conf.rcbuffer->pybuffer, (PyObject*)__pyx_v_conf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 278, __pyx_L1_error) } __pyx_pybuffernd_conf.diminfo[0].strides = __pyx_pybuffernd_conf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_conf.diminfo[0].shape = __pyx_pybuffernd_conf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_conf.diminfo[1].strides = __pyx_pybuffernd_conf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_conf.diminfo[1].shape = __pyx_pybuffernd_conf.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_rot.rcbuffer->pybuffer, (PyObject*)__pyx_v_rot, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 253, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_rot.rcbuffer->pybuffer, (PyObject*)__pyx_v_rot, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 278, __pyx_L1_error) } __pyx_pybuffernd_rot.diminfo[0].strides = __pyx_pybuffernd_rot.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_rot.diminfo[0].shape = __pyx_pybuffernd_rot.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weights.rcbuffer->pybuffer, (PyObject*)__pyx_v_weights, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 253, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weights.rcbuffer->pybuffer, (PyObject*)__pyx_v_weights, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 278, __pyx_L1_error) } __pyx_pybuffernd_weights.diminfo[0].strides = __pyx_pybuffernd_weights.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_weights.diminfo[0].shape = __pyx_pybuffernd_weights.rcbuffer->pybuffer.shape[0]; - /* "MDAnalysis/lib/qcprot.pyx":283 + /* "MDAnalysis/lib/qcprot.pyx":308 * """ * cdef double E0 * cdef np.ndarray[np.float64_t, ndim = 1] A = np.zeros(9,dtype = np.float64) # <<<<<<<<<<<<<< * * E0 = InnerProduct(A, conf, ref, N, weights) */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_float64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_float64); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 283, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple_, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple_, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 283, __pyx_L1_error) + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 308, __pyx_L1_error) __pyx_t_5 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_A.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_A = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_A.rcbuffer->pybuffer.buf = NULL; - __PYX_ERR(0, 283, __pyx_L1_error) + __PYX_ERR(0, 308, __pyx_L1_error) } else {__pyx_pybuffernd_A.diminfo[0].strides = __pyx_pybuffernd_A.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_A.diminfo[0].shape = __pyx_pybuffernd_A.rcbuffer->pybuffer.shape[0]; } } @@ -2827,16 +2854,16 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY __pyx_v_A = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/qcprot.pyx":285 + /* "MDAnalysis/lib/qcprot.pyx":310 * cdef np.ndarray[np.float64_t, ndim = 1] A = np.zeros(9,dtype = np.float64) * * E0 = InnerProduct(A, conf, ref, N, weights) # <<<<<<<<<<<<<< * return FastCalcRMSDAndRotation(rot, A, E0, N) * */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_InnerProduct); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_InnerProduct); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_N); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_N); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_6 = 0; @@ -2853,7 +2880,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[6] = {__pyx_t_3, ((PyObject *)__pyx_v_A), ((PyObject *)__pyx_v_conf), ((PyObject *)__pyx_v_ref), __pyx_t_2, ((PyObject *)__pyx_v_weights)}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 5+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 5+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -2862,14 +2889,14 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[6] = {__pyx_t_3, ((PyObject *)__pyx_v_A), ((PyObject *)__pyx_v_conf), ((PyObject *)__pyx_v_ref), __pyx_t_2, ((PyObject *)__pyx_v_weights)}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 5+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 5+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else #endif { - __pyx_t_7 = PyTuple_New(5+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_7 = PyTuple_New(5+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -2889,16 +2916,16 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY __Pyx_GIVEREF(((PyObject *)__pyx_v_weights)); PyTuple_SET_ITEM(__pyx_t_7, 4+__pyx_t_6, ((PyObject *)__pyx_v_weights)); __pyx_t_2 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 285, __pyx_L1_error) + __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 310, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_E0 = __pyx_t_8; - /* "MDAnalysis/lib/qcprot.pyx":286 + /* "MDAnalysis/lib/qcprot.pyx":311 * * E0 = InnerProduct(A, conf, ref, N, weights) * return FastCalcRMSDAndRotation(rot, A, E0, N) # <<<<<<<<<<<<<< @@ -2906,11 +2933,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY * def FastCalcRMSDAndRotation(np.ndarray[np.float64_t, ndim=1] rot, */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_FastCalcRMSDAndRotation); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 286, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_FastCalcRMSDAndRotation); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = PyFloat_FromDouble(__pyx_v_E0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 286, __pyx_L1_error) + __pyx_t_7 = PyFloat_FromDouble(__pyx_v_E0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_N); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 286, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_N); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; __pyx_t_6 = 0; @@ -2927,7 +2954,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[5] = {__pyx_t_3, ((PyObject *)__pyx_v_rot), ((PyObject *)__pyx_v_A), __pyx_t_7, __pyx_t_2}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 286, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; @@ -2937,7 +2964,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) { PyObject *__pyx_temp[5] = {__pyx_t_3, ((PyObject *)__pyx_v_rot), ((PyObject *)__pyx_v_A), __pyx_t_7, __pyx_t_2}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 286, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 4+__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; @@ -2945,7 +2972,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY } else #endif { - __pyx_t_9 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 286, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(4+__pyx_t_6); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3); __pyx_t_3 = NULL; @@ -2962,7 +2989,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY PyTuple_SET_ITEM(__pyx_t_9, 3+__pyx_t_6, __pyx_t_2); __pyx_t_7 = 0; __pyx_t_2 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 286, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 311, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } @@ -2971,7 +2998,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY __pyx_t_4 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/qcprot.pyx":253 + /* "MDAnalysis/lib/qcprot.pyx":278 * @cython.boundscheck(False) * @cython.wraparound(False) * def CalcRMSDRotationalMatrix(np.ndarray[np.float64_t, ndim=2] ref, # <<<<<<<<<<<<<< @@ -3013,7 +3040,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_2CalcRMSDRotationalMatrix(CY return __pyx_r; } -/* "MDAnalysis/lib/qcprot.pyx":288 +/* "MDAnalysis/lib/qcprot.pyx":313 * return FastCalcRMSDAndRotation(rot, A, E0, N) * * def FastCalcRMSDAndRotation(np.ndarray[np.float64_t, ndim=1] rot, # <<<<<<<<<<<<<< @@ -3060,23 +3087,23 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_6qcprot_5FastCalcRMSDAndRotation(PyO case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_A)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, 1); __PYX_ERR(0, 288, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, 1); __PYX_ERR(0, 313, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_E0)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, 2); __PYX_ERR(0, 288, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, 2); __PYX_ERR(0, 313, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_N)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, 3); __PYX_ERR(0, 288, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, 3); __PYX_ERR(0, 313, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "FastCalcRMSDAndRotation") < 0)) __PYX_ERR(0, 288, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "FastCalcRMSDAndRotation") < 0)) __PYX_ERR(0, 313, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; @@ -3088,19 +3115,19 @@ static PyObject *__pyx_pw_10MDAnalysis_3lib_6qcprot_5FastCalcRMSDAndRotation(PyO } __pyx_v_rot = ((PyArrayObject *)values[0]); __pyx_v_A = ((PyArrayObject *)values[1]); - __pyx_v_E0 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_E0 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 290, __pyx_L3_error) - __pyx_v_N = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_N == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 290, __pyx_L3_error) + __pyx_v_E0 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_E0 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 315, __pyx_L3_error) + __pyx_v_N = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_N == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 315, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 288, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("FastCalcRMSDAndRotation", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 313, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("MDAnalysis.lib.qcprot.FastCalcRMSDAndRotation", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rot), __pyx_ptype_5numpy_ndarray, 1, "rot", 0))) __PYX_ERR(0, 288, __pyx_L1_error) - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_A), __pyx_ptype_5numpy_ndarray, 1, "A", 0))) __PYX_ERR(0, 289, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_rot), __pyx_ptype_5numpy_ndarray, 1, "rot", 0))) __PYX_ERR(0, 313, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_A), __pyx_ptype_5numpy_ndarray, 1, "A", 0))) __PYX_ERR(0, 314, __pyx_L1_error) __pyx_r = __pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(__pyx_self, __pyx_v_rot, __pyx_v_A, __pyx_v_E0, __pyx_v_N); /* function exit code */ @@ -3261,37 +3288,37 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_pybuffernd_A.rcbuffer = &__pyx_pybuffer_A; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_rot.rcbuffer->pybuffer, (PyObject*)__pyx_v_rot, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 288, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_rot.rcbuffer->pybuffer, (PyObject*)__pyx_v_rot, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 313, __pyx_L1_error) } __pyx_pybuffernd_rot.diminfo[0].strides = __pyx_pybuffernd_rot.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_rot.diminfo[0].shape = __pyx_pybuffernd_rot.rcbuffer->pybuffer.shape[0]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; - if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_A.rcbuffer->pybuffer, (PyObject*)__pyx_v_A, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 288, __pyx_L1_error) + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_A.rcbuffer->pybuffer, (PyObject*)__pyx_v_A, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 313, __pyx_L1_error) } __pyx_pybuffernd_A.diminfo[0].strides = __pyx_pybuffernd_A.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_A.diminfo[0].shape = __pyx_pybuffernd_A.rcbuffer->pybuffer.shape[0]; - /* "MDAnalysis/lib/qcprot.pyx":321 + /* "MDAnalysis/lib/qcprot.pyx":346 * cdef double SxzmSzx, SxymSyx, SxxpSyy, SxxmSyy * * cdef np.ndarray[np.float64_t, ndim=1] C = np.zeros(4,) # <<<<<<<<<<<<<< * cdef unsigned int i * cdef double mxEigenV */ - __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 321, __pyx_L1_error) + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 321, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 321, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 321, __pyx_L1_error) + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 346, __pyx_L1_error) __pyx_t_3 = ((PyArrayObject *)__pyx_t_1); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_C.rcbuffer->pybuffer, (PyObject*)__pyx_t_3, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) { __pyx_v_C = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_C.rcbuffer->pybuffer.buf = NULL; - __PYX_ERR(0, 321, __pyx_L1_error) + __PYX_ERR(0, 346, __pyx_L1_error) } else {__pyx_pybuffernd_C.diminfo[0].strides = __pyx_pybuffernd_C.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_C.diminfo[0].shape = __pyx_pybuffernd_C.rcbuffer->pybuffer.shape[0]; } } @@ -3299,7 +3326,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_v_C = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/qcprot.pyx":324 + /* "MDAnalysis/lib/qcprot.pyx":349 * cdef unsigned int i * cdef double mxEigenV * cdef double oldg = 0.0 # <<<<<<<<<<<<<< @@ -3308,7 +3335,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_oldg = 0.0; - /* "MDAnalysis/lib/qcprot.pyx":332 + /* "MDAnalysis/lib/qcprot.pyx":357 * cdef double xy, az, zx, ay, yz, ax * cdef double a3344_4334, a3244_4234, a3243_4233, a3143_4133,a3144_4134, a3142_4132 * cdef double evecprec = 1e-6 # <<<<<<<<<<<<<< @@ -3317,7 +3344,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_evecprec = 1e-6; - /* "MDAnalysis/lib/qcprot.pyx":333 + /* "MDAnalysis/lib/qcprot.pyx":358 * cdef double a3344_4334, a3244_4234, a3243_4233, a3143_4133,a3144_4134, a3142_4132 * cdef double evecprec = 1e-6 * cdef double evalprec = 1e-14 # <<<<<<<<<<<<<< @@ -3326,7 +3353,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_evalprec = 1e-14; - /* "MDAnalysis/lib/qcprot.pyx":336 + /* "MDAnalysis/lib/qcprot.pyx":361 * * cdef double a1324_1423, a1224_1422, a1223_1322, a1124_1421, a1123_1321, a1122_1221 * Sxx = A[0] # <<<<<<<<<<<<<< @@ -3341,11 +3368,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_4 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 336, __pyx_L1_error) + __PYX_ERR(0, 361, __pyx_L1_error) } __pyx_v_Sxx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_4, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":337 + /* "MDAnalysis/lib/qcprot.pyx":362 * cdef double a1324_1423, a1224_1422, a1223_1322, a1124_1421, a1123_1321, a1122_1221 * Sxx = A[0] * Sxy = A[1] # <<<<<<<<<<<<<< @@ -3360,11 +3387,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_6 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 337, __pyx_L1_error) + __PYX_ERR(0, 362, __pyx_L1_error) } __pyx_v_Sxy = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_6, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":338 + /* "MDAnalysis/lib/qcprot.pyx":363 * Sxx = A[0] * Sxy = A[1] * Sxz = A[2] # <<<<<<<<<<<<<< @@ -3379,11 +3406,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_7 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 338, __pyx_L1_error) + __PYX_ERR(0, 363, __pyx_L1_error) } __pyx_v_Sxz = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_7, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":339 + /* "MDAnalysis/lib/qcprot.pyx":364 * Sxy = A[1] * Sxz = A[2] * Syx = A[3] # <<<<<<<<<<<<<< @@ -3398,11 +3425,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_8 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 339, __pyx_L1_error) + __PYX_ERR(0, 364, __pyx_L1_error) } __pyx_v_Syx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":340 + /* "MDAnalysis/lib/qcprot.pyx":365 * Sxz = A[2] * Syx = A[3] * Syy = A[4] # <<<<<<<<<<<<<< @@ -3417,11 +3444,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_9 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 340, __pyx_L1_error) + __PYX_ERR(0, 365, __pyx_L1_error) } __pyx_v_Syy = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":341 + /* "MDAnalysis/lib/qcprot.pyx":366 * Syx = A[3] * Syy = A[4] * Syz = A[5] # <<<<<<<<<<<<<< @@ -3436,11 +3463,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_10 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 341, __pyx_L1_error) + __PYX_ERR(0, 366, __pyx_L1_error) } __pyx_v_Syz = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":342 + /* "MDAnalysis/lib/qcprot.pyx":367 * Syy = A[4] * Syz = A[5] * Szx = A[6] # <<<<<<<<<<<<<< @@ -3455,11 +3482,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_11 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 342, __pyx_L1_error) + __PYX_ERR(0, 367, __pyx_L1_error) } __pyx_v_Szx = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":343 + /* "MDAnalysis/lib/qcprot.pyx":368 * Syz = A[5] * Szx = A[6] * Szy = A[7] # <<<<<<<<<<<<<< @@ -3474,11 +3501,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_12 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 343, __pyx_L1_error) + __PYX_ERR(0, 368, __pyx_L1_error) } __pyx_v_Szy = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":344 + /* "MDAnalysis/lib/qcprot.pyx":369 * Szx = A[6] * Szy = A[7] * Szz = A[8] # <<<<<<<<<<<<<< @@ -3493,11 +3520,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_13 >= __pyx_pybuffernd_A.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 344, __pyx_L1_error) + __PYX_ERR(0, 369, __pyx_L1_error) } __pyx_v_Szz = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_A.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_A.diminfo[0].strides)); - /* "MDAnalysis/lib/qcprot.pyx":346 + /* "MDAnalysis/lib/qcprot.pyx":371 * Szz = A[8] * * Sxx2 = Sxx * Sxx # <<<<<<<<<<<<<< @@ -3506,7 +3533,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Sxx2 = (__pyx_v_Sxx * __pyx_v_Sxx); - /* "MDAnalysis/lib/qcprot.pyx":347 + /* "MDAnalysis/lib/qcprot.pyx":372 * * Sxx2 = Sxx * Sxx * Syy2 = Syy * Syy # <<<<<<<<<<<<<< @@ -3515,7 +3542,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Syy2 = (__pyx_v_Syy * __pyx_v_Syy); - /* "MDAnalysis/lib/qcprot.pyx":348 + /* "MDAnalysis/lib/qcprot.pyx":373 * Sxx2 = Sxx * Sxx * Syy2 = Syy * Syy * Szz2 = Szz * Szz # <<<<<<<<<<<<<< @@ -3524,7 +3551,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Szz2 = (__pyx_v_Szz * __pyx_v_Szz); - /* "MDAnalysis/lib/qcprot.pyx":350 + /* "MDAnalysis/lib/qcprot.pyx":375 * Szz2 = Szz * Szz * * Sxy2 = Sxy * Sxy # <<<<<<<<<<<<<< @@ -3533,7 +3560,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Sxy2 = (__pyx_v_Sxy * __pyx_v_Sxy); - /* "MDAnalysis/lib/qcprot.pyx":351 + /* "MDAnalysis/lib/qcprot.pyx":376 * * Sxy2 = Sxy * Sxy * Syz2 = Syz * Syz # <<<<<<<<<<<<<< @@ -3542,7 +3569,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Syz2 = (__pyx_v_Syz * __pyx_v_Syz); - /* "MDAnalysis/lib/qcprot.pyx":352 + /* "MDAnalysis/lib/qcprot.pyx":377 * Sxy2 = Sxy * Sxy * Syz2 = Syz * Syz * Sxz2 = Sxz * Sxz # <<<<<<<<<<<<<< @@ -3551,7 +3578,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Sxz2 = (__pyx_v_Sxz * __pyx_v_Sxz); - /* "MDAnalysis/lib/qcprot.pyx":354 + /* "MDAnalysis/lib/qcprot.pyx":379 * Sxz2 = Sxz * Sxz * * Syx2 = Syx * Syx # <<<<<<<<<<<<<< @@ -3560,7 +3587,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Syx2 = (__pyx_v_Syx * __pyx_v_Syx); - /* "MDAnalysis/lib/qcprot.pyx":355 + /* "MDAnalysis/lib/qcprot.pyx":380 * * Syx2 = Syx * Syx * Szy2 = Szy * Szy # <<<<<<<<<<<<<< @@ -3569,7 +3596,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Szy2 = (__pyx_v_Szy * __pyx_v_Szy); - /* "MDAnalysis/lib/qcprot.pyx":356 + /* "MDAnalysis/lib/qcprot.pyx":381 * Syx2 = Syx * Syx * Szy2 = Szy * Szy * Szx2 = Szx * Szx # <<<<<<<<<<<<<< @@ -3578,7 +3605,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Szx2 = (__pyx_v_Szx * __pyx_v_Szx); - /* "MDAnalysis/lib/qcprot.pyx":358 + /* "MDAnalysis/lib/qcprot.pyx":383 * Szx2 = Szx * Szx * * SyzSzymSyySzz2 = 2.0 * (Syz*Szy - Syy*Szz) # <<<<<<<<<<<<<< @@ -3587,7 +3614,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SyzSzymSyySzz2 = (2.0 * ((__pyx_v_Syz * __pyx_v_Szy) - (__pyx_v_Syy * __pyx_v_Szz))); - /* "MDAnalysis/lib/qcprot.pyx":359 + /* "MDAnalysis/lib/qcprot.pyx":384 * * SyzSzymSyySzz2 = 2.0 * (Syz*Szy - Syy*Szz) * Sxx2Syy2Szz2Syz2Szy2 = Syy2 + Szz2 - Sxx2 + Syz2 + Szy2 # <<<<<<<<<<<<<< @@ -3596,7 +3623,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Sxx2Syy2Szz2Syz2Szy2 = ((((__pyx_v_Syy2 + __pyx_v_Szz2) - __pyx_v_Sxx2) + __pyx_v_Syz2) + __pyx_v_Szy2); - /* "MDAnalysis/lib/qcprot.pyx":361 + /* "MDAnalysis/lib/qcprot.pyx":386 * Sxx2Syy2Szz2Syz2Szy2 = Syy2 + Szz2 - Sxx2 + Syz2 + Szy2 * * C[2] = -2.0 * (Sxx2 + Syy2 + Szz2 + Sxy2 + Syx2 + Sxz2 + Szx2 + Syz2 + Szy2) # <<<<<<<<<<<<<< @@ -3611,11 +3638,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_C.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 361, __pyx_L1_error) + __PYX_ERR(0, 386, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_C.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_C.diminfo[0].strides) = (-2.0 * ((((((((__pyx_v_Sxx2 + __pyx_v_Syy2) + __pyx_v_Szz2) + __pyx_v_Sxy2) + __pyx_v_Syx2) + __pyx_v_Sxz2) + __pyx_v_Szx2) + __pyx_v_Syz2) + __pyx_v_Szy2)); - /* "MDAnalysis/lib/qcprot.pyx":362 + /* "MDAnalysis/lib/qcprot.pyx":387 * * C[2] = -2.0 * (Sxx2 + Syy2 + Szz2 + Sxy2 + Syx2 + Sxz2 + Szx2 + Syz2 + Szy2) * C[1] = 8.0 * (Sxx*Syz*Szy + Syy*Szx*Sxz + Szz*Sxy*Syx - Sxx*Syy*Szz - Syz*Szx*Sxy - Szy*Syx*Sxz) # <<<<<<<<<<<<<< @@ -3630,11 +3657,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_C.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 362, __pyx_L1_error) + __PYX_ERR(0, 387, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_C.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_C.diminfo[0].strides) = (8.0 * (((((((__pyx_v_Sxx * __pyx_v_Syz) * __pyx_v_Szy) + ((__pyx_v_Syy * __pyx_v_Szx) * __pyx_v_Sxz)) + ((__pyx_v_Szz * __pyx_v_Sxy) * __pyx_v_Syx)) - ((__pyx_v_Sxx * __pyx_v_Syy) * __pyx_v_Szz)) - ((__pyx_v_Syz * __pyx_v_Szx) * __pyx_v_Sxy)) - ((__pyx_v_Szy * __pyx_v_Syx) * __pyx_v_Sxz))); - /* "MDAnalysis/lib/qcprot.pyx":364 + /* "MDAnalysis/lib/qcprot.pyx":389 * C[1] = 8.0 * (Sxx*Syz*Szy + Syy*Szx*Sxz + Szz*Sxy*Syx - Sxx*Syy*Szz - Syz*Szx*Sxy - Szy*Syx*Sxz) * * SxzpSzx = Sxz + Szx # <<<<<<<<<<<<<< @@ -3643,7 +3670,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SxzpSzx = (__pyx_v_Sxz + __pyx_v_Szx); - /* "MDAnalysis/lib/qcprot.pyx":365 + /* "MDAnalysis/lib/qcprot.pyx":390 * * SxzpSzx = Sxz + Szx * SyzpSzy = Syz + Szy # <<<<<<<<<<<<<< @@ -3652,7 +3679,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SyzpSzy = (__pyx_v_Syz + __pyx_v_Szy); - /* "MDAnalysis/lib/qcprot.pyx":366 + /* "MDAnalysis/lib/qcprot.pyx":391 * SxzpSzx = Sxz + Szx * SyzpSzy = Syz + Szy * SxypSyx = Sxy + Syx # <<<<<<<<<<<<<< @@ -3661,7 +3688,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SxypSyx = (__pyx_v_Sxy + __pyx_v_Syx); - /* "MDAnalysis/lib/qcprot.pyx":367 + /* "MDAnalysis/lib/qcprot.pyx":392 * SyzpSzy = Syz + Szy * SxypSyx = Sxy + Syx * SyzmSzy = Syz - Szy # <<<<<<<<<<<<<< @@ -3670,7 +3697,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SyzmSzy = (__pyx_v_Syz - __pyx_v_Szy); - /* "MDAnalysis/lib/qcprot.pyx":368 + /* "MDAnalysis/lib/qcprot.pyx":393 * SxypSyx = Sxy + Syx * SyzmSzy = Syz - Szy * SxzmSzx = Sxz - Szx # <<<<<<<<<<<<<< @@ -3679,7 +3706,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SxzmSzx = (__pyx_v_Sxz - __pyx_v_Szx); - /* "MDAnalysis/lib/qcprot.pyx":369 + /* "MDAnalysis/lib/qcprot.pyx":394 * SyzmSzy = Syz - Szy * SxzmSzx = Sxz - Szx * SxymSyx = Sxy - Syx # <<<<<<<<<<<<<< @@ -3688,7 +3715,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SxymSyx = (__pyx_v_Sxy - __pyx_v_Syx); - /* "MDAnalysis/lib/qcprot.pyx":370 + /* "MDAnalysis/lib/qcprot.pyx":395 * SxzmSzx = Sxz - Szx * SxymSyx = Sxy - Syx * SxxpSyy = Sxx + Syy # <<<<<<<<<<<<<< @@ -3697,7 +3724,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SxxpSyy = (__pyx_v_Sxx + __pyx_v_Syy); - /* "MDAnalysis/lib/qcprot.pyx":371 + /* "MDAnalysis/lib/qcprot.pyx":396 * SxymSyx = Sxy - Syx * SxxpSyy = Sxx + Syy * SxxmSyy = Sxx - Syy # <<<<<<<<<<<<<< @@ -3706,7 +3733,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_SxxmSyy = (__pyx_v_Sxx - __pyx_v_Syy); - /* "MDAnalysis/lib/qcprot.pyx":372 + /* "MDAnalysis/lib/qcprot.pyx":397 * SxxpSyy = Sxx + Syy * SxxmSyy = Sxx - Syy * Sxy2Sxz2Syx2Szx2 = Sxy2 + Sxz2 - Syx2 - Szx2 # <<<<<<<<<<<<<< @@ -3715,7 +3742,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_Sxy2Sxz2Syx2Szx2 = (((__pyx_v_Sxy2 + __pyx_v_Sxz2) - __pyx_v_Syx2) - __pyx_v_Szx2); - /* "MDAnalysis/lib/qcprot.pyx":374 + /* "MDAnalysis/lib/qcprot.pyx":399 * Sxy2Sxz2Syx2Szx2 = Sxy2 + Sxz2 - Syx2 - Szx2 * * C[0] = (Sxy2Sxz2Syx2Szx2 * Sxy2Sxz2Syx2Szx2 # <<<<<<<<<<<<<< @@ -3730,11 +3757,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_C.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 374, __pyx_L1_error) + __PYX_ERR(0, 399, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_C.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_C.diminfo[0].strides) = ((((((__pyx_v_Sxy2Sxz2Syx2Szx2 * __pyx_v_Sxy2Sxz2Syx2Szx2) + ((__pyx_v_Sxx2Syy2Szz2Syz2Szy2 + __pyx_v_SyzSzymSyySzz2) * (__pyx_v_Sxx2Syy2Szz2Syz2Szy2 - __pyx_v_SyzSzymSyySzz2))) + ((((-__pyx_v_SxzpSzx) * __pyx_v_SyzmSzy) + (__pyx_v_SxymSyx * (__pyx_v_SxxmSyy - __pyx_v_Szz))) * (((-__pyx_v_SxzmSzx) * __pyx_v_SyzpSzy) + (__pyx_v_SxymSyx * (__pyx_v_SxxmSyy + __pyx_v_Szz))))) + ((((-__pyx_v_SxzpSzx) * __pyx_v_SyzpSzy) - (__pyx_v_SxypSyx * (__pyx_v_SxxpSyy - __pyx_v_Szz))) * (((-__pyx_v_SxzmSzx) * __pyx_v_SyzmSzy) - (__pyx_v_SxypSyx * (__pyx_v_SxxpSyy + __pyx_v_Szz))))) + (((__pyx_v_SxypSyx * __pyx_v_SyzpSzy) + (__pyx_v_SxzpSzx * (__pyx_v_SxxmSyy + __pyx_v_Szz))) * (((-__pyx_v_SxymSyx) * __pyx_v_SyzmSzy) + (__pyx_v_SxzpSzx * (__pyx_v_SxxpSyy + __pyx_v_Szz))))) + (((__pyx_v_SxypSyx * __pyx_v_SyzmSzy) + (__pyx_v_SxzmSzx * (__pyx_v_SxxmSyy - __pyx_v_Szz))) * (((-__pyx_v_SxymSyx) * __pyx_v_SyzpSzy) + (__pyx_v_SxzmSzx * (__pyx_v_SxxpSyy - __pyx_v_Szz))))); - /* "MDAnalysis/lib/qcprot.pyx":381 + /* "MDAnalysis/lib/qcprot.pyx":406 * + (+(SxypSyx)*(SyzmSzy)+(SxzmSzx)*(SxxmSyy-Szz)) * (-(SxymSyx)*(SyzpSzy)+(SxzmSzx)*(SxxpSyy-Szz))) * * mxEigenV = E0 # <<<<<<<<<<<<<< @@ -3743,7 +3770,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_mxEigenV = __pyx_v_E0; - /* "MDAnalysis/lib/qcprot.pyx":382 + /* "MDAnalysis/lib/qcprot.pyx":407 * * mxEigenV = E0 * for i in range(50): # <<<<<<<<<<<<<< @@ -3753,7 +3780,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT for (__pyx_t_17 = 0; __pyx_t_17 < 50; __pyx_t_17+=1) { __pyx_v_i = __pyx_t_17; - /* "MDAnalysis/lib/qcprot.pyx":383 + /* "MDAnalysis/lib/qcprot.pyx":408 * mxEigenV = E0 * for i in range(50): * oldg = mxEigenV # <<<<<<<<<<<<<< @@ -3762,7 +3789,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_oldg = __pyx_v_mxEigenV; - /* "MDAnalysis/lib/qcprot.pyx":384 + /* "MDAnalysis/lib/qcprot.pyx":409 * for i in range(50): * oldg = mxEigenV * x2 = mxEigenV*mxEigenV # <<<<<<<<<<<<<< @@ -3771,7 +3798,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_x2 = (__pyx_v_mxEigenV * __pyx_v_mxEigenV); - /* "MDAnalysis/lib/qcprot.pyx":385 + /* "MDAnalysis/lib/qcprot.pyx":410 * oldg = mxEigenV * x2 = mxEigenV*mxEigenV * b = (x2 + C[2])*mxEigenV # <<<<<<<<<<<<<< @@ -3786,11 +3813,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_18 >= __pyx_pybuffernd_C.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 385, __pyx_L1_error) + __PYX_ERR(0, 410, __pyx_L1_error) } __pyx_v_b = ((__pyx_v_x2 + (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_C.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_C.diminfo[0].strides))) * __pyx_v_mxEigenV); - /* "MDAnalysis/lib/qcprot.pyx":386 + /* "MDAnalysis/lib/qcprot.pyx":411 * x2 = mxEigenV*mxEigenV * b = (x2 + C[2])*mxEigenV * a = b + C[1] # <<<<<<<<<<<<<< @@ -3805,11 +3832,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_19 >= __pyx_pybuffernd_C.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 386, __pyx_L1_error) + __PYX_ERR(0, 411, __pyx_L1_error) } __pyx_v_a = (__pyx_v_b + (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_C.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_C.diminfo[0].strides))); - /* "MDAnalysis/lib/qcprot.pyx":387 + /* "MDAnalysis/lib/qcprot.pyx":412 * b = (x2 + C[2])*mxEigenV * a = b + C[1] * delta = ((a*mxEigenV + C[0])/(2.0*x2*mxEigenV + b + a)) # <<<<<<<<<<<<<< @@ -3824,17 +3851,17 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_20 >= __pyx_pybuffernd_C.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 387, __pyx_L1_error) + __PYX_ERR(0, 412, __pyx_L1_error) } __pyx_t_21 = ((__pyx_v_a * __pyx_v_mxEigenV) + (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_C.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_C.diminfo[0].strides))); __pyx_t_22 = ((((2.0 * __pyx_v_x2) * __pyx_v_mxEigenV) + __pyx_v_b) + __pyx_v_a); if (unlikely(__pyx_t_22 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 387, __pyx_L1_error) + __PYX_ERR(0, 412, __pyx_L1_error) } __pyx_v_delta = (__pyx_t_21 / __pyx_t_22); - /* "MDAnalysis/lib/qcprot.pyx":388 + /* "MDAnalysis/lib/qcprot.pyx":413 * a = b + C[1] * delta = ((a*mxEigenV + C[0])/(2.0*x2*mxEigenV + b + a)) * mxEigenV -= delta # <<<<<<<<<<<<<< @@ -3843,7 +3870,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_mxEigenV = (__pyx_v_mxEigenV - __pyx_v_delta); - /* "MDAnalysis/lib/qcprot.pyx":389 + /* "MDAnalysis/lib/qcprot.pyx":414 * delta = ((a*mxEigenV + C[0])/(2.0*x2*mxEigenV + b + a)) * mxEigenV -= delta * if (fabs(mxEigenV - oldg) < fabs((evalprec)*mxEigenV)): # <<<<<<<<<<<<<< @@ -3853,7 +3880,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_t_23 = ((fabs((__pyx_v_mxEigenV - __pyx_v_oldg)) < fabs((__pyx_v_evalprec * __pyx_v_mxEigenV))) != 0); if (__pyx_t_23) { - /* "MDAnalysis/lib/qcprot.pyx":390 + /* "MDAnalysis/lib/qcprot.pyx":415 * mxEigenV -= delta * if (fabs(mxEigenV - oldg) < fabs((evalprec)*mxEigenV)): * break # <<<<<<<<<<<<<< @@ -3862,7 +3889,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ goto __pyx_L4_break; - /* "MDAnalysis/lib/qcprot.pyx":389 + /* "MDAnalysis/lib/qcprot.pyx":414 * delta = ((a*mxEigenV + C[0])/(2.0*x2*mxEigenV + b + a)) * mxEigenV -= delta * if (fabs(mxEigenV - oldg) < fabs((evalprec)*mxEigenV)): # <<<<<<<<<<<<<< @@ -3873,7 +3900,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } __pyx_L4_break:; - /* "MDAnalysis/lib/qcprot.pyx":397 + /* "MDAnalysis/lib/qcprot.pyx":422 * # the fabs() is to guard against extremely small, * # but *negative* numbers due to floating point error * rms = sqrt(fabs(2.0 * (E0 - mxEigenV)/N)) # <<<<<<<<<<<<<< @@ -3883,11 +3910,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_t_22 = (2.0 * (__pyx_v_E0 - __pyx_v_mxEigenV)); if (unlikely(__pyx_v_N == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 397, __pyx_L1_error) + __PYX_ERR(0, 422, __pyx_L1_error) } __pyx_v_rms = sqrt(fabs((__pyx_t_22 / __pyx_v_N))); - /* "MDAnalysis/lib/qcprot.pyx":399 + /* "MDAnalysis/lib/qcprot.pyx":424 * rms = sqrt(fabs(2.0 * (E0 - mxEigenV)/N)) * * if (rot is None): # <<<<<<<<<<<<<< @@ -3898,7 +3925,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_t_24 = (__pyx_t_23 != 0); if (__pyx_t_24) { - /* "MDAnalysis/lib/qcprot.pyx":400 + /* "MDAnalysis/lib/qcprot.pyx":425 * * if (rot is None): * return rms # Don't bother with rotation. # <<<<<<<<<<<<<< @@ -3906,13 +3933,13 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT * a11 = SxxpSyy + Szz-mxEigenV */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyFloat_FromDouble(__pyx_v_rms); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 400, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_rms); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 425, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/qcprot.pyx":399 + /* "MDAnalysis/lib/qcprot.pyx":424 * rms = sqrt(fabs(2.0 * (E0 - mxEigenV)/N)) * * if (rot is None): # <<<<<<<<<<<<<< @@ -3921,7 +3948,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ } - /* "MDAnalysis/lib/qcprot.pyx":402 + /* "MDAnalysis/lib/qcprot.pyx":427 * return rms # Don't bother with rotation. * * a11 = SxxpSyy + Szz-mxEigenV # <<<<<<<<<<<<<< @@ -3930,7 +3957,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a11 = ((__pyx_v_SxxpSyy + __pyx_v_Szz) - __pyx_v_mxEigenV); - /* "MDAnalysis/lib/qcprot.pyx":403 + /* "MDAnalysis/lib/qcprot.pyx":428 * * a11 = SxxpSyy + Szz-mxEigenV * a12 = SyzmSzy # <<<<<<<<<<<<<< @@ -3939,7 +3966,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a12 = __pyx_v_SyzmSzy; - /* "MDAnalysis/lib/qcprot.pyx":404 + /* "MDAnalysis/lib/qcprot.pyx":429 * a11 = SxxpSyy + Szz-mxEigenV * a12 = SyzmSzy * a13 = - SxzmSzx # <<<<<<<<<<<<<< @@ -3948,7 +3975,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a13 = (-__pyx_v_SxzmSzx); - /* "MDAnalysis/lib/qcprot.pyx":405 + /* "MDAnalysis/lib/qcprot.pyx":430 * a12 = SyzmSzy * a13 = - SxzmSzx * a14 = SxymSyx # <<<<<<<<<<<<<< @@ -3957,7 +3984,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a14 = __pyx_v_SxymSyx; - /* "MDAnalysis/lib/qcprot.pyx":406 + /* "MDAnalysis/lib/qcprot.pyx":431 * a13 = - SxzmSzx * a14 = SxymSyx * a21 = SyzmSzy # <<<<<<<<<<<<<< @@ -3966,7 +3993,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a21 = __pyx_v_SyzmSzy; - /* "MDAnalysis/lib/qcprot.pyx":407 + /* "MDAnalysis/lib/qcprot.pyx":432 * a14 = SxymSyx * a21 = SyzmSzy * a22 = SxxmSyy - Szz-mxEigenV # <<<<<<<<<<<<<< @@ -3975,7 +4002,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a22 = ((__pyx_v_SxxmSyy - __pyx_v_Szz) - __pyx_v_mxEigenV); - /* "MDAnalysis/lib/qcprot.pyx":408 + /* "MDAnalysis/lib/qcprot.pyx":433 * a21 = SyzmSzy * a22 = SxxmSyy - Szz-mxEigenV * a23 = SxypSyx # <<<<<<<<<<<<<< @@ -3984,7 +4011,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a23 = __pyx_v_SxypSyx; - /* "MDAnalysis/lib/qcprot.pyx":409 + /* "MDAnalysis/lib/qcprot.pyx":434 * a22 = SxxmSyy - Szz-mxEigenV * a23 = SxypSyx * a24= SxzpSzx # <<<<<<<<<<<<<< @@ -3993,7 +4020,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a24 = __pyx_v_SxzpSzx; - /* "MDAnalysis/lib/qcprot.pyx":410 + /* "MDAnalysis/lib/qcprot.pyx":435 * a23 = SxypSyx * a24= SxzpSzx * a31 = a13 # <<<<<<<<<<<<<< @@ -4002,7 +4029,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a31 = __pyx_v_a13; - /* "MDAnalysis/lib/qcprot.pyx":411 + /* "MDAnalysis/lib/qcprot.pyx":436 * a24= SxzpSzx * a31 = a13 * a32 = a23 # <<<<<<<<<<<<<< @@ -4011,7 +4038,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a32 = __pyx_v_a23; - /* "MDAnalysis/lib/qcprot.pyx":412 + /* "MDAnalysis/lib/qcprot.pyx":437 * a31 = a13 * a32 = a23 * a33 = Syy-Sxx-Szz - mxEigenV # <<<<<<<<<<<<<< @@ -4020,7 +4047,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a33 = (((__pyx_v_Syy - __pyx_v_Sxx) - __pyx_v_Szz) - __pyx_v_mxEigenV); - /* "MDAnalysis/lib/qcprot.pyx":413 + /* "MDAnalysis/lib/qcprot.pyx":438 * a32 = a23 * a33 = Syy-Sxx-Szz - mxEigenV * a34 = SyzpSzy # <<<<<<<<<<<<<< @@ -4029,7 +4056,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a34 = __pyx_v_SyzpSzy; - /* "MDAnalysis/lib/qcprot.pyx":414 + /* "MDAnalysis/lib/qcprot.pyx":439 * a33 = Syy-Sxx-Szz - mxEigenV * a34 = SyzpSzy * a41 = a14 # <<<<<<<<<<<<<< @@ -4038,7 +4065,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a41 = __pyx_v_a14; - /* "MDAnalysis/lib/qcprot.pyx":415 + /* "MDAnalysis/lib/qcprot.pyx":440 * a34 = SyzpSzy * a41 = a14 * a42 = a24 # <<<<<<<<<<<<<< @@ -4047,7 +4074,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a42 = __pyx_v_a24; - /* "MDAnalysis/lib/qcprot.pyx":416 + /* "MDAnalysis/lib/qcprot.pyx":441 * a41 = a14 * a42 = a24 * a43 = a34 # <<<<<<<<<<<<<< @@ -4056,7 +4083,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a43 = __pyx_v_a34; - /* "MDAnalysis/lib/qcprot.pyx":417 + /* "MDAnalysis/lib/qcprot.pyx":442 * a42 = a24 * a43 = a34 * a44 = Szz - SxxpSyy - mxEigenV # <<<<<<<<<<<<<< @@ -4065,7 +4092,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a44 = ((__pyx_v_Szz - __pyx_v_SxxpSyy) - __pyx_v_mxEigenV); - /* "MDAnalysis/lib/qcprot.pyx":418 + /* "MDAnalysis/lib/qcprot.pyx":443 * a43 = a34 * a44 = Szz - SxxpSyy - mxEigenV * a3344_4334 = a33 * a44 - a43 * a34 # <<<<<<<<<<<<<< @@ -4074,7 +4101,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a3344_4334 = ((__pyx_v_a33 * __pyx_v_a44) - (__pyx_v_a43 * __pyx_v_a34)); - /* "MDAnalysis/lib/qcprot.pyx":419 + /* "MDAnalysis/lib/qcprot.pyx":444 * a44 = Szz - SxxpSyy - mxEigenV * a3344_4334 = a33 * a44 - a43 * a34 * a3244_4234 = a32 * a44-a42*a34 # <<<<<<<<<<<<<< @@ -4083,7 +4110,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a3244_4234 = ((__pyx_v_a32 * __pyx_v_a44) - (__pyx_v_a42 * __pyx_v_a34)); - /* "MDAnalysis/lib/qcprot.pyx":420 + /* "MDAnalysis/lib/qcprot.pyx":445 * a3344_4334 = a33 * a44 - a43 * a34 * a3244_4234 = a32 * a44-a42*a34 * a3243_4233 = a32 * a43 - a42 * a33 # <<<<<<<<<<<<<< @@ -4092,7 +4119,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a3243_4233 = ((__pyx_v_a32 * __pyx_v_a43) - (__pyx_v_a42 * __pyx_v_a33)); - /* "MDAnalysis/lib/qcprot.pyx":421 + /* "MDAnalysis/lib/qcprot.pyx":446 * a3244_4234 = a32 * a44-a42*a34 * a3243_4233 = a32 * a43 - a42 * a33 * a3143_4133 = a31 * a43-a41*a33 # <<<<<<<<<<<<<< @@ -4101,7 +4128,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a3143_4133 = ((__pyx_v_a31 * __pyx_v_a43) - (__pyx_v_a41 * __pyx_v_a33)); - /* "MDAnalysis/lib/qcprot.pyx":422 + /* "MDAnalysis/lib/qcprot.pyx":447 * a3243_4233 = a32 * a43 - a42 * a33 * a3143_4133 = a31 * a43-a41*a33 * a3144_4134 = a31 * a44 - a41 * a34 # <<<<<<<<<<<<<< @@ -4110,7 +4137,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a3144_4134 = ((__pyx_v_a31 * __pyx_v_a44) - (__pyx_v_a41 * __pyx_v_a34)); - /* "MDAnalysis/lib/qcprot.pyx":423 + /* "MDAnalysis/lib/qcprot.pyx":448 * a3143_4133 = a31 * a43-a41*a33 * a3144_4134 = a31 * a44 - a41 * a34 * a3142_4132 = a31 * a42-a41*a32 # <<<<<<<<<<<<<< @@ -4119,7 +4146,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a3142_4132 = ((__pyx_v_a31 * __pyx_v_a42) - (__pyx_v_a41 * __pyx_v_a32)); - /* "MDAnalysis/lib/qcprot.pyx":424 + /* "MDAnalysis/lib/qcprot.pyx":449 * a3144_4134 = a31 * a44 - a41 * a34 * a3142_4132 = a31 * a42-a41*a32 * q1 = a22*a3344_4334-a23*a3244_4234+a24*a3243_4233 # <<<<<<<<<<<<<< @@ -4128,7 +4155,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q1 = (((__pyx_v_a22 * __pyx_v_a3344_4334) - (__pyx_v_a23 * __pyx_v_a3244_4234)) + (__pyx_v_a24 * __pyx_v_a3243_4233)); - /* "MDAnalysis/lib/qcprot.pyx":425 + /* "MDAnalysis/lib/qcprot.pyx":450 * a3142_4132 = a31 * a42-a41*a32 * q1 = a22*a3344_4334-a23*a3244_4234+a24*a3243_4233 * q2 = -a21*a3344_4334+a23*a3144_4134-a24*a3143_4133 # <<<<<<<<<<<<<< @@ -4137,7 +4164,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q2 = ((((-__pyx_v_a21) * __pyx_v_a3344_4334) + (__pyx_v_a23 * __pyx_v_a3144_4134)) - (__pyx_v_a24 * __pyx_v_a3143_4133)); - /* "MDAnalysis/lib/qcprot.pyx":426 + /* "MDAnalysis/lib/qcprot.pyx":451 * q1 = a22*a3344_4334-a23*a3244_4234+a24*a3243_4233 * q2 = -a21*a3344_4334+a23*a3144_4134-a24*a3143_4133 * q3 = a21*a3244_4234-a22*a3144_4134+a24*a3142_4132 # <<<<<<<<<<<<<< @@ -4146,7 +4173,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q3 = (((__pyx_v_a21 * __pyx_v_a3244_4234) - (__pyx_v_a22 * __pyx_v_a3144_4134)) + (__pyx_v_a24 * __pyx_v_a3142_4132)); - /* "MDAnalysis/lib/qcprot.pyx":427 + /* "MDAnalysis/lib/qcprot.pyx":452 * q2 = -a21*a3344_4334+a23*a3144_4134-a24*a3143_4133 * q3 = a21*a3244_4234-a22*a3144_4134+a24*a3142_4132 * q4 = -a21*a3243_4233+a22*a3143_4133-a23*a3142_4132 # <<<<<<<<<<<<<< @@ -4155,7 +4182,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q4 = ((((-__pyx_v_a21) * __pyx_v_a3243_4233) + (__pyx_v_a22 * __pyx_v_a3143_4133)) - (__pyx_v_a23 * __pyx_v_a3142_4132)); - /* "MDAnalysis/lib/qcprot.pyx":429 + /* "MDAnalysis/lib/qcprot.pyx":454 * q4 = -a21*a3243_4233+a22*a3143_4133-a23*a3142_4132 * * qsqr = q1 * q1 + q2 * q2 + q3 * q3 + q4 * q4 # <<<<<<<<<<<<<< @@ -4164,7 +4191,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_qsqr = ((((__pyx_v_q1 * __pyx_v_q1) + (__pyx_v_q2 * __pyx_v_q2)) + (__pyx_v_q3 * __pyx_v_q3)) + (__pyx_v_q4 * __pyx_v_q4)); - /* "MDAnalysis/lib/qcprot.pyx":436 + /* "MDAnalysis/lib/qcprot.pyx":461 * # uncommented, but it is most likely unnecessary. * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4174,7 +4201,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_t_24 = ((__pyx_v_qsqr < __pyx_v_evecprec) != 0); if (__pyx_t_24) { - /* "MDAnalysis/lib/qcprot.pyx":437 + /* "MDAnalysis/lib/qcprot.pyx":462 * * if (qsqr < evecprec): * q1 = a12*a3344_4334 - a13*a3244_4234 + a14*a3243_4233 # <<<<<<<<<<<<<< @@ -4183,7 +4210,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q1 = (((__pyx_v_a12 * __pyx_v_a3344_4334) - (__pyx_v_a13 * __pyx_v_a3244_4234)) + (__pyx_v_a14 * __pyx_v_a3243_4233)); - /* "MDAnalysis/lib/qcprot.pyx":438 + /* "MDAnalysis/lib/qcprot.pyx":463 * if (qsqr < evecprec): * q1 = a12*a3344_4334 - a13*a3244_4234 + a14*a3243_4233 * q2 = -a11*a3344_4334 + a13*a3144_4134 - a14*a3143_4133 # <<<<<<<<<<<<<< @@ -4192,7 +4219,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q2 = ((((-__pyx_v_a11) * __pyx_v_a3344_4334) + (__pyx_v_a13 * __pyx_v_a3144_4134)) - (__pyx_v_a14 * __pyx_v_a3143_4133)); - /* "MDAnalysis/lib/qcprot.pyx":439 + /* "MDAnalysis/lib/qcprot.pyx":464 * q1 = a12*a3344_4334 - a13*a3244_4234 + a14*a3243_4233 * q2 = -a11*a3344_4334 + a13*a3144_4134 - a14*a3143_4133 * q3 = a11*a3244_4234 - a12*a3144_4134 + a14*a3142_4132 # <<<<<<<<<<<<<< @@ -4201,7 +4228,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q3 = (((__pyx_v_a11 * __pyx_v_a3244_4234) - (__pyx_v_a12 * __pyx_v_a3144_4134)) + (__pyx_v_a14 * __pyx_v_a3142_4132)); - /* "MDAnalysis/lib/qcprot.pyx":440 + /* "MDAnalysis/lib/qcprot.pyx":465 * q2 = -a11*a3344_4334 + a13*a3144_4134 - a14*a3143_4133 * q3 = a11*a3244_4234 - a12*a3144_4134 + a14*a3142_4132 * q4 = -a11*a3243_4233 + a12*a3143_4133 - a13*a3142_4132 # <<<<<<<<<<<<<< @@ -4210,7 +4237,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q4 = ((((-__pyx_v_a11) * __pyx_v_a3243_4233) + (__pyx_v_a12 * __pyx_v_a3143_4133)) - (__pyx_v_a13 * __pyx_v_a3142_4132)); - /* "MDAnalysis/lib/qcprot.pyx":441 + /* "MDAnalysis/lib/qcprot.pyx":466 * q3 = a11*a3244_4234 - a12*a3144_4134 + a14*a3142_4132 * q4 = -a11*a3243_4233 + a12*a3143_4133 - a13*a3142_4132 * qsqr = q1*q1 + q2 *q2 + q3*q3+q4*q4 # <<<<<<<<<<<<<< @@ -4219,7 +4246,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_qsqr = ((((__pyx_v_q1 * __pyx_v_q1) + (__pyx_v_q2 * __pyx_v_q2)) + (__pyx_v_q3 * __pyx_v_q3)) + (__pyx_v_q4 * __pyx_v_q4)); - /* "MDAnalysis/lib/qcprot.pyx":443 + /* "MDAnalysis/lib/qcprot.pyx":468 * qsqr = q1*q1 + q2 *q2 + q3*q3+q4*q4 * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4229,7 +4256,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_t_24 = ((__pyx_v_qsqr < __pyx_v_evecprec) != 0); if (__pyx_t_24) { - /* "MDAnalysis/lib/qcprot.pyx":444 + /* "MDAnalysis/lib/qcprot.pyx":469 * * if (qsqr < evecprec): * a1324_1423 = a13 * a24 - a14 * a23 # <<<<<<<<<<<<<< @@ -4238,7 +4265,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a1324_1423 = ((__pyx_v_a13 * __pyx_v_a24) - (__pyx_v_a14 * __pyx_v_a23)); - /* "MDAnalysis/lib/qcprot.pyx":445 + /* "MDAnalysis/lib/qcprot.pyx":470 * if (qsqr < evecprec): * a1324_1423 = a13 * a24 - a14 * a23 * a1224_1422 = a12 * a24 - a14 * a22 # <<<<<<<<<<<<<< @@ -4247,7 +4274,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a1224_1422 = ((__pyx_v_a12 * __pyx_v_a24) - (__pyx_v_a14 * __pyx_v_a22)); - /* "MDAnalysis/lib/qcprot.pyx":446 + /* "MDAnalysis/lib/qcprot.pyx":471 * a1324_1423 = a13 * a24 - a14 * a23 * a1224_1422 = a12 * a24 - a14 * a22 * a1223_1322 = a12 * a23 - a13 * a22 # <<<<<<<<<<<<<< @@ -4256,7 +4283,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a1223_1322 = ((__pyx_v_a12 * __pyx_v_a23) - (__pyx_v_a13 * __pyx_v_a22)); - /* "MDAnalysis/lib/qcprot.pyx":447 + /* "MDAnalysis/lib/qcprot.pyx":472 * a1224_1422 = a12 * a24 - a14 * a22 * a1223_1322 = a12 * a23 - a13 * a22 * a1124_1421 = a11 * a24 - a14 * a21 # <<<<<<<<<<<<<< @@ -4265,7 +4292,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a1124_1421 = ((__pyx_v_a11 * __pyx_v_a24) - (__pyx_v_a14 * __pyx_v_a21)); - /* "MDAnalysis/lib/qcprot.pyx":448 + /* "MDAnalysis/lib/qcprot.pyx":473 * a1223_1322 = a12 * a23 - a13 * a22 * a1124_1421 = a11 * a24 - a14 * a21 * a1123_1321 = a11 * a23 - a13 * a21 # <<<<<<<<<<<<<< @@ -4274,7 +4301,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a1123_1321 = ((__pyx_v_a11 * __pyx_v_a23) - (__pyx_v_a13 * __pyx_v_a21)); - /* "MDAnalysis/lib/qcprot.pyx":449 + /* "MDAnalysis/lib/qcprot.pyx":474 * a1124_1421 = a11 * a24 - a14 * a21 * a1123_1321 = a11 * a23 - a13 * a21 * a1122_1221 = a11 * a22 - a12 * a21 # <<<<<<<<<<<<<< @@ -4283,7 +4310,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a1122_1221 = ((__pyx_v_a11 * __pyx_v_a22) - (__pyx_v_a12 * __pyx_v_a21)); - /* "MDAnalysis/lib/qcprot.pyx":451 + /* "MDAnalysis/lib/qcprot.pyx":476 * a1122_1221 = a11 * a22 - a12 * a21 * * q1 = a42 * a1324_1423 - a43 * a1224_1422 + a44 * a1223_1322 # <<<<<<<<<<<<<< @@ -4292,7 +4319,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q1 = (((__pyx_v_a42 * __pyx_v_a1324_1423) - (__pyx_v_a43 * __pyx_v_a1224_1422)) + (__pyx_v_a44 * __pyx_v_a1223_1322)); - /* "MDAnalysis/lib/qcprot.pyx":452 + /* "MDAnalysis/lib/qcprot.pyx":477 * * q1 = a42 * a1324_1423 - a43 * a1224_1422 + a44 * a1223_1322 * q2 = -a41 * a1324_1423 + a43 * a1124_1421 - a44 * a1123_1321 # <<<<<<<<<<<<<< @@ -4301,7 +4328,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q2 = ((((-__pyx_v_a41) * __pyx_v_a1324_1423) + (__pyx_v_a43 * __pyx_v_a1124_1421)) - (__pyx_v_a44 * __pyx_v_a1123_1321)); - /* "MDAnalysis/lib/qcprot.pyx":453 + /* "MDAnalysis/lib/qcprot.pyx":478 * q1 = a42 * a1324_1423 - a43 * a1224_1422 + a44 * a1223_1322 * q2 = -a41 * a1324_1423 + a43 * a1124_1421 - a44 * a1123_1321 * q3 = a41 * a1224_1422 - a42 * a1124_1421 + a44 * a1122_1221 # <<<<<<<<<<<<<< @@ -4310,7 +4337,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q3 = (((__pyx_v_a41 * __pyx_v_a1224_1422) - (__pyx_v_a42 * __pyx_v_a1124_1421)) + (__pyx_v_a44 * __pyx_v_a1122_1221)); - /* "MDAnalysis/lib/qcprot.pyx":454 + /* "MDAnalysis/lib/qcprot.pyx":479 * q2 = -a41 * a1324_1423 + a43 * a1124_1421 - a44 * a1123_1321 * q3 = a41 * a1224_1422 - a42 * a1124_1421 + a44 * a1122_1221 * q4 = -a41 * a1223_1322 + a42 * a1123_1321 - a43 * a1122_1221 # <<<<<<<<<<<<<< @@ -4319,7 +4346,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q4 = ((((-__pyx_v_a41) * __pyx_v_a1223_1322) + (__pyx_v_a42 * __pyx_v_a1123_1321)) - (__pyx_v_a43 * __pyx_v_a1122_1221)); - /* "MDAnalysis/lib/qcprot.pyx":455 + /* "MDAnalysis/lib/qcprot.pyx":480 * q3 = a41 * a1224_1422 - a42 * a1124_1421 + a44 * a1122_1221 * q4 = -a41 * a1223_1322 + a42 * a1123_1321 - a43 * a1122_1221 * qsqr = q1*q1 + q2 *q2 + q3*q3+q4*q4 # <<<<<<<<<<<<<< @@ -4328,7 +4355,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_qsqr = ((((__pyx_v_q1 * __pyx_v_q1) + (__pyx_v_q2 * __pyx_v_q2)) + (__pyx_v_q3 * __pyx_v_q3)) + (__pyx_v_q4 * __pyx_v_q4)); - /* "MDAnalysis/lib/qcprot.pyx":457 + /* "MDAnalysis/lib/qcprot.pyx":482 * qsqr = q1*q1 + q2 *q2 + q3*q3+q4*q4 * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4338,7 +4365,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_t_24 = ((__pyx_v_qsqr < __pyx_v_evecprec) != 0); if (__pyx_t_24) { - /* "MDAnalysis/lib/qcprot.pyx":458 + /* "MDAnalysis/lib/qcprot.pyx":483 * * if (qsqr < evecprec): * q1 = a32 * a1324_1423 - a33 * a1224_1422 + a34 * a1223_1322 # <<<<<<<<<<<<<< @@ -4347,7 +4374,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q1 = (((__pyx_v_a32 * __pyx_v_a1324_1423) - (__pyx_v_a33 * __pyx_v_a1224_1422)) + (__pyx_v_a34 * __pyx_v_a1223_1322)); - /* "MDAnalysis/lib/qcprot.pyx":459 + /* "MDAnalysis/lib/qcprot.pyx":484 * if (qsqr < evecprec): * q1 = a32 * a1324_1423 - a33 * a1224_1422 + a34 * a1223_1322 * q2 = -a31 * a1324_1423 + a33 * a1124_1421 - a34 * a1123_1321 # <<<<<<<<<<<<<< @@ -4356,7 +4383,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q2 = ((((-__pyx_v_a31) * __pyx_v_a1324_1423) + (__pyx_v_a33 * __pyx_v_a1124_1421)) - (__pyx_v_a34 * __pyx_v_a1123_1321)); - /* "MDAnalysis/lib/qcprot.pyx":460 + /* "MDAnalysis/lib/qcprot.pyx":485 * q1 = a32 * a1324_1423 - a33 * a1224_1422 + a34 * a1223_1322 * q2 = -a31 * a1324_1423 + a33 * a1124_1421 - a34 * a1123_1321 * q3 = a31 * a1224_1422 - a32 * a1124_1421 + a34 * a1122_1221 # <<<<<<<<<<<<<< @@ -4365,7 +4392,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q3 = (((__pyx_v_a31 * __pyx_v_a1224_1422) - (__pyx_v_a32 * __pyx_v_a1124_1421)) + (__pyx_v_a34 * __pyx_v_a1122_1221)); - /* "MDAnalysis/lib/qcprot.pyx":461 + /* "MDAnalysis/lib/qcprot.pyx":486 * q2 = -a31 * a1324_1423 + a33 * a1124_1421 - a34 * a1123_1321 * q3 = a31 * a1224_1422 - a32 * a1124_1421 + a34 * a1122_1221 * q4 = -a31 * a1223_1322 + a32 * a1123_1321 - a33 * a1122_1221 # <<<<<<<<<<<<<< @@ -4374,7 +4401,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_q4 = ((((-__pyx_v_a31) * __pyx_v_a1223_1322) + (__pyx_v_a32 * __pyx_v_a1123_1321)) - (__pyx_v_a33 * __pyx_v_a1122_1221)); - /* "MDAnalysis/lib/qcprot.pyx":462 + /* "MDAnalysis/lib/qcprot.pyx":487 * q3 = a31 * a1224_1422 - a32 * a1124_1421 + a34 * a1122_1221 * q4 = -a31 * a1223_1322 + a32 * a1123_1321 - a33 * a1122_1221 * qsqr = q1*q1 + q2 *q2 + q3*q3 + q4*q4 # <<<<<<<<<<<<<< @@ -4383,7 +4410,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_qsqr = ((((__pyx_v_q1 * __pyx_v_q1) + (__pyx_v_q2 * __pyx_v_q2)) + (__pyx_v_q3 * __pyx_v_q3)) + (__pyx_v_q4 * __pyx_v_q4)); - /* "MDAnalysis/lib/qcprot.pyx":464 + /* "MDAnalysis/lib/qcprot.pyx":489 * qsqr = q1*q1 + q2 *q2 + q3*q3 + q4*q4 * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4393,7 +4420,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_t_24 = ((__pyx_v_qsqr < __pyx_v_evecprec) != 0); if (__pyx_t_24) { - /* "MDAnalysis/lib/qcprot.pyx":466 + /* "MDAnalysis/lib/qcprot.pyx":491 * if (qsqr < evecprec): * # if qsqr is still too small, return the identity matrix. # * rot[0] = rot[4] = rot[8] = 1.0 # <<<<<<<<<<<<<< @@ -4408,7 +4435,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_25 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 466, __pyx_L1_error) + __PYX_ERR(0, 491, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_rot.diminfo[0].strides) = 1.0; __pyx_t_26 = 4; @@ -4419,7 +4446,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_26 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 466, __pyx_L1_error) + __PYX_ERR(0, 491, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_rot.diminfo[0].strides) = 1.0; __pyx_t_27 = 8; @@ -4430,11 +4457,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_27 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 466, __pyx_L1_error) + __PYX_ERR(0, 491, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_27, __pyx_pybuffernd_rot.diminfo[0].strides) = 1.0; - /* "MDAnalysis/lib/qcprot.pyx":467 + /* "MDAnalysis/lib/qcprot.pyx":492 * # if qsqr is still too small, return the identity matrix. # * rot[0] = rot[4] = rot[8] = 1.0 * rot[1] = rot[2] = rot[3] = rot[5] = rot[6] = rot[7] = 0.0 # <<<<<<<<<<<<<< @@ -4449,7 +4476,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_28 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 467, __pyx_L1_error) + __PYX_ERR(0, 492, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_28, __pyx_pybuffernd_rot.diminfo[0].strides) = 0.0; __pyx_t_29 = 2; @@ -4460,7 +4487,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_29 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 467, __pyx_L1_error) + __PYX_ERR(0, 492, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_29, __pyx_pybuffernd_rot.diminfo[0].strides) = 0.0; __pyx_t_30 = 3; @@ -4471,7 +4498,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_30 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 467, __pyx_L1_error) + __PYX_ERR(0, 492, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_30, __pyx_pybuffernd_rot.diminfo[0].strides) = 0.0; __pyx_t_31 = 5; @@ -4482,7 +4509,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_31 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 467, __pyx_L1_error) + __PYX_ERR(0, 492, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_31, __pyx_pybuffernd_rot.diminfo[0].strides) = 0.0; __pyx_t_32 = 6; @@ -4493,7 +4520,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_32 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 467, __pyx_L1_error) + __PYX_ERR(0, 492, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_32, __pyx_pybuffernd_rot.diminfo[0].strides) = 0.0; __pyx_t_33 = 7; @@ -4504,11 +4531,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_33 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 467, __pyx_L1_error) + __PYX_ERR(0, 492, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_33, __pyx_pybuffernd_rot.diminfo[0].strides) = 0.0; - /* "MDAnalysis/lib/qcprot.pyx":469 + /* "MDAnalysis/lib/qcprot.pyx":494 * rot[1] = rot[2] = rot[3] = rot[5] = rot[6] = rot[7] = 0.0 * * return # <<<<<<<<<<<<<< @@ -4519,7 +4546,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "MDAnalysis/lib/qcprot.pyx":464 + /* "MDAnalysis/lib/qcprot.pyx":489 * qsqr = q1*q1 + q2 *q2 + q3*q3 + q4*q4 * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4528,7 +4555,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ } - /* "MDAnalysis/lib/qcprot.pyx":457 + /* "MDAnalysis/lib/qcprot.pyx":482 * qsqr = q1*q1 + q2 *q2 + q3*q3+q4*q4 * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4537,7 +4564,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ } - /* "MDAnalysis/lib/qcprot.pyx":443 + /* "MDAnalysis/lib/qcprot.pyx":468 * qsqr = q1*q1 + q2 *q2 + q3*q3+q4*q4 * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4546,7 +4573,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ } - /* "MDAnalysis/lib/qcprot.pyx":436 + /* "MDAnalysis/lib/qcprot.pyx":461 * # uncommented, but it is most likely unnecessary. * * if (qsqr < evecprec): # <<<<<<<<<<<<<< @@ -4555,7 +4582,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ } - /* "MDAnalysis/lib/qcprot.pyx":472 + /* "MDAnalysis/lib/qcprot.pyx":497 * * * normq = sqrt(qsqr) # <<<<<<<<<<<<<< @@ -4564,7 +4591,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_normq = sqrt(__pyx_v_qsqr); - /* "MDAnalysis/lib/qcprot.pyx":473 + /* "MDAnalysis/lib/qcprot.pyx":498 * * normq = sqrt(qsqr) * q1 /= normq # <<<<<<<<<<<<<< @@ -4573,11 +4600,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ if (unlikely(__pyx_v_normq == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 473, __pyx_L1_error) + __PYX_ERR(0, 498, __pyx_L1_error) } __pyx_v_q1 = (__pyx_v_q1 / __pyx_v_normq); - /* "MDAnalysis/lib/qcprot.pyx":474 + /* "MDAnalysis/lib/qcprot.pyx":499 * normq = sqrt(qsqr) * q1 /= normq * q2 /= normq # <<<<<<<<<<<<<< @@ -4586,11 +4613,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ if (unlikely(__pyx_v_normq == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 474, __pyx_L1_error) + __PYX_ERR(0, 499, __pyx_L1_error) } __pyx_v_q2 = (__pyx_v_q2 / __pyx_v_normq); - /* "MDAnalysis/lib/qcprot.pyx":475 + /* "MDAnalysis/lib/qcprot.pyx":500 * q1 /= normq * q2 /= normq * q3 /= normq # <<<<<<<<<<<<<< @@ -4599,11 +4626,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ if (unlikely(__pyx_v_normq == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 475, __pyx_L1_error) + __PYX_ERR(0, 500, __pyx_L1_error) } __pyx_v_q3 = (__pyx_v_q3 / __pyx_v_normq); - /* "MDAnalysis/lib/qcprot.pyx":476 + /* "MDAnalysis/lib/qcprot.pyx":501 * q2 /= normq * q3 /= normq * q4 /= normq # <<<<<<<<<<<<<< @@ -4612,11 +4639,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ if (unlikely(__pyx_v_normq == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 476, __pyx_L1_error) + __PYX_ERR(0, 501, __pyx_L1_error) } __pyx_v_q4 = (__pyx_v_q4 / __pyx_v_normq); - /* "MDAnalysis/lib/qcprot.pyx":478 + /* "MDAnalysis/lib/qcprot.pyx":503 * q4 /= normq * * a2 = q1 * q1 # <<<<<<<<<<<<<< @@ -4625,7 +4652,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_a2 = (__pyx_v_q1 * __pyx_v_q1); - /* "MDAnalysis/lib/qcprot.pyx":479 + /* "MDAnalysis/lib/qcprot.pyx":504 * * a2 = q1 * q1 * x2 = q2 * q2 # <<<<<<<<<<<<<< @@ -4634,7 +4661,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_x2 = (__pyx_v_q2 * __pyx_v_q2); - /* "MDAnalysis/lib/qcprot.pyx":480 + /* "MDAnalysis/lib/qcprot.pyx":505 * a2 = q1 * q1 * x2 = q2 * q2 * y2 = q3 * q3 # <<<<<<<<<<<<<< @@ -4643,7 +4670,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_y2 = (__pyx_v_q3 * __pyx_v_q3); - /* "MDAnalysis/lib/qcprot.pyx":481 + /* "MDAnalysis/lib/qcprot.pyx":506 * x2 = q2 * q2 * y2 = q3 * q3 * z2 = q4 * q4 # <<<<<<<<<<<<<< @@ -4652,7 +4679,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_z2 = (__pyx_v_q4 * __pyx_v_q4); - /* "MDAnalysis/lib/qcprot.pyx":483 + /* "MDAnalysis/lib/qcprot.pyx":508 * z2 = q4 * q4 * * xy = q2 * q3 # <<<<<<<<<<<<<< @@ -4661,7 +4688,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_xy = (__pyx_v_q2 * __pyx_v_q3); - /* "MDAnalysis/lib/qcprot.pyx":484 + /* "MDAnalysis/lib/qcprot.pyx":509 * * xy = q2 * q3 * az = q1 * q4 # <<<<<<<<<<<<<< @@ -4670,7 +4697,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_az = (__pyx_v_q1 * __pyx_v_q4); - /* "MDAnalysis/lib/qcprot.pyx":485 + /* "MDAnalysis/lib/qcprot.pyx":510 * xy = q2 * q3 * az = q1 * q4 * zx = q4 * q2 # <<<<<<<<<<<<<< @@ -4679,7 +4706,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_zx = (__pyx_v_q4 * __pyx_v_q2); - /* "MDAnalysis/lib/qcprot.pyx":486 + /* "MDAnalysis/lib/qcprot.pyx":511 * az = q1 * q4 * zx = q4 * q2 * ay = q1 * q3 # <<<<<<<<<<<<<< @@ -4688,7 +4715,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_ay = (__pyx_v_q1 * __pyx_v_q3); - /* "MDAnalysis/lib/qcprot.pyx":487 + /* "MDAnalysis/lib/qcprot.pyx":512 * zx = q4 * q2 * ay = q1 * q3 * yz = q3 * q4 # <<<<<<<<<<<<<< @@ -4697,7 +4724,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_yz = (__pyx_v_q3 * __pyx_v_q4); - /* "MDAnalysis/lib/qcprot.pyx":488 + /* "MDAnalysis/lib/qcprot.pyx":513 * ay = q1 * q3 * yz = q3 * q4 * ax = q1 * q2 # <<<<<<<<<<<<<< @@ -4706,7 +4733,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT */ __pyx_v_ax = (__pyx_v_q1 * __pyx_v_q2); - /* "MDAnalysis/lib/qcprot.pyx":490 + /* "MDAnalysis/lib/qcprot.pyx":515 * ax = q1 * q2 * * rot[0] = a2 + x2 - y2 - z2 # <<<<<<<<<<<<<< @@ -4721,11 +4748,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_34 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 490, __pyx_L1_error) + __PYX_ERR(0, 515, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_34, __pyx_pybuffernd_rot.diminfo[0].strides) = (((__pyx_v_a2 + __pyx_v_x2) - __pyx_v_y2) - __pyx_v_z2); - /* "MDAnalysis/lib/qcprot.pyx":491 + /* "MDAnalysis/lib/qcprot.pyx":516 * * rot[0] = a2 + x2 - y2 - z2 * rot[1] = 2 * (xy + az) # <<<<<<<<<<<<<< @@ -4740,11 +4767,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_35 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 491, __pyx_L1_error) + __PYX_ERR(0, 516, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_35, __pyx_pybuffernd_rot.diminfo[0].strides) = (2.0 * (__pyx_v_xy + __pyx_v_az)); - /* "MDAnalysis/lib/qcprot.pyx":492 + /* "MDAnalysis/lib/qcprot.pyx":517 * rot[0] = a2 + x2 - y2 - z2 * rot[1] = 2 * (xy + az) * rot[2] = 2 * (zx - ay) # <<<<<<<<<<<<<< @@ -4759,11 +4786,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_36 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 492, __pyx_L1_error) + __PYX_ERR(0, 517, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_rot.diminfo[0].strides) = (2.0 * (__pyx_v_zx - __pyx_v_ay)); - /* "MDAnalysis/lib/qcprot.pyx":493 + /* "MDAnalysis/lib/qcprot.pyx":518 * rot[1] = 2 * (xy + az) * rot[2] = 2 * (zx - ay) * rot[3] = 2 * (xy - az) # <<<<<<<<<<<<<< @@ -4778,11 +4805,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_37 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 493, __pyx_L1_error) + __PYX_ERR(0, 518, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_37, __pyx_pybuffernd_rot.diminfo[0].strides) = (2.0 * (__pyx_v_xy - __pyx_v_az)); - /* "MDAnalysis/lib/qcprot.pyx":494 + /* "MDAnalysis/lib/qcprot.pyx":519 * rot[2] = 2 * (zx - ay) * rot[3] = 2 * (xy - az) * rot[4] = a2 - x2 + y2 - z2 # <<<<<<<<<<<<<< @@ -4797,11 +4824,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_38 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 494, __pyx_L1_error) + __PYX_ERR(0, 519, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_rot.diminfo[0].strides) = (((__pyx_v_a2 - __pyx_v_x2) + __pyx_v_y2) - __pyx_v_z2); - /* "MDAnalysis/lib/qcprot.pyx":495 + /* "MDAnalysis/lib/qcprot.pyx":520 * rot[3] = 2 * (xy - az) * rot[4] = a2 - x2 + y2 - z2 * rot[5] = 2 * (yz + ax) # <<<<<<<<<<<<<< @@ -4816,11 +4843,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_39 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 495, __pyx_L1_error) + __PYX_ERR(0, 520, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_39, __pyx_pybuffernd_rot.diminfo[0].strides) = (2.0 * (__pyx_v_yz + __pyx_v_ax)); - /* "MDAnalysis/lib/qcprot.pyx":496 + /* "MDAnalysis/lib/qcprot.pyx":521 * rot[4] = a2 - x2 + y2 - z2 * rot[5] = 2 * (yz + ax) * rot[6] = 2 * (zx + ay) # <<<<<<<<<<<<<< @@ -4835,11 +4862,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_40 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 496, __pyx_L1_error) + __PYX_ERR(0, 521, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_40, __pyx_pybuffernd_rot.diminfo[0].strides) = (2.0 * (__pyx_v_zx + __pyx_v_ay)); - /* "MDAnalysis/lib/qcprot.pyx":497 + /* "MDAnalysis/lib/qcprot.pyx":522 * rot[5] = 2 * (yz + ax) * rot[6] = 2 * (zx + ay) * rot[7] = 2 * (yz - ax) # <<<<<<<<<<<<<< @@ -4854,11 +4881,11 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_41 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 497, __pyx_L1_error) + __PYX_ERR(0, 522, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_41, __pyx_pybuffernd_rot.diminfo[0].strides) = (2.0 * (__pyx_v_yz - __pyx_v_ax)); - /* "MDAnalysis/lib/qcprot.pyx":498 + /* "MDAnalysis/lib/qcprot.pyx":523 * rot[6] = 2 * (zx + ay) * rot[7] = 2 * (yz - ax) * rot[8] = a2 - x2 - y2 + z2 # <<<<<<<<<<<<<< @@ -4873,24 +4900,24 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT } else if (unlikely(__pyx_t_42 >= __pyx_pybuffernd_rot.diminfo[0].shape)) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); - __PYX_ERR(0, 498, __pyx_L1_error) + __PYX_ERR(0, 523, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_rot.rcbuffer->pybuffer.buf, __pyx_t_42, __pyx_pybuffernd_rot.diminfo[0].strides) = (((__pyx_v_a2 - __pyx_v_x2) - __pyx_v_y2) + __pyx_v_z2); - /* "MDAnalysis/lib/qcprot.pyx":500 + /* "MDAnalysis/lib/qcprot.pyx":525 * rot[8] = a2 - x2 - y2 + z2 * * return rms # <<<<<<<<<<<<<< * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyFloat_FromDouble(__pyx_v_rms); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 500, __pyx_L1_error) + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_rms); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 525, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "MDAnalysis/lib/qcprot.pyx":288 + /* "MDAnalysis/lib/qcprot.pyx":313 * return FastCalcRMSDAndRotation(rot, A, E0, N) * * def FastCalcRMSDAndRotation(np.ndarray[np.float64_t, ndim=1] rot, # <<<<<<<<<<<<<< @@ -4924,7 +4951,7 @@ static PyObject *__pyx_pf_10MDAnalysis_3lib_6qcprot_4FastCalcRMSDAndRotation(CYT return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -4972,7 +4999,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * * cdef int i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -4981,7 +5008,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":223 * cdef int i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -4990,7 +5017,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< @@ -4999,7 +5026,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5013,7 +5040,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L4_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":228 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -5024,7 +5051,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5033,7 +5060,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -5046,7 +5073,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 229, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":227 * ndim = PyArray_NDIM(self) * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5055,7 +5082,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5069,7 +5096,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L7_bool_binop_done; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< @@ -5080,7 +5107,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5089,7 +5116,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -5102,7 +5129,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 233, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< @@ -5111,7 +5138,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< @@ -5120,7 +5147,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< @@ -5129,7 +5156,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->ndim = __pyx_v_ndim; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -5139,7 +5166,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":240 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< @@ -5148,7 +5175,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":241 * # This is allocated as one block, strides first. * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< @@ -5157,7 +5184,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< @@ -5169,7 +5196,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< @@ -5178,7 +5205,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":244 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< @@ -5188,7 +5215,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -5198,7 +5225,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P goto __pyx_L9; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< @@ -5208,7 +5235,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":247 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< @@ -5219,7 +5246,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L9:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -5228,7 +5255,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->suboffsets = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":249 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< @@ -5237,7 +5264,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< @@ -5246,7 +5273,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< @@ -5255,7 +5282,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_f = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":254 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< @@ -5267,7 +5294,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * cdef int offset * * info.obj = self # <<<<<<<<<<<<<< @@ -5280,7 +5307,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -5290,7 +5317,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * * if not PyDataType_HASFIELDS(descr): * t = descr.type_num # <<<<<<<<<<<<<< @@ -5300,7 +5327,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5320,7 +5347,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } __pyx_L15_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -5337,7 +5364,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_1 = __pyx_t_2; __pyx_L14_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5346,7 +5373,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ if (unlikely(__pyx_t_1)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -5359,7 +5386,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 263, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * if not PyDataType_HASFIELDS(descr): * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -5368,7 +5395,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< @@ -5380,7 +5407,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"b"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< @@ -5391,7 +5418,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"B"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< @@ -5402,7 +5429,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"h"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< @@ -5413,7 +5440,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"H"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< @@ -5424,7 +5451,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"i"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< @@ -5435,7 +5462,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"I"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< @@ -5446,7 +5473,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"l"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< @@ -5457,7 +5484,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"L"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< @@ -5468,7 +5495,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< @@ -5479,7 +5506,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Q"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< @@ -5490,7 +5517,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"f"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< @@ -5501,7 +5528,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"d"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< @@ -5512,7 +5539,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"g"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":277 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< @@ -5523,7 +5550,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zf"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< @@ -5534,7 +5561,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zd"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< @@ -5545,7 +5572,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_f = ((char *)"Zg"); break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< @@ -5557,7 +5584,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; default: - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -5578,7 +5605,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P break; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< @@ -5587,7 +5614,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_info->format = __pyx_v_f; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< @@ -5597,7 +5624,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_r = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * info.obj = self * * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< @@ -5606,7 +5633,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":286 * return * else: * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< @@ -5616,7 +5643,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /*else*/ { __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":287 * else: * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< @@ -5625,7 +5652,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ (__pyx_v_info->format[0]) = '^'; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format = PyObject_Malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< @@ -5634,7 +5661,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P */ __pyx_v_offset = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":289 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< @@ -5644,7 +5671,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_t_8 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_8 == ((char *)NULL))) __PYX_ERR(1, 289, __pyx_L1_error) __pyx_v_f = __pyx_t_8; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< @@ -5654,7 +5681,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P (__pyx_v_f[0]) = '\x00'; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":215 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< @@ -5686,7 +5713,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -5710,7 +5737,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -5720,7 +5747,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":296 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) # <<<<<<<<<<<<<< @@ -5729,7 +5756,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->format); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":295 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< @@ -5738,7 +5765,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -5748,7 +5775,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":298 * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * PyObject_Free(info.strides) # <<<<<<<<<<<<<< @@ -5757,7 +5784,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ PyObject_Free(__pyx_v_info->strides); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":297 * if PyArray_HASFIELDS(self): * PyObject_Free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< @@ -5766,7 +5793,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< @@ -5778,7 +5805,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -5792,7 +5819,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< @@ -5806,7 +5833,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":775 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< @@ -5825,7 +5852,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -5839,7 +5866,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< @@ -5853,7 +5880,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":778 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< @@ -5872,7 +5899,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -5886,7 +5913,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< @@ -5900,7 +5927,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":781 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< @@ -5919,7 +5946,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -5933,7 +5960,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< @@ -5947,7 +5974,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":784 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< @@ -5966,7 +5993,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -5980,7 +6007,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":788 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< @@ -5994,7 +6021,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __pyx_t_1 = 0; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":787 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< @@ -6013,7 +6040,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -6027,7 +6054,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ int __pyx_t_1; __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -6037,7 +6064,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":792 * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): * return d.subarray.shape # <<<<<<<<<<<<<< @@ -6049,7 +6076,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * * cdef inline tuple PyDataType_SHAPE(dtype d): * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< @@ -6058,7 +6085,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * return d.subarray.shape * else: * return () # <<<<<<<<<<<<<< @@ -6072,7 +6099,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< @@ -6087,7 +6114,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__ return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -6116,7 +6143,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< @@ -6125,7 +6152,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_endian_detector = 1; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< @@ -6134,7 +6161,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -6157,7 +6184,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":806 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< @@ -6174,7 +6201,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":807 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< @@ -6209,7 +6236,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -6226,7 +6253,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -6239,7 +6266,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 810, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":809 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< @@ -6248,7 +6275,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -6268,7 +6295,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L8_next_or:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< @@ -6285,7 +6312,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -6294,7 +6321,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -6307,7 +6334,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 814, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":812 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< @@ -6316,7 +6343,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":824 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< @@ -6332,7 +6359,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":825 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< @@ -6341,7 +6368,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ (__pyx_v_f[0]) = 0x78; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< @@ -6350,7 +6377,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< @@ -6361,7 +6388,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< @@ -6371,7 +6398,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -6381,7 +6408,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< @@ -6393,7 +6420,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -6403,7 +6430,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (unlikely(__pyx_t_6)) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -6416,7 +6443,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 834, __pyx_L1_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< @@ -6425,7 +6452,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< @@ -6443,7 +6470,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< @@ -6461,7 +6488,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< @@ -6479,7 +6506,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< @@ -6497,7 +6524,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< @@ -6515,7 +6542,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< @@ -6533,7 +6560,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":843 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< @@ -6551,7 +6578,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< @@ -6569,7 +6596,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< @@ -6587,7 +6614,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":846 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< @@ -6605,7 +6632,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":847 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< @@ -6623,7 +6650,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":848 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< @@ -6641,7 +6668,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< @@ -6659,7 +6686,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< @@ -6679,7 +6706,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":851 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< @@ -6699,7 +6726,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":852 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< @@ -6719,7 +6746,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":853 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< @@ -6737,7 +6764,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L15; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":855 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< @@ -6756,7 +6783,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L15:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":856 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< @@ -6765,7 +6792,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx */ __pyx_v_f = (__pyx_v_f + 1); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< @@ -6775,7 +6802,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx goto __pyx_L13; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":860 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< @@ -6788,7 +6815,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __pyx_L13:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":805 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< @@ -6798,7 +6825,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":861 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< @@ -6808,7 +6835,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_r = __pyx_v_f; goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * return () * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< @@ -6833,7 +6860,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -6848,7 +6875,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -6859,7 +6886,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< @@ -6868,7 +6895,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_baseptr = NULL; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":979 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< @@ -6878,7 +6905,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a goto __pyx_L3; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":982 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< @@ -6888,7 +6915,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /*else*/ { Py_INCREF(__pyx_v_base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":983 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< @@ -6899,7 +6926,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a } __pyx_L3:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":984 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< @@ -6908,7 +6935,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_XDECREF(__pyx_v_arr->base); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< @@ -6917,7 +6944,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ __pyx_v_arr->base = __pyx_v_baseptr; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -6929,7 +6956,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -6943,7 +6970,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -6953,7 +6980,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< @@ -6964,7 +6991,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< @@ -6973,7 +7000,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * return None * else: * return arr.base # <<<<<<<<<<<<<< @@ -6987,7 +7014,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -7002,7 +7029,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -7023,7 +7050,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -7039,7 +7066,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< @@ -7048,7 +7075,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 998, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -7062,7 +7089,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< @@ -7077,7 +7104,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -7093,7 +7120,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< @@ -7108,7 +7135,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":996 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< @@ -7131,7 +7158,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -7152,7 +7179,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -7168,7 +7195,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1004 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -7177,7 +7204,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1004, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -7191,7 +7218,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1005 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -7206,7 +7233,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -7222,7 +7249,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1003 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -7237,7 +7264,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1002 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -7260,7 +7287,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 +/* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -7281,7 +7308,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -7297,7 +7324,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1010 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< @@ -7306,7 +7333,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1010, __pyx_L3_error) - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -7320,7 +7347,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1011 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -7334,7 +7361,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -7348,7 +7375,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1009 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -7363,7 +7390,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L8_try_end:; } - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -7423,9 +7450,12 @@ static struct PyModuleDef __pyx_moduledef = { #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_s_10_1107_s0108767305015266, __pyx_k_10_1107_s0108767305015266, sizeof(__pyx_k_10_1107_s0108767305015266), 0, 0, 1, 0}, {&__pyx_n_s_A, __pyx_k_A, sizeof(__pyx_k_A), 0, 0, 1, 1}, + {&__pyx_n_s_BibTeX, __pyx_k_BibTeX, sizeof(__pyx_k_BibTeX), 0, 0, 1, 1}, {&__pyx_n_s_C, __pyx_k_C, sizeof(__pyx_k_C), 0, 0, 1, 1}, {&__pyx_n_s_CalcRMSDRotationalMatrix, __pyx_k_CalcRMSDRotationalMatrix, sizeof(__pyx_k_CalcRMSDRotationalMatrix), 0, 0, 1, 1}, + {&__pyx_n_s_Doi, __pyx_k_Doi, sizeof(__pyx_k_Doi), 0, 0, 1, 1}, {&__pyx_n_s_E0, __pyx_k_E0, sizeof(__pyx_k_E0), 0, 0, 1, 1}, {&__pyx_n_s_FastCalcRMSDAndRotation, __pyx_k_FastCalcRMSDAndRotation, sizeof(__pyx_k_FastCalcRMSDAndRotation), 0, 0, 1, 1}, {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, @@ -7434,10 +7464,12 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_G2, __pyx_k_G2, sizeof(__pyx_k_G2), 0, 0, 1, 1}, {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, {&__pyx_n_s_InnerProduct, __pyx_k_InnerProduct, sizeof(__pyx_k_InnerProduct), 0, 0, 1, 1}, - {&__pyx_n_s_MDAnalysis_lib_qcprot, __pyx_k_MDAnalysis_lib_qcprot, sizeof(__pyx_k_MDAnalysis_lib_qcprot), 0, 0, 1, 1}, + {&__pyx_kp_s_MDAnalysis_lib_qcprot, __pyx_k_MDAnalysis_lib_qcprot, sizeof(__pyx_k_MDAnalysis_lib_qcprot), 0, 0, 1, 0}, {&__pyx_kp_s_MDAnalysis_lib_qcprot_pyx, __pyx_k_MDAnalysis_lib_qcprot_pyx, sizeof(__pyx_k_MDAnalysis_lib_qcprot_pyx), 0, 0, 1, 0}, {&__pyx_n_s_N, __pyx_k_N, sizeof(__pyx_k_N), 0, 0, 1, 1}, {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, + {&__pyx_n_s_QCBIB, __pyx_k_QCBIB, sizeof(__pyx_k_QCBIB), 0, 0, 1, 1}, + {&__pyx_kp_s_QCProt_implementation, __pyx_k_QCProt_implementation, sizeof(__pyx_k_QCProt_implementation), 0, 0, 1, 0}, {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s_Sxx, __pyx_k_Sxx, sizeof(__pyx_k_Sxx), 0, 0, 1, 1}, {&__pyx_n_s_Sxx2, __pyx_k_Sxx2, sizeof(__pyx_k_Sxx2), 0, 0, 1, 1}, @@ -7499,16 +7531,21 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_a42, __pyx_k_a42, sizeof(__pyx_k_a42), 0, 0, 1, 1}, {&__pyx_n_s_a43, __pyx_k_a43, sizeof(__pyx_k_a43), 0, 0, 1, 1}, {&__pyx_n_s_a44, __pyx_k_a44, sizeof(__pyx_k_a44), 0, 0, 1, 1}, + {&__pyx_kp_s_article_qcprot2_author_Pu_Liu_a, __pyx_k_article_qcprot2_author_Pu_Liu_a, sizeof(__pyx_k_article_qcprot2_author_Pu_Liu_a), 0, 0, 1, 0}, {&__pyx_n_s_ax, __pyx_k_ax, sizeof(__pyx_k_ax), 0, 0, 1, 1}, {&__pyx_n_s_ay, __pyx_k_ay, sizeof(__pyx_k_ay), 0, 0, 1, 1}, {&__pyx_n_s_az, __pyx_k_az, sizeof(__pyx_k_az), 0, 0, 1, 1}, {&__pyx_n_s_b, __pyx_k_b, sizeof(__pyx_k_b), 0, 0, 1, 1}, + {&__pyx_n_s_cite, __pyx_k_cite, sizeof(__pyx_k_cite), 0, 0, 1, 1}, + {&__pyx_n_s_cite_module, __pyx_k_cite_module, sizeof(__pyx_k_cite_module), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_conf, __pyx_k_conf, sizeof(__pyx_k_conf), 0, 0, 1, 1}, {&__pyx_n_s_coords1, __pyx_k_coords1, sizeof(__pyx_k_coords1), 0, 0, 1, 1}, {&__pyx_n_s_coords2, __pyx_k_coords2, sizeof(__pyx_k_coords2), 0, 0, 1, 1}, {&__pyx_n_s_delta, __pyx_k_delta, sizeof(__pyx_k_delta), 0, 0, 1, 1}, + {&__pyx_n_s_description, __pyx_k_description, sizeof(__pyx_k_description), 0, 0, 1, 1}, {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_due, __pyx_k_due, sizeof(__pyx_k_due), 0, 0, 1, 1}, {&__pyx_n_s_evalprec, __pyx_k_evalprec, sizeof(__pyx_k_evalprec), 0, 0, 1, 1}, {&__pyx_n_s_evecprec, __pyx_k_evecprec, sizeof(__pyx_k_evecprec), 0, 0, 1, 1}, {&__pyx_n_s_float64, __pyx_k_float64, sizeof(__pyx_k_float64), 0, 0, 1, 1}, @@ -7524,6 +7561,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, {&__pyx_n_s_oldg, __pyx_k_oldg, sizeof(__pyx_k_oldg), 0, 0, 1, 1}, + {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1}, {&__pyx_n_s_q1, __pyx_k_q1, sizeof(__pyx_k_q1), 0, 0, 1, 1}, {&__pyx_n_s_q2, __pyx_k_q2, sizeof(__pyx_k_q2), 0, 0, 1, 1}, {&__pyx_n_s_q3, __pyx_k_q3, sizeof(__pyx_k_q3), 0, 0, 1, 1}, @@ -7551,7 +7589,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 198, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 223, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 229, __pyx_L1_error) __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 810, __pyx_L1_error) __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 1000, __pyx_L1_error) @@ -7564,29 +7602,29 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "MDAnalysis/lib/qcprot.pyx":283 + /* "MDAnalysis/lib/qcprot.pyx":308 * """ * cdef double E0 * cdef np.ndarray[np.float64_t, ndim = 1] A = np.zeros(9,dtype = np.float64) # <<<<<<<<<<<<<< * * E0 = InnerProduct(A, conf, ref, N, weights) */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_int_9); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 283, __pyx_L1_error) + __pyx_tuple_ = PyTuple_Pack(1, __pyx_int_9); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 308, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); - /* "MDAnalysis/lib/qcprot.pyx":321 + /* "MDAnalysis/lib/qcprot.pyx":346 * cdef double SxzmSzx, SxymSyx, SxxpSyy, SxxmSyy * * cdef np.ndarray[np.float64_t, ndim=1] C = np.zeros(4,) # <<<<<<<<<<<<<< * cdef unsigned int i * cdef double mxEigenV */ - __pyx_tuple__2 = PyTuple_Pack(1, __pyx_int_4); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 321, __pyx_L1_error) + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_int_4); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< @@ -7597,7 +7635,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< @@ -7608,7 +7646,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -7619,7 +7657,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":810 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< @@ -7630,7 +7668,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< @@ -7641,7 +7679,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< @@ -7652,7 +7690,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< @@ -7663,7 +7701,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1006 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -7674,7 +7712,7 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1012 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< @@ -7683,41 +7721,52 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11); - /* "MDAnalysis/lib/qcprot.pyx":150 + /* "MDAnalysis/lib/qcprot.pyx":157 + * """ + * + * due.cite(Doi("10.1107/s0108767305015266"), # <<<<<<<<<<<<<< + * description="QCProt implementation", + * path="MDAnalysis.lib.qcprot", + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_10_1107_s0108767305015266); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "MDAnalysis/lib/qcprot.pyx":175 * @cython.boundscheck(False) * @cython.wraparound(False) * def InnerProduct(np.ndarray[np.float64_t, ndim=1] A, # <<<<<<<<<<<<<< * np.ndarray[np.float64_t, ndim=2] coords1, * np.ndarray[np.float64_t, ndim=2] coords2, */ - __pyx_tuple__12 = PyTuple_Pack(14, __pyx_n_s_A, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_N, __pyx_n_s_weight, __pyx_n_s_x1, __pyx_n_s_x2, __pyx_n_s_y1, __pyx_n_s_y2, __pyx_n_s_z1, __pyx_n_s_z2, __pyx_n_s_i, __pyx_n_s_G1, __pyx_n_s_G2); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 150, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__12); - __Pyx_GIVEREF(__pyx_tuple__12); - __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(5, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_qcprot_pyx, __pyx_n_s_InnerProduct, 150, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) __PYX_ERR(0, 150, __pyx_L1_error) + __pyx_tuple__13 = PyTuple_Pack(14, __pyx_n_s_A, __pyx_n_s_coords1, __pyx_n_s_coords2, __pyx_n_s_N, __pyx_n_s_weight, __pyx_n_s_x1, __pyx_n_s_x2, __pyx_n_s_y1, __pyx_n_s_y2, __pyx_n_s_z1, __pyx_n_s_z2, __pyx_n_s_i, __pyx_n_s_G1, __pyx_n_s_G2); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(5, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_qcprot_pyx, __pyx_n_s_InnerProduct, 175, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 175, __pyx_L1_error) - /* "MDAnalysis/lib/qcprot.pyx":253 + /* "MDAnalysis/lib/qcprot.pyx":278 * @cython.boundscheck(False) * @cython.wraparound(False) * def CalcRMSDRotationalMatrix(np.ndarray[np.float64_t, ndim=2] ref, # <<<<<<<<<<<<<< * np.ndarray[np.float64_t, ndim=2] conf, * int N, */ - __pyx_tuple__14 = PyTuple_Pack(7, __pyx_n_s_ref, __pyx_n_s_conf, __pyx_n_s_N, __pyx_n_s_rot, __pyx_n_s_weights, __pyx_n_s_E0, __pyx_n_s_A); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__14); - __Pyx_GIVEREF(__pyx_tuple__14); - __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(5, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_qcprot_pyx, __pyx_n_s_CalcRMSDRotationalMatrix, 253, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_tuple__15 = PyTuple_Pack(7, __pyx_n_s_ref, __pyx_n_s_conf, __pyx_n_s_N, __pyx_n_s_rot, __pyx_n_s_weights, __pyx_n_s_E0, __pyx_n_s_A); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(5, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_qcprot_pyx, __pyx_n_s_CalcRMSDRotationalMatrix, 278, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 278, __pyx_L1_error) - /* "MDAnalysis/lib/qcprot.pyx":288 + /* "MDAnalysis/lib/qcprot.pyx":313 * return FastCalcRMSDAndRotation(rot, A, E0, N) * * def FastCalcRMSDAndRotation(np.ndarray[np.float64_t, ndim=1] rot, # <<<<<<<<<<<<<< * np.ndarray[np.float64_t, ndim=1] A, * double E0, int N): */ - __pyx_tuple__16 = PyTuple_Pack(88, __pyx_n_s_rot, __pyx_n_s_A, __pyx_n_s_E0, __pyx_n_s_N, __pyx_n_s_rmsd, __pyx_n_s_Sxx, __pyx_n_s_Sxy, __pyx_n_s_Sxz, __pyx_n_s_Syx, __pyx_n_s_Syy, __pyx_n_s_Syz, __pyx_n_s_Szx, __pyx_n_s_Szy, __pyx_n_s_Szz, __pyx_n_s_Szz2, __pyx_n_s_Syy2, __pyx_n_s_Sxx2, __pyx_n_s_Sxy2, __pyx_n_s_Syz2, __pyx_n_s_Sxz2, __pyx_n_s_Syx2, __pyx_n_s_Szy2, __pyx_n_s_Szx2, __pyx_n_s_SyzSzymSyySzz2, __pyx_n_s_Sxx2Syy2Szz2Syz2Szy2, __pyx_n_s_Sxy2Sxz2Syx2Szx2, __pyx_n_s_SxzpSzx, __pyx_n_s_SyzpSzy, __pyx_n_s_SxypSyx, __pyx_n_s_SyzmSzy, __pyx_n_s_SxzmSzx, __pyx_n_s_SxymSyx, __pyx_n_s_SxxpSyy, __pyx_n_s_SxxmSyy, __pyx_n_s_C, __pyx_n_s_i, __pyx_n_s_mxEigenV, __pyx_n_s_oldg, __pyx_n_s_b, __pyx_n_s_a, __pyx_n_s_delta, __pyx_n_s_rms, __pyx_n_s_qsqr, __pyx_n_s_q1, __pyx_n_s_q2, __pyx_n_s_q3, __pyx_n_s_q4, __pyx_n_s_normq, __pyx_n_s_a11, __pyx_n_s_a12, __pyx_n_s_a13, __pyx_n_s_a14, __pyx_n_s_a21, __pyx_n_s_a22, __pyx_n_s_a23, __pyx_n_s_a24, __pyx_n_s_a31, __pyx_n_s_a32, __pyx_n_s_a33, __pyx_n_s_a34, __pyx_n_s_a41, __pyx_n_s_a42, __pyx_n_s_a43, __pyx_n_s_a44, __pyx_n_s_a2, __pyx_n_s_x2, __pyx_n_s_y2, __pyx_n_s_z2, __pyx_n_s_xy, __pyx_n_s_az, __pyx_n_s_zx, __pyx_n_s_ay, __pyx_n_s_yz, __pyx_n_s_ax, __pyx_n_s_a3344_4334, __pyx_n_s_a3244_4234, __pyx_n_s_a3243_4233, __pyx_n_s_a3143_4133, __pyx_n_s_a3144_4134, __pyx_n_s_a3142_4132, __pyx_n_s_evecprec, __pyx_n_s_evalprec, __pyx_n_s_a1324_1423, __pyx_n_s_a1224_1422, __pyx_n_s_a1223_1322, __pyx_n_s_a1124_1421, __pyx_n_s_a1123_1321, __pyx_n_s_a1122_1221); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 288, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__16); - __Pyx_GIVEREF(__pyx_tuple__16); - __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(4, 0, 88, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_qcprot_pyx, __pyx_n_s_FastCalcRMSDAndRotation, 288, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(0, 288, __pyx_L1_error) + __pyx_tuple__17 = PyTuple_Pack(88, __pyx_n_s_rot, __pyx_n_s_A, __pyx_n_s_E0, __pyx_n_s_N, __pyx_n_s_rmsd, __pyx_n_s_Sxx, __pyx_n_s_Sxy, __pyx_n_s_Sxz, __pyx_n_s_Syx, __pyx_n_s_Syy, __pyx_n_s_Syz, __pyx_n_s_Szx, __pyx_n_s_Szy, __pyx_n_s_Szz, __pyx_n_s_Szz2, __pyx_n_s_Syy2, __pyx_n_s_Sxx2, __pyx_n_s_Sxy2, __pyx_n_s_Syz2, __pyx_n_s_Sxz2, __pyx_n_s_Syx2, __pyx_n_s_Szy2, __pyx_n_s_Szx2, __pyx_n_s_SyzSzymSyySzz2, __pyx_n_s_Sxx2Syy2Szz2Syz2Szy2, __pyx_n_s_Sxy2Sxz2Syx2Szx2, __pyx_n_s_SxzpSzx, __pyx_n_s_SyzpSzy, __pyx_n_s_SxypSyx, __pyx_n_s_SyzmSzy, __pyx_n_s_SxzmSzx, __pyx_n_s_SxymSyx, __pyx_n_s_SxxpSyy, __pyx_n_s_SxxmSyy, __pyx_n_s_C, __pyx_n_s_i, __pyx_n_s_mxEigenV, __pyx_n_s_oldg, __pyx_n_s_b, __pyx_n_s_a, __pyx_n_s_delta, __pyx_n_s_rms, __pyx_n_s_qsqr, __pyx_n_s_q1, __pyx_n_s_q2, __pyx_n_s_q3, __pyx_n_s_q4, __pyx_n_s_normq, __pyx_n_s_a11, __pyx_n_s_a12, __pyx_n_s_a13, __pyx_n_s_a14, __pyx_n_s_a21, __pyx_n_s_a22, __pyx_n_s_a23, __pyx_n_s_a24, __pyx_n_s_a31, __pyx_n_s_a32, __pyx_n_s_a33, __pyx_n_s_a34, __pyx_n_s_a41, __pyx_n_s_a42, __pyx_n_s_a43, __pyx_n_s_a44, __pyx_n_s_a2, __pyx_n_s_x2, __pyx_n_s_y2, __pyx_n_s_z2, __pyx_n_s_xy, __pyx_n_s_az, __pyx_n_s_zx, __pyx_n_s_ay, __pyx_n_s_yz, __pyx_n_s_ax, __pyx_n_s_a3344_4334, __pyx_n_s_a3244_4234, __pyx_n_s_a3243_4233, __pyx_n_s_a3143_4133, __pyx_n_s_a3144_4134, __pyx_n_s_a3142_4132, __pyx_n_s_evecprec, __pyx_n_s_evalprec, __pyx_n_s_a1324_1423, __pyx_n_s_a1224_1422, __pyx_n_s_a1223_1322, __pyx_n_s_a1124_1421, __pyx_n_s_a1123_1321, __pyx_n_s_a1122_1221); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 313, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(4, 0, 88, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_MDAnalysis_lib_qcprot_pyx, __pyx_n_s_FastCalcRMSDAndRotation, 313, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) __PYX_ERR(0, 313, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -7830,8 +7879,8 @@ static int __Pyx_modinit_function_import_code(void) { #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) - #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) +#elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif @@ -7888,6 +7937,9 @@ static int __pyx_pymod_exec_qcprot(PyObject *__pyx_pyinit_module) #endif { PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m && __pyx_m == __pyx_pyinit_module) return 0; @@ -7998,53 +8050,216 @@ if (!__Pyx_RefNanny) { if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 139, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "MDAnalysis/lib/qcprot.pyx":150 + /* "MDAnalysis/lib/qcprot.pyx":142 + * cimport numpy as np + * + * from ..due import due, BibTeX, Doi # <<<<<<<<<<<<<< + * + * # providing DOI for this citation doesnt seem to work (as of 22/04/18) + */ + __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_due); + __Pyx_GIVEREF(__pyx_n_s_due); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_due); + __Pyx_INCREF(__pyx_n_s_BibTeX); + __Pyx_GIVEREF(__pyx_n_s_BibTeX); + PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_BibTeX); + __Pyx_INCREF(__pyx_n_s_Doi); + __Pyx_GIVEREF(__pyx_n_s_Doi); + PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_s_Doi); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_due, __pyx_t_1, 2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_due); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_due, __pyx_t_1) < 0) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_BibTeX); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_BibTeX, __pyx_t_1) < 0) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Doi); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_Doi, __pyx_t_1) < 0) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "MDAnalysis/lib/qcprot.pyx":145 + * + * # providing DOI for this citation doesnt seem to work (as of 22/04/18) + * _QCBIB = """\ # <<<<<<<<<<<<<< + * @article{qcprot2, + * author = {Pu Liu and Dimitris K. Agrafiotis and Douglas L. Theobald}, + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_QCBIB, __pyx_kp_s_article_qcprot2_author_Pu_Liu_a) < 0) __PYX_ERR(0, 145, __pyx_L1_error) + + /* "MDAnalysis/lib/qcprot.pyx":157 + * """ + * + * due.cite(Doi("10.1107/s0108767305015266"), # <<<<<<<<<<<<<< + * description="QCProt implementation", + * path="MDAnalysis.lib.qcprot", + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_due); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_cite); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_Doi); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); + __pyx_t_3 = 0; + + /* "MDAnalysis/lib/qcprot.pyx":158 + * + * due.cite(Doi("10.1107/s0108767305015266"), + * description="QCProt implementation", # <<<<<<<<<<<<<< + * path="MDAnalysis.lib.qcprot", + * cite_module=True) + */ + __pyx_t_3 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_description, __pyx_kp_s_QCProt_implementation) < 0) __PYX_ERR(0, 158, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_path, __pyx_kp_s_MDAnalysis_lib_qcprot) < 0) __PYX_ERR(0, 158, __pyx_L1_error) + + /* "MDAnalysis/lib/qcprot.pyx":160 + * description="QCProt implementation", + * path="MDAnalysis.lib.qcprot", + * cite_module=True) # <<<<<<<<<<<<<< + * due.cite(BibTeX(_QCBIB), + * description="QCProt implementation", + */ + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_cite_module, Py_True) < 0) __PYX_ERR(0, 158, __pyx_L1_error) + + /* "MDAnalysis/lib/qcprot.pyx":157 + * """ + * + * due.cite(Doi("10.1107/s0108767305015266"), # <<<<<<<<<<<<<< + * description="QCProt implementation", + * path="MDAnalysis.lib.qcprot", + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 157, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "MDAnalysis/lib/qcprot.pyx":161 + * path="MDAnalysis.lib.qcprot", + * cite_module=True) + * due.cite(BibTeX(_QCBIB), # <<<<<<<<<<<<<< + * description="QCProt implementation", + * path="MDAnalysis.lib.qcprot", + */ + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_due); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_cite); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_BibTeX); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_QCBIB); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); + __pyx_t_1 = 0; + + /* "MDAnalysis/lib/qcprot.pyx":162 + * cite_module=True) + * due.cite(BibTeX(_QCBIB), + * description="QCProt implementation", # <<<<<<<<<<<<<< + * path="MDAnalysis.lib.qcprot", + * cite_module=True) + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 162, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_description, __pyx_kp_s_QCProt_implementation) < 0) __PYX_ERR(0, 162, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_path, __pyx_kp_s_MDAnalysis_lib_qcprot) < 0) __PYX_ERR(0, 162, __pyx_L1_error) + + /* "MDAnalysis/lib/qcprot.pyx":164 + * description="QCProt implementation", + * path="MDAnalysis.lib.qcprot", + * cite_module=True) # <<<<<<<<<<<<<< + * + * + */ + if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_cite_module, Py_True) < 0) __PYX_ERR(0, 162, __pyx_L1_error) + + /* "MDAnalysis/lib/qcprot.pyx":161 + * path="MDAnalysis.lib.qcprot", + * cite_module=True) + * due.cite(BibTeX(_QCBIB), # <<<<<<<<<<<<<< + * description="QCProt implementation", + * path="MDAnalysis.lib.qcprot", + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "MDAnalysis/lib/qcprot.pyx":175 * @cython.boundscheck(False) * @cython.wraparound(False) * def InnerProduct(np.ndarray[np.float64_t, ndim=1] A, # <<<<<<<<<<<<<< * np.ndarray[np.float64_t, ndim=2] coords1, * np.ndarray[np.float64_t, ndim=2] coords2, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6qcprot_1InnerProduct, NULL, __pyx_n_s_MDAnalysis_lib_qcprot); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 150, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_InnerProduct, __pyx_t_1) < 0) __PYX_ERR(0, 150, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6qcprot_1InnerProduct, NULL, __pyx_kp_s_MDAnalysis_lib_qcprot); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_InnerProduct, __pyx_t_4) < 0) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/qcprot.pyx":253 + /* "MDAnalysis/lib/qcprot.pyx":278 * @cython.boundscheck(False) * @cython.wraparound(False) * def CalcRMSDRotationalMatrix(np.ndarray[np.float64_t, ndim=2] ref, # <<<<<<<<<<<<<< * np.ndarray[np.float64_t, ndim=2] conf, * int N, */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6qcprot_3CalcRMSDRotationalMatrix, NULL, __pyx_n_s_MDAnalysis_lib_qcprot); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_CalcRMSDRotationalMatrix, __pyx_t_1) < 0) __PYX_ERR(0, 253, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6qcprot_3CalcRMSDRotationalMatrix, NULL, __pyx_kp_s_MDAnalysis_lib_qcprot); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_CalcRMSDRotationalMatrix, __pyx_t_4) < 0) __PYX_ERR(0, 278, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "MDAnalysis/lib/qcprot.pyx":288 + /* "MDAnalysis/lib/qcprot.pyx":313 * return FastCalcRMSDAndRotation(rot, A, E0, N) * * def FastCalcRMSDAndRotation(np.ndarray[np.float64_t, ndim=1] rot, # <<<<<<<<<<<<<< * np.ndarray[np.float64_t, ndim=1] A, * double E0, int N): */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6qcprot_5FastCalcRMSDAndRotation, NULL, __pyx_n_s_MDAnalysis_lib_qcprot); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 288, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_FastCalcRMSDAndRotation, __pyx_t_1) < 0) __PYX_ERR(0, 288, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = PyCFunction_NewEx(&__pyx_mdef_10MDAnalysis_3lib_6qcprot_5FastCalcRMSDAndRotation, NULL, __pyx_kp_s_MDAnalysis_lib_qcprot); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 313, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FastCalcRMSDAndRotation, __pyx_t_4) < 0) __PYX_ERR(0, 313, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "MDAnalysis/lib/qcprot.pyx":1 * # ----------------------------------------------------------------------------- # <<<<<<<<<<<<<< * # Author(s) of Original Implementation: * # Douglas L. Theobald */ - __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_4) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "../../../miniconda2/envs/mda3/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 + /* "../../../miniconda3/envs/mda/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1008 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -8057,6 +8272,9 @@ if (!__Pyx_RefNanny) { goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init MDAnalysis.lib.qcprot", 0, __pyx_lineno, __pyx_filename); @@ -9337,7 +9555,7 @@ static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 *type = tstate->exc_state.exc_type; *value = tstate->exc_state.exc_value; *tb = tstate->exc_state.exc_traceback; @@ -9352,7 +9570,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -9436,7 +9654,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE - #if PY_VERSION_HEX >= 0x030700A2 + #if PY_VERSION_HEX >= 0x030700A3 tmp_type = tstate->exc_state.exc_type; tmp_value = tstate->exc_state.exc_value; tmp_tb = tstate->exc_state.exc_traceback; @@ -9533,6 +9751,20 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) return module; } +/* ImportFrom */ + static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_line) { @@ -9541,6 +9773,9 @@ static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_li #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); @@ -10805,14 +11040,42 @@ static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, return res; } #endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i

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